首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Internet 8-10中的Selenium WebDriver窗口切换问题

Internet 8-10中的Selenium WebDriver窗口切换问题
EN

Stack Overflow用户
提问于 2011-08-31 13:12:27
回答 3查看 9.4K关注 0票数 4

我发现了一个问题,试图使用Selenium WebDriver来测试我们的应用程序。问题是在不稳定的弹出框集中在IE9。它并不总是可复制的,它发生在大约20%的窗口切换,但使得在IE上的测试几乎不可能。在FireFox中,一切都是完美的。

  1. I试图增加超时:

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

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

对于(int x= 0;x <= waitTimeOut;x++) { try {<==<=返回元素;} catch{}

  • ,在查找元素之前尝试使用CssSelecotrs

  • Try进行一些重新转换:

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

如果出现问题,它总是只发生在我试图在页面上找到的第一个元素中。如果找到该元素,则在此页面中查找其他元素没有任何问题。所以我决定问题是集中注意力。

调试器中的Windows句柄将正确显示。例如,如果我切换到第三个窗口,driver.CurrentWindowHandle会给出第三个窗口的正确句柄。但是,如果我试图找到任何元素,FindElement()就会抛出一个异常。页面已经加载,我可以手动单击元素,但是FindElement()找不到它。如果我重新运行测试,这一步骤可以通过,没有任何问题,只有在下一次切换或进一步失败。这是不可预测的。

出现这种问题的原因是什么?

EN

回答 3

Stack Overflow用户

发布于 2011-09-07 10:49:30

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

代码语言:javascript
复制
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;
}

上述函数的用法如下所示:

代码语言:javascript
复制
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);
}
票数 11
EN

Stack Overflow用户

发布于 2016-04-21 05:45:56

如果是IE11,则修改HKLM_CURRENT_USER\Software\Microsoft\Internet资源管理器\主路径应该包含具有0值的键TabProcGrowth。

票数 1
EN

Stack Overflow用户

发布于 2014-02-26 16:45:42

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7257381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档