C# 中的 WebDriver(使用 Windows 和同步)

发布于 2024-12-07 17:49:29 字数 520 浏览 0 评论 0原文

我在 #IE9 中使用 webDriver 并发现一个问题。如果我在运行模式下开始测试,那么所有测试都会失败,因为 webDriver 不存在(即两个窗口),但如果我在测试中放置断点并启动测试调试模式,我已经通过了所有测试。请告诉我,该怎么办,因为我不知道。 这是我的代码:

private void MyMethods(IWebdriver driver)
{

    foreach (var item in driver.WindowHandles) // if I put breakpoint, I see 2 count Window Handles else this methods don't work.
    {
        if (driver.SwitchTo().Window(item).Title == "PortalSubMenuPopupForm")
        {
            driver.SwitchTo().Window(item);
            break;
        }
    }
}

I work with webDriver in #IE9 and I find one problem. If I started tests in Run mode, then all test fail because webDriver not exists (two window ie), but if I put breakpoint in tests and start tests Debug mode I have passed all tests. Please tell me, what do, because I don't know.
This my code:

private void MyMethods(IWebdriver driver)
{

    foreach (var item in driver.WindowHandles) // if I put breakpoint, I see 2 count Window Handles else this methods don't work.
    {
        if (driver.SwitchTo().Window(item).Title == "PortalSubMenuPopupForm")
        {
            driver.SwitchTo().Window(item);
            break;
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

甜嗑 2024-12-14 17:49:29

Selenium 与 IE 存在一个“问题”,即新窗口可能不会立即出现在 WindowHandles 列表中。

解决方案是

  • 在调用 driver.WindowHandles 之前等待固定时间

,或者

  • 使用 WebDriverWait等待 WindowHandles 下的元素数量发生变化

我认为第二个更强大。这是一个快速实现:

public void LaunchNewWindow(IWebElement element)
{
    int windowsBefore = driver.WindowHandles.Count;
    element.Click();

    TimeSpan timeout = new TimeSpan(0, 0, 10);
    WebDriverWait wait = new WebDriverWait(driver, timeout);

    wait.Until((_driver) =>
    {
        return _driver.WindowHandles.Count != windowsBefore;
        //optionally use _driver.WindowHandles.Count > windowsBefore
    });
}

现在您可以像这样使用该函数:

IWebElement clickMe = //some element that launches a new window

LaunchNewWindow(clickMe);
foreach (var item in driver.WindowHandles)
{
   //etc.
}

Selenium has an "issue" with IE where new windows might not appear on the WindowHandles list right away.

The solution is either

  • wait a fixed amount of time before calling driver.WindowHandles

or

  • use the WebDriverWait class to wait for the number of elements under WindowHandles to change

I think the second one is more robust. Here is a quick implementation:

public void LaunchNewWindow(IWebElement element)
{
    int windowsBefore = driver.WindowHandles.Count;
    element.Click();

    TimeSpan timeout = new TimeSpan(0, 0, 10);
    WebDriverWait wait = new WebDriverWait(driver, timeout);

    wait.Until((_driver) =>
    {
        return _driver.WindowHandles.Count != windowsBefore;
        //optionally use _driver.WindowHandles.Count > windowsBefore
    });
}

Now you can use the function like so:

IWebElement clickMe = //some element that launches a new window

LaunchNewWindow(clickMe);
foreach (var item in driver.WindowHandles)
{
   //etc.
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文