【发布时间】: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