新窗口句柄在IE中消失,无法切换到新窗口

我在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 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);的行之前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毫秒,使用Selenium切换到Internet Explorer 10中的新窗口的最有效方法是什么? 或者我应该做些什么来防止新窗口句柄丢失?

只是想提供更新,以防其他人遇到同样的问题并找到此页面。 我没有找到解决问题的方法,但我想出了一个解决方法。

最初,我点击了一个打开一个新窗口的链接,我无法将Selenium导航到新窗口。 我所做的是挖掘页面的源代码,找到我点击的按钮,并找出该按钮所指向的位置。 如果它是一个简单的超链接(www.whatever.com / ….),那将是最简单的,但它是一个Javascript函数。 Javascript函数使用一些固定的字符和一些变量来构建超链接; 例如:

 link(username, date) = "http://www.google.com/user=" + username + "?date=" + date; 

因此,继续这个例子,我只是弄清楚输入了什么变量(用户名,日期等),自己构建了URL,并直接导航到它。 因此,我根本不需要打开并导航到新窗口。