【问题标题】:How to open broswer's tab on remote machine如何在远程机器上打开浏览器的选项卡
【发布时间】:2015-12-21 11:16:14
【问题描述】:

场景:我已经配置了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]);
}

【问题讨论】:

  • 除非测试从一开始就设计为并行运行,否则如果没有一些工作它们不并行运行,我不会感到惊讶。驱动程序实例是否在所有测试之间共享?如果一个测试添加标签,而另一个正在等待它添加标签,他们可能会感到困惑。
  • 感谢@Sam Holder 的回复。是的,我正在使用共享的公共静态驱动程序实例。但我如何理解 Grid 2 将测试分成工作人员,每个工作人员都有自己的驱动程序实例,并且只在该工作人员内部共享。该工作人员内部的所有测试都在同步运行,因此应该不是问题。我可能错了,但这就是我理解它的工作原理。

标签: c# selenium-webdriver tabs specflow selenium-grid2


【解决方案1】:

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

我没有使用发送密钥命令:

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

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

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

所以我稍微修改了该脚本,在末尾添加了一个页面加载,如下所示:

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

这对我有用。也许有人会觉得这很有用。

【讨论】:

    猜你喜欢
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2016-09-24
    • 2016-06-29
    相关资源
    最近更新 更多