【发布时间】:2013-10-24 19:40:37
【问题描述】:
我在 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");
运行几次后,我发现窗口句柄的数量通常在不到 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,并保持不变,应该如此。
似乎其他人也遇到了这个问题。 This person 发现当他们打开一个新窗口并等待 1000 毫秒时,getWindowHandles() 返回值 1 而不是 2。Selenium Google Group 上的 this person 似乎也有同样的问题。
我的问题:鉴于新打开窗口的句柄保持打开状态(通常)少于 50 毫秒,在 Internet Explorer 中切换到新窗口的最有效方法是什么10 与硒?或者我应该做些不同的事情来防止新的窗口句柄丢失?
【问题讨论】:
-
你使用的是什么版本的 Selenium?
-
@Richard Selenium 的版本是 2.35.0。 IEDriverServer的版本是2.35.3.0。
-
您是否尝试过使用 IE 10 手动登录以查看是否出现相同的行为?
-
@Richard 新窗口打开得很好并且是焦点(至少在视觉上)。问题出在 IWebDriver:Selenium 无法将驱动程序切换到新窗口。
-
啊,我想可能是 IE 10 中的窗口本身正在关闭。我用 IE 10、Selenium 2.37、32 位 IE 驱动程序进行了类似的测试,我能够切换窗口。如果您使用 64 位或更新到 2.37,我建议您获取 32 位 2.35.3.0 IE 驱动程序。如果您还没有看到是否得到相同的行为,我还建议您尝试针对 IE 9 进行测试。
标签: c# internet-explorer selenium