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