selenium - example - FirefoxDriver webdriver.load.strategy findelements inestables que obtienen elementos de la página incorrecta
selenium webdriver java example (1)
Estoy usando FirefoxDriver en una aplicación que se mueve rápidamente a través de varias páginas similares pero no idénticas. Para acelerar la ejecución (necesito usar FF), establezco la propiedad webdriver.load.strategy en ''inestable''. Esto de hecho acelera las cosas al no cargar completamente las páginas, pero encontré un error muy extraño.
Al examinar el archivo con la lista de páginas y los datos que contienen, encontré que algunas páginas se combinaron con los datos incorrectos. Cuando depuré, todo funcionó bien mientras daba un paso, pero tan pronto como dejé que el programa se ejecutara, incluso para algunas páginas, comenzó a obtener datos de la página equivocada nuevamente. (Para aclarar, por ejemplo, si hago un driver.get(www.google.com)
, seguido de driver.get(www.stackoverflow.com)
, y luego driver.findElements()
para obtener el título de la página de StackOverflow, se devolverá "Google")
Cuando observaba de cerca el navegador en ejecución, me pareció que había una discrepancia entre las direcciones URL en el cuadro de URL y las páginas que realmente se muestran. Las URL estaban cambiando mucho más rápido que la página. Sospecho que lo que está sucediendo es que el controlador no está esperando hasta que la página esté completamente cargada antes de llamar a findElements y, por lo tanto, obtiene elementos de la página anterior, que tienen los mismos nombres de clase.
Esto tiene sentido dado lo que se supone que webdriver.load.strategy ''stable'' hace, pero configuro un elemento Wait en la página y no parece estar esperando. ¿Puede ser porque cada página tiene el mismo elemento, por lo que el elemento ya estaba visible? No puedo esperar para nada más porque todas las páginas tienen la misma configuración: solo el texto individual es diferente, y no sé qué será de antemano.
¿Alguien ha encontrado este problema? ¿Mi suposición sobre qué está causando el problema es correcta? ¿Hay algo que pueda hacer al respecto más allá de eliminar la estrategia de carga inestable?
Gracias, bsg EDIT Estoy agregando algo de código, aunque el código funciona perfectamente cuando webdriver.load.strategy ''stable'' no está configurado.
for(String url : urllist)
{
driver.get(url);
WebElement header = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.tagName("h1")));
elements = driver.findElements(By.className(elementclassname));
}
Tenga en cuenta que hay un h1 y varios elementos con class = elementclassname en cada página.
Sospecho que lo que está sucediendo es que el controlador no está esperando hasta que la página esté completamente cargada antes de llamar a findElements y, por lo tanto, obtiene elementos de la página anterior, que tienen los mismos nombres de clase.
Creo que tu hipótesis es correcta.
Casi lo mismo está escrito en la descripción de la estrategia unstable
:
Hay una función beta para hacer que Firefox no espere a que se cargue la página completa después de llamar a .get o .click. Esto puede hacer que los hallazgos inmediatos se rompan, así que asegúrese de usar también una espera implícita o explícita.
Como solución temporal (no muy buena), puede referir el driver
a una página que no contenga el elemento en presenceOfElementLocated()
(p. Ej., Página en blanco).
Algo como:
for(String url : urllist)
{
driver.get(url);
WebElement header = (new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.tagName("h1")));
elements = driver.findElements(By.className(elementclassname));
driver.get("about:blank"); // <<<<<<<<<<
}
Entonces, cuando el driver
llegue a una nueva url
, habrá una página en blanco y deberá esperar que aparezca un elemento en la página.