gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:18:37 27 4
gpt4 key购买 nike

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

  1. 我尝试增加超时:

TimeSpan 间隔 = 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() 会抛出异常。页面已加载,我可以手动单击该元素,但 FindElement() 找不到它。如果我重新运行测试,这一步可以毫无问题地通过,并且只会在下一次切换或进一步切换时失败。这是不可预测的。

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

最佳答案

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

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);
}

关于java - Internet Explorer 8-10 中的 Selenium WebDriver 窗口切换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7257381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com