我在 Internet Explorer 10 中使用最新版本的 Selenium (2.37.0) 和 C#(使用最新的 32 位 InternetExplorerDriver,2.37.0)登录网页,单击打开新窗口的按钮,然后然后将焦点转移到新窗口。
最初我在 Firefox 中使用此代码,并且每次都可以使用:
// Get handle for original window
string parentHandle = driver.CurrentWindowHandle;
// Click on button for new window
driver.FindElement(By.Id("buttonForNewWindow")).Click();
// Get list of all window handles
ReadOnlyCollection<string> allWindowHandles = driver.WindowHandles;
// Loop over all handles and switch to new child window
foreach (string handle in allWindowHandles)
{
if (handle != parentHandle)
{
driver.SwitchTo().Window(handle);
}
}
但这在 Internet Explorer 中不起作用。
我已经查明了问题所在。在我打开新窗口之前,我driver.WindowHandles.Count
用来获取窗口句柄的数量,并且(如预期的那样)它告诉我只有一个窗口句柄。然后,当我单击新窗口的按钮时,它告诉我(再次,正如预期的那样)有两个窗口句柄。但是在代码到达 for 行之前driver.SwitchTo().Window(handle);
,窗口句柄的数量已经下降到一个,即使两个窗口仍然可见。
所以不知何故,其中一个窗口句柄丢失了。我已经确认(使用一堆Console.WriteLine
语句)删除的窗口句柄是新的。我还使用Stopwatch
该类来计算删除新窗口句柄所需的时间:
Stopwatch sw = new Stopwatch();
// Wait until the number of windows has changed from 1 to 2
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until((_driver) => { return _driver.WindowHandles.Count != windowsBefore; });
// Start stopwatch
sw.Start();
int numberOfWindows = driver.WindowHandles.Count;
while (numberOfWindows == 2)
{
numberOfWindows = driver.WindowHandles.Count;
}
sw.Stop();
Console.Write("\nTime elapsed: " + sw.ElapsedMilliseconds + " ms");
运行几次后,我发现窗口句柄的数量通常会在不到 50 毫秒的时间内回落到一个。然而,有一次窗口句柄持续的时间要长得多;以下是原始数字:
Time elapsed: 47 ms
Time elapsed: 31 ms
Time elapsed: 47 ms
Time elapsed: 2861 ms
Time elapsed: 30 ms
我也确认了这个问题在 Firefox 中不会发生。当我在 Firefox 中运行相同的代码时,我发现窗口句柄的数量从 1 变为 2,并保持不变。
似乎其他人也有这个问题。这个人发现当他们打开一个新窗口并等待 1000 毫秒时,getWindowHandles() 返回值 1 而不是2。Selenium Google Group 上的这个人似乎也遇到了同样的问题。
我的问题:鉴于新打开窗口的句柄保持打开状态(通常)少于 50 毫秒,在 Internet Explorer 10 中使用 Selenium 切换到新窗口的最有效方法是什么?还是我应该做些不同的事情来防止新的窗口句柄丢失?