我在 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
获取窗口句柄的数量,并且(如预期的那样)它告诉我只有一个窗口句柄。然后,当我单击新窗口的按钮时,它告诉我(再次如预期)有两个窗口句柄。但在代码到达行之前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");
运行几次后,我发现窗口句柄的数量通常会回落到 1不到 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 毫秒,使用 Selenium 在 Internet Explorer 10 中切换到新窗口的最有效方法是什么?或者我应该采取不同的措施来防止新的窗口句柄丢失?