如何在远程机器上打开浏览器的标签

How to open broswer's tab on remote machine

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

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

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

问题是,在多个worker中运行时,总是超时。我已经更改了 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]);
}

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

我没有使用发送键命令,而是使用了:

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

在 运行 这个脚本之后打开了新标签,但是我 无法 使用
[=13= 更改它的 url ]
并抛出异常:

The HTTP request to the remote WebDriver server for URL 'http: //example.com' timed out after 60 seconds

所以我通过在末尾添加页面加载对该脚本进行了一些修改,如下所示:

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

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