这是我在此问到的a previous question的后续行动。
我之前遇到过使用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')
)并直接使用它导航到页面而不打开新窗口。
但是,正如我在上一篇文章中提到的,我觉得其他人可能遇到过这个问题(example 1,example 2),所以如果这实际上是Selenium中的一个错误,那么值得调查。或者,如果我做错了什么,欢迎提出建议。
答案 0 :(得分:3)
我相信我可能找到了解决方案。我进入了IE - &gt;互联网选项 - &gt;高级 - &gt;重置Internet Explorer设置。执行此操作并重新启动后,我不再遇到窗口切换问题。我不确定为什么会这样,因为我几乎不使用IE;我无法想象我改变了任何重要的设置。
在此过程中,我注意到一些可能相关的问题。为了绝对透明,我将陈述我所做的一切。
重置我的设置后,当我第一次打开IE时,我回答了几个对话框。首先,我点击“使用推荐的安全性和兼容性设置”和“确定”。然后,在“你想让Internet Explorer成为默认浏览器吗?”下,我点击“否”和“不再问”。最后,对于“几个附加组件已准备就绪”,我点击了“不启用”。
然后,当我尝试使用64位驱动程序运行程序时。 (我假设我的IE是64位,因为在开始菜单中,程序在C:\Program Files\
下 - 而不是C:\Program Files (x86)\
,就像我的其他一些程序一样。)它会在线上崩溃IWebDriver driver = new InternetExplorerDriver();
。错误如下:
InvalidOperationException未处理
启动Internet Explorer时出现意外错误。保护模式设置不是 所有区域都一样。启用保护模式必须设置为相同的值 (启用或禁用)所有区域。 (NoSuchDriver)
为了解决这个问题,我进入了IE - &gt;互联网选项 - &gt;安全性并选中所有四个区域的“启用保护模式”。这固定了;当我运行程序时,我不再有错误。此问题(IE驱动程序无法使用IE 10的默认设置)可能是值得记录的问题。
更改这些设置后,我的程序运行了 - 但它确实非常慢。字面上花了60秒才能将六个字符长的字符串键入两个文本框。然后我切换到32位驱动程序(尽管有64位IE),它以正常速度运行。
最后,我一直运行我的程序,它不再删除窗口句柄。
总结一下:如果您在使用IE驱动程序丢弃窗口句柄时遇到问题,请考虑重置IE设置。这似乎已经为我解决了。