Internet Explorer 8-10中的Selenium WebDriver Windows切换问题

我发现尝试使用Selenium WebDriver来测试我们的应用程序时遇到了问题。 问题在于IE9中不稳定的弹出窗口。 它并不总是可重现的,它发生在大约20%的窗口切换中,但几乎不可能在IE上进行测试。 在FireFox中,一切都很完美。

  1. 我尝试增加超时:

TimeSpan interval = new TimeSpan(0, 0, 10); driver.Manage().Timeouts().ImplicitlyWait(interval);

  1. 为对象查找创建自己的方法:

      for (int x = 0; x <= waitTimeOut; x++) { try { element = (IWebElement)driver.FindElement(By.XPath(obj.Xpath)); return element; } catch{} } 
  2. 尝试使用CssSelecotrs

  3. 在找到元素之前尝试进行一些重新切换:

    driver.SwitchTo().Window(GetWindowHandle(2, 1)); driver.SwitchTo().Window(GetWindowHandle(0, 1)); driver.SwitchTo().Window(GetWindowHandle(2, 1));

如果出现问题,它始终只发生在我尝试在页面上找到的第一个元素。 如果找到元素,则在此页面上查找其他元素没有任何问题。 所以我认为问题在于聚焦。

调试器中的Windows句柄正确显示。 例如,如果我切换到第三个窗口,driver.CurrentWindowHandle给我第三个窗口的正确句柄。 但是如果我试图找到任何元素,FindElement()会抛出exception。 页面已加载,我可以手动单击该元素,但FindElement()无法找到它。 如果我重新运行测试,则可以毫无问题地通过此步骤,并且仅在下一次切换或更进一步时失败。 这是不可预测的。

这样的问题可能是什么原因?

使用IE驱动程序,无法保证窗口在集合中的显示顺序。 也就是说,集合中的第0个窗口不一定是会话打开的第一个窗口。 鉴于这种情况,您需要执行以下操作:

 private string FindNewWindowHandle(IWebDriver driver, IList existingHandles, int timeout) { string foundHandle = string.Empty; DateTime endTime = DateTime.Now.Add(TimeSpan.FromSeconds(timeout)); while (string.IsNullOrEmpty(foundHandle) && DateTime.Now < endTime) { IList currentHandles = driver.WindowHandles; if (currentHandles.Count != existingHandles.Count) { foreach (string currentHandle in currentHandles) { if (!existingHandles.Contains(currentHandle)) { foundHandle = currentHandle; break; } } } if (string.IsNullOrEmpty(foundHandle)) { System.Threading.Thread.Sleep(250); } } // Note: could optionally check for handle found here and throw // an exception if no window was found. return foundHandle; } 

上述function的用法如下:

 IList handles = driver.WindowHandles; // do whatever you have to do to invoke the popup element.Click(); string popupHandle = FindNewWindowHandle(driver, handles, 10); if (!string.IsNullOrEmpty(popupHandle)) { driver.SwitchTo().Window(popupHandle); } 

如果是IE11,请修改HKLM_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \主路径应包含带有0值的键TabProcGrowth。

 String currentWindowHandle = driver.getWindowHandle(); driver.findElement(By.cssSelector(locator)).click(); Set windows = driver.getWindowHandles(); for (String window : windows) { if (!window.equals(currentWindowHandle)) { driver.switchTo().window(window); driver.close(); } } driver.switchTo().window(currentWindowHandle);