5

这是我在这里提出的上一个问题的后续。

我之前遇到过使用 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 中的一个错误,那么值得调查。或者,如果我做错了什么,欢迎提出建议。

4

1 回答 1

3

我相信我可能已经找到了解决方案。我进入 IE -> Internet 选项 -> 高级 -> 重置 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 -> Internet 选项 -> 安全并检查了所有四个区域的“启用保护模式”。这解决了它;当我运行我的程序时,我不再得到那个错误。这个问题(即 IE 驱动程序不适用于 IE 10 的默认设置)可能是一个值得记录的问题。

更改这些设置后,我的程序运行了——但运行速度非常慢。在两个文本框中键入六个字符长的字符串实际上需要 60 秒。然后我切换到 32 位驱动程序(尽管有 64 位 IE),它以正常速度运行。

最后,我一直运行我的程序,它不再丢弃窗口句柄。

总结一下:如果您遇到 IE 驱动程序丢弃窗口句柄的问题,请考虑重置您的 IE 设置。这似乎已经为我解决了。

于 2013-11-05T16:48:02.153 回答