这是我在这里提出的上一个问题的后续。
我之前遇到过使用 Selenium 2.37.0 在 Internet Explorer 10 中切换窗口的问题。我的 C# 程序将导航到一个页面,单击一个打开链接的按钮,然后尝试导航到新窗口以执行其他任务。我的程序一直失败,我确定这是因为 Selenium 的窗口句柄。打开新窗口后,窗口句柄 ( driver.WindowHandles.Count
) 的数量从 1 增加到 2,正如预期的那样,但经过一段时间后,窗口句柄的数量又回落到 1。
我创建了一个重现此问题的最小示例网页。只需将以下代码保存到test.aspx
桌面上调用的文件中:
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<input id="btn" type="button" value="Link" lang="javascript" onclick="window.open('test.aspx')">
</body>
</html>
这是我的 C# 代码(Visual Studio 2010 中名为 的控制台项目TestWindowSwitching
)打开此页面,单击按钮并打印一些输出:
using System;
using System.Threading; // Needed for Sleep
using System.Diagnostics; // Needed for Stopwatch
using OpenQA.Selenium;
using OpenQA.Selenium.IE;
namespace TestWindowSwitching
{
class Program
{
static void Main()
{
IWebDriver driver = new InternetExplorerDriver();
driver.Navigate().GoToUrl("C:\\Users\\yourNameHere\\Desktop\\test.aspx");
try { driver.SwitchTo().DefaultContent(); }
catch { Thread.Sleep(10); }
Console.WriteLine("Initial number of window handles: " + driver.WindowHandles.Count);
Stopwatch sw = new Stopwatch();
try { driver.FindElement(By.Id("btn")).Click(); }
catch { Thread.Sleep(10); }
// Wait until number of window handles becomes 2
while (driver.WindowHandles.Count != 2)
{
// Do nothing
}
sw.Start();
// Wait until number of window handles changes from 2
while (driver.WindowHandles.Count == 2)
{
// Do nothing
}
Console.WriteLine("Number of window handles has dropped to " + driver.WindowHandles.Count
+ " in " + sw.ElapsedMilliseconds + " ms");
sw.Stop();
Console.Write("Press Enter to close...");
Console.ReadLine();
driver.Quit();
}
}
}
这是该代码的一些示例输出:
初始窗口句柄数:1
窗口句柄数在 59 毫秒内降至 1
按 Enter 关闭...
我之前为此创建了一个解决方法,所以这对我来说实际上不再是问题了。我只需获取 Javascript 命令(在本例中为window.open('test.aspx')
)并使用它直接导航到页面,而无需打开新窗口。
但是,正如我在上一篇文章中提到的,我觉得其他人可能已经遇到过这个问题(示例 1、示例 2),所以如果这实际上是 Selenium 中的一个错误,那么值得调查。或者,如果我做错了什么,欢迎提出建议。