0

场景:我已经配置了Grid 2,多个测试现在并行运行。当测试开始时,会打开浏览器窗口(仅打开一个选项卡)并在其中填充一些控件。之后,我打开另一个选项卡(在同一个浏览器窗口中),切换到它并在其中填充一些控件。

在第二个选项卡中填充数据之前,需要完成以下步骤:
1.通过调用打开新选项卡SendKeys(Keys.Ctrl + 't')
2.在切换到第二个选项卡之前,等待第二个选项卡的句柄添加到驱动程序实例。
3.如果句柄添加到驱动程序实例然后切换到它,否则 4.
4.重复操作 2. 和 3. 直到超时。

问题: 调试时我注意到打开一个新选项卡时,它的句柄没有添加到driver.WindowHandles. 这意味着,如果不检查是否添加了句柄并尝试切换到它,则会引发异常。在我的情况下,它会在我调用时切换到不正确的选项卡driver.SwitchTo().Window(handles[handles.Count() -1]);。所以我创建了等待添加句柄的方法。

问题是,当在多个工人中运行时,它总是超时。我改变了timeout但没有任何改变。新打开的选项卡的句柄不会添加到WindowHandles. 如果我没有并行运行,那么它会按预期工作。

// previousTabCount- browser's tab count before opening new one
public void WaitForTabToOpenAndSwtich(int previousTabCount)
{
   int currentTabCount = driver.WindowHandles.Count();
   int count = 0;
   while(currentTabCount == previousTabCount)
   {
        // after 20 seconds throw exception
        if(count > 20)
            throw new Exception("The newly opened tab's handle was not added.");
        // update current tab count
        currentTabCount = driver.WindowHandles.Count();

        count++;
        Thread.Sleep(1000);
   }

   var handles = driver.WindowHandles;
   driver.SwitchTo().Window(handles[handles.Count() -1]);
}
4

1 回答 1

0

我找到了解决方案。问题是当使用SendKeys(Keys.Ctrl + 't')在远程机器上打开新标签时它不起作用我不知道为什么。幸运的是,我找到了另一种方法。

而不是使用我使用的发送密钥命令:

// script that opens a new tab
driver.ExecuteScript("var w = window.open(); w.document.open();");

运行此脚本后,新选项卡已打开,但我无法通过使用更改其 url,
driver.Navigate().GoToUrl("...");
并引发异常:

对 URL 'http://example.com' 的远程 WebDriver 服务器的 HTTP 请求在 60 秒后超时

因此,我通过在末尾添加页面加载来稍微修改该脚本,如下所示:

// script that opens new tab and reloads it
driver.ExecuteScript("var w = window.open(); w.document.open(); w.location.reload();");

这对我有用。也许有人会发现这很有用。

于 2016-01-07T21:45:16.163 回答