Selenium IE WebDriver solo funciona mientras se depura

Estoy usando Java Gradle, Selenium 3.8.0 e IEWebDriver 3.8.0.

Chrome y Firefox funcionan bien, pero IE arroja una org.openqa.selenium.TimeoutException: Expected condition failed Exception, aunque IE también funciona bien, si depuro mi código fuente paso a paso.

Por lo tanto, debuve mucho tiempo para encontrar ese problema y noté que IE pierde la conexión entre WebDriver y el código fuente, cada vez que se webDriver.get(..) un webDriver.get(..) , que se ve así:

 driver.get(url); waitForPageLoaded(driver); 

Por eso, supongo que hay algunos problemas de sincronización, pero ya traté de manejar esto:

 public void waitForPageLoaded(WebDriver driver) { logger.debug("Wait until the page was loaded."); // IE seems to fail here. new WebDriverWait(driver, SeleniumConfigurator.TIME_OUT) .until(d -> ((JavascriptExecutor)d).executeScript("return document.readyState") .equals("complete")); } 

Luego noté que IE necesita algunas configuraciones más, pero no tengo permiso para configurar algunas de ellas: restricciones de TI -> No puedo cambiar las entradas de regedit.

PERO, ¿por qué funciona bien, mientras depura?

Esta es mi configuración de IE:

 case IE: path = "../../../../../../resources/driver/win/IEDriverServer_32_v3-8-0.exe"; url = getClass().getResource(path); if (url == null) { logger.error("Could not find the Internet Explorer web driver binary at " + path + " ." + "All test for this browser will be ignored."); currentBrowserType = BrowserType.UNDEFINED; break; } try { System.setProperty("webdriver.ie.driver", Paths.get(url.toURI()).toFile().getAbsolutePath()); } catch (URISyntaxException e) { e.printStackTrace(); } // https://sqa.stackexchange.com/questions/13077/unable-to-run-selenium-webdriver-script-in-ie11 InternetExplorerOptions optionsIE = new InternetExplorerOptions(); optionsIE.setCapability(InternetExplorerDriver.IE_ENSURE_CLEAN_SESSION, true); optionsIE.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true); optionsIE.withAttachTimeout(SeleniumConfigurator.TIME_OUT, TimeUnit.SECONDS); //optionsIE.setCapability(InternetExplorerDriver.REQUIRE_WINDOW_FOCUS, true); webDriver = new InternetExplorerDriver(optionsIE); currentBrowserType = BrowserType.IE; break; 

No tengo idea de qué está pasando aquí …

La primera prueba funciona bien, luego aparece la excepción de tiempo de espera (eche un vistazo al comentario):

 @Test public void test_Contact() { Init(); util.logTestStart("Test contact on index page.."); String xPath = "//*[@id='contact-link']/a"; WebElement element = webDriver.findElement(By.xpath(xPath)); Assert.assertEquals(element.getAttribute("href"), "mailto:what@ever.com"); } @Test public void test_LegalInformation() { Init(); util.logTestStart("Test legal information on index page.."); String xPath = "//*[@id='link-highlighted']/a"; util.aTagClickByXPath(webDriver, xPath); Assert.assertEquals(webDriver.getCurrentUrl(), "http://whatever.com/"); } private void Init() { if (configurator == null) { configurator = SeleniumConfigurator.getInstance(); } if (webDriver != configurator.getWebDriver()) { webDriver = configurator.getWebDriver(); } if (util == null) { util = new SeleniumTestUtil(); } // Open localhost as default util.goTo(webDriver, "http://localhost:8080/de/index"); } public void aTagClickByXPath(WebDriver driver, String xPath) { logger.debug("Performing a click on an a-Tag, xPath: " + xPath); WebElement element = driver.findElement(By.xpath(xPath)); element.click(); // First click works, second one fails, cause of Timeout Exception waitForPageLoaded(driver); } 

¿Alguien tiene una pista?

EDITAR:

org.openqa.selenium.NoSuchWindowException: Unable to get browser por el momento. Timeout Exception ya no aparece. No cambié nada.

EDIT2:

Más información:

Nodo:

  

Definición de tiempo de espera:

 public static final int TIME_OUT = 15; 

Hay un par de hechos que quizás deba considerar de la siguiente manera:

  • En primer lugar, la function() como public void waitForPageLoaded(WebDriver driver) me parece una sobrecarga pura. Básicamente, no es necesario escribir una función de contenedor separado encima de WebDriverWait
  • Según la implementación actual de WebDriverWait en Selenium v3.8.1 los constructores son los siguientes:

     WebDriverWait(WebDriver driver, Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut) WebDriverWait(WebDriver driver, long timeOutInSeconds) WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis) 

No está muy claro cómo ha implementado WebDriverWait(driver, SeleniumConfigurator.TIME_OUT) . Los argumentos parecen propensos a errores.

Nuevamente, la condición hasta d -> ((JavascriptExecutor)d).executeScript("return document.readyState").equals("complete") es una sobrecarga porque el Client (es decir, el Web Browser ) nunca devolverá el control a la instancia de WebDriver hasta y a menos que ‘document.readyState’ sea ​​igual a “completo” . Una vez que se cumple esta condición, Selenium realiza la siguiente línea de código. Por lo tanto, esta función de Boolean org.openqa.selenium.support.ui.FluentWait.until(Function arg0) no tiene ningún impacto.

Vale la pena mencionar que aunque el Client (es decir, el Web Browser ) puede devolver el control a la instancia de WebDriver una vez que se logra ‘document.readyState’ igual a “completo” , no indica que todos los elementos WebElements en el nuevo HTML DOM son VISIBLE , INTERACTABLE y CLICKABLE .

  • Finalmente, para abordar su problema principal, necesitaba una aclaración sobre el nodo xPath = "//*[@id='link-highlighted']/a" para asegurar que al invocar click() abre una nueva pestaña o se redirige la url. No veo que manejes ninguno de los casos.

Solución

  • Al tratar con InternetExplorer , tenga en cuenta que InternetExplorerDriver ejecuta en un navegador real y es compatible con Javascript.
  • Establezca el enfoque del navegador a través de:

     capabilities.setCapability("requireWindowFocus", true); 
  • Si el click() abre una nueva ventana, cambie window_handles