我发现了一个问题,试图使用Selenium WebDriver来测试我们的应用程序。问题是在不稳定的弹出框集中在IE9。它并不总是可复制的,它发生在大约20%的窗口切换,但使得在IE上的测试几乎不可能。在FireFox中,一切都是完美的。
TimeSpan interval = new TimeSpan(0, 0, 10); driver.Manage().Timeouts().ImplicitlyWait(interval);
对于(int x= 0;x <= waitTimeOut;x++) { try {<==<=返回元素;} catch{}
driver.SwitchTo().Window(GetWindowHandle(2, 1)); driver.SwitchTo().Window(GetWindowHandle(0, 1)); driver.SwitchTo().Window(GetWindowHandle(2, 1));
如果出现问题,它总是只发生在我试图在页面上找到的第一个元素中。如果找到该元素,则在此页面中查找其他元素没有任何问题。所以我决定问题是集中注意力。
调试器中的Windows句柄将正确显示。例如,如果我切换到第三个窗口,driver.CurrentWindowHandle会给出第三个窗口的正确句柄。但是,如果我试图找到任何元素,FindElement()就会抛出一个异常。页面已经加载,我可以手动单击元素,但是FindElement()找不到它。如果我重新运行测试,这一步骤可以通过,没有任何问题,只有在下一次切换或进一步失败。这是不可预测的。
出现这种问题的原因是什么?
发布于 2011-09-07 10:49:30
使用IE驱动程序,不能保证窗口在集合中的出现顺序。也就是说,集合中的第0窗口不一定是会话打开的第一个窗口。在这种情况下,您需要执行如下操作:
private string FindNewWindowHandle(IWebDriver driver, IList<string> existingHandles, int timeout)
{
string foundHandle = string.Empty;
DateTime endTime = DateTime.Now.Add(TimeSpan.FromSeconds(timeout));
while (string.IsNullOrEmpty(foundHandle) && DateTime.Now < endTime)
{
IList<string> 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;
}上述函数的用法如下所示:
IList<string> 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);
}发布于 2016-04-21 05:45:56
如果是IE11,则修改HKLM_CURRENT_USER\Software\Microsoft\Internet资源管理器\主路径应该包含具有0值的键TabProcGrowth。
发布于 2014-02-26 16:45:42
String currentWindowHandle = driver.getWindowHandle();
driver.findElement(By.cssSelector(locator)).click();
Set<String> windows = driver.getWindowHandles();
for (String window : windows) {
if (!window.equals(currentWindowHandle)) {
driver.switchTo().window(window);
driver.close();
}
}
driver.switchTo().window(currentWindowHandle);https://stackoverflow.com/questions/7257381
复制相似问题