Red de conocimiento informático - Conocimiento informático - Cómo esperar a que los elementos de la página terminen de cargarse

Cómo esperar a que los elementos de la página terminen de cargarse

En Selenium-webdriver, tenemos dos formas de espera: espera explícita y espera implícita.

Espera explícita

Espera explícita significa esperar a que ocurra una condición específica antes de que el código ejecute el siguiente paso. El peor de los casos es utilizar Thread.sleep() para establecer un tiempo de espera para la confirmación. Pero ¿por qué es este el peor de los casos? Debido a que el tiempo de carga de un elemento puede ser largo o corto, debe comprender la duración antes de configurar el tiempo de suspensión. Si es demasiado corto, se agotará fácilmente y si es demasiado largo, será una pérdida de tiempo. Selenium webdriver proporciona algunos métodos para ayudarnos a esperar exactamente cuánto tiempo debemos esperar. Puede hacer esto usando la clase WebDriverWait y la interfaz ExpectedCondition.

El siguiente código html implementa un efecto en el que aparecerá un bloque div rojo en la página 5 segundos después de hacer clic en el botón. Necesitamos escribir un script automatizado para capturar este div tal como aparece y luego resaltarlo.

Esperar.html

lt;htmlgt;

lt;headgt;

lt;titlegt;Establecer tiempo de esperalt;/titlegt;

lt; stylegt;

.red_ box {color de fondo: rojo; ancho = 20; alto: 100px; borde: ninguno;}

lt;/ stylegt;

lt;scriptgt;

función show_div(){

setTimeout("create_div()", 5000);

}

función create_div(){

d = document.className = "red_box";

document.body.

appendChild(d);

}

lt;/scriptgt;

lt;/headgt;

lt;bodygt;

lt; ID del botón = "b" nclick = "show_div()"gt;/buttongt;

lt;/bodygt;

lt;/htmlgt;

El siguiente código implementa la función de resaltar bloques div generados dinámicamente:

import org.WebDriver;

import org.openqa.selenium.WebElement;

importar org.openqa.selenium.firefox.WebDriverWait;

clase pública WaitForSomthing {

/**

* @author gongjf

*/

public static void main(String[] args) {

// TODO fragmento de método generado automáticamente

System.System.System. .System.System.System.System.System.System.System.System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");

WebDriver dr = new FirefoxDriver();

String url = "file:///C:/Documentos y configuraciones/gongjf/desktop/selenium_test/Wait.html" // "/Tu /Path/to/Wait.html"

dr.get(url);

WebDriverWait espera = nuevo WebDriverWait(dr, 10);

espera.

hasta (new ExpectedConditionlt; WebElementgt; () {

@Override

WebElement público apply(WebDriver d) {

return d.findElement(By.id( "b"));

}}).click();

Elemento WebElement = dr.findElement(By.css);

get(url );

WebDriverWait = nuevo WebDriverWait(dr, 10);

wait.findElement(By.cssSelector(".red_box"));

(( JavascriptExecutor)dr).executeScript("arguments[0].style.border =\"5px amarillo sólido\"",element);

}

}

}

El constructor de la clase WebDriverWait en el código anterior acepta un objeto WebDriver y el tiempo máximo de espera (10 segundos). Luego llama al método hasta, que anula el método de aplicación en la interfaz ExpectedCondition, devuelve un WebElement (el elemento cargado) y luego hace clic en el elemento. De forma predeterminada, WebDriverWait llama a ExpectedCondition cada 500 milisegundos hasta que regresa con éxito. Por supuesto, si no regresa con éxito después de exceder el valor establecido, se generará una excepción.

Espera implícita

La espera implícita se utiliza para indicarle a WebDriver que cuando se encuentra un elemento y el elemento no aparece inmediatamente, se debe consultar al Dom dentro de un cierto período de tiempo. . El valor predeterminado es 0, pero cuando se establece, este tiempo será válido durante toda la vida útil de la instancia del objeto WebDriver.

support.ui.WebDriverWait;

clase pública WaitForSomthing {

/**

* @author gongjf

*/

public static void main( String[] args) {

//TODO genera automáticamente un código auxiliar de método

System.setProperty("webdriver.firefox.bin", "D :\Archivos de programa\\Mozilla Firefox\\firefox.exe");

WebDriver dr = new FirefoxDriver();

//Establecer 10 segundos

dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

String url = "file:///C:/Documents and Settings/gongjf/desktop/selenium_test/Wait. html"; // "/Su/Ruta/a/Wait.html"

dr.manage(.timeouts().implicitlyWait(10, TimeUnit.get(url);

//Comentar el original

/*WebDriverWait wait = new WebDriverWait(dr, 10);

wait.until(new ExpectedConditionlt.WebElementgt;(){

@Override

public WebElement apply(WebDriver d) {

return d.findElement(By.id("b"));

} }).click( );*/

dr.findElement(By.id("b")).click();

Elemento WebElement = dr.findElement(By. id("b")).click();

CssSelector(" ")(){

).click()cssSelector(".red_box"));

p>

((((JavascriptExecutor)dr).executeScript("argumentos[0].style.border =\"5px amarillo sólido\"",elemento);

}

}

Elige uno de los dos, el segundo parece funcionar de una vez por todas. Jaja