Java 硒-IE 11中的NoSuchWindowException

Java 硒-IE 11中的NoSuchWindowException,java,internet-explorer,selenium,browser-automation,Java,Internet Explorer,Selenium,Browser Automation,我正在尝试使用IE11中的selenium自动化一个网页。我已将保护模式设置设置为相同级别,缩放级别为100%。在运行测试时,它会打开网站,但随后会出现异常。下面是使用的代码 File file = new File("C:\\Users\\Desktop\\IEDriverServer.exe"); System.setProperty("webdriver.ie.driver", file.getAbsolutePath() ); DesiredCapabil

我正在尝试使用IE11中的selenium自动化一个网页。我已将保护模式设置设置为相同级别,缩放级别为100%。在运行测试时,它会打开网站,但随后会出现异常。下面是使用的代码

   File file = new File("C:\\Users\\Desktop\\IEDriverServer.exe");
   System.setProperty("webdriver.ie.driver", file.getAbsolutePath() );       
   DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
   capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,
   true); 
   WebDriver driver = new InternetExplorerDriver(capabilities);
   driver.get("http://www.google.com");
以及异常堆栈跟踪

Started InternetExplorerDriver server (32-bit)
2.39.0.0
Listening on port 38122
Jul 11, 2014 1:50:02 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: I/O exception (java.net.SocketException) caught when processing request: Software caused        connection abort: recv failed
Jul 11, 2014 1:50:02 PM org.apache.http.impl.client.DefaultRequestDirector tryExecute
INFO: Retrying request
Exception in thread "main" org.openqa.selenium.NoSuchWindowException: Unable to find element on   closed window (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 18 milliseconds
Build info: version: '2.39.0', revision: 'ff23eac', time: '2013-12-16 16:12:12'
 System info: host: 'Neeraj', ip: '10.136.180.161', os.name: 'Windows 7',  s.arch: 'amd64',      os.version: '6.1', java.version: '1.7.0_60'  Session ID: ab6edd65-8a66-41fa-be46-56fba7dbdfc9
Driver info: org.openqa.selenium.ie.InternetExplorerDriver
 Capabilities [{platform=WINDOWS, javascriptEnabled=true, elementScrollBehavior=0,                          ignoreZoomSetting=false,                                  enablePersistentHover=true, ie.ensureCleanSession=false, browserName=internet explorer, enableElementCacheCleanup=true,   unexpectedAlertBehaviour=dismiss, version=11, ie.usePerProcessProxy=false, cssSelectorsEnabled=true,   ignoreProtectedModeSettings=true, requireWindowFocus=false,  handlesAlerts=true, initialBrowserUrl=http://localhost:38122/, ie.forceCreateProcessApi=false, nativeEvents=true, browserAttachTimeout=0, ie.browserCommandLineSwitches=, takesScreenshot=true}]
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
      at java.lang.reflect.Constructor.newInstance(Unknown Source)
      at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:193)
      at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
 at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:307)
 at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:348)
 at org.openqa.selenium.By$ById.findElement(By.java:220)
 at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:299)
 at Test1.main(Test1.java:27)

关于如何解决此问题的任何建议。

首先,不要使用

capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
因为您已经设置了保护模式设置。对于您看到的问题,应该是因为缺少注册表设置,而注册表设置是在IE11中作为运行测试的先决条件添加的:


我使用的是IE 11-64位windows机器。这一点对我有效

仅对于IE 11,您需要在目标计算机上设置一个注册表项,以便驱动程序能够保持与它创建的Internet Explorer实例的连接

对于32位Windows安装,必须在 注册表编辑器是HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE\u\BFCACHE

对于64位Windows安装,密钥是 HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE\u\BFCACHE

请注意,功能缓存子项可能存在,也可能不存在,如果不存在,则应创建该子项。


重要提示:在此键内,创建一个名为
iexplore.exe的
DWORD
值,其值为0。

我发现,如果启动的浏览器保持焦点,您将获得该异常。一旦启动webdriver,就打开任何其他窗口,例如,一旦脚本启动IE驱动程序,就可以打开eclipse。脚本执行开始,然后您可以打开IE驱动程序。。要通过脚本处理,请添加以下代码:

    public WebDriver driver, driver1;
    System.setProperty("webdriver.ie.driver", System.getProperty(
                    "webdriver.ie.driver", "./BrowserDrivers/IEDriverServer.exe"));
            driver = new InternetExplorerDriver(cap);
            this.driver.manage().deleteAllCookies();
            this.driver.manage().timeouts().implicitlyWait(WaitTimeConstants.WAIT_TIME_LONG, TimeUnit.SECONDS);

            this.driver.get("yourApplication.com");
            this.driver.manage().window().maximize();

public WebDriver driver, driver1;
System.setProperty("webdriver.ie.driver", System.getProperty(
                "webdriver.ie.driver", "./BrowserDrivers/IEDriverServer.exe"));
        driver1 = new InternetExplorerDriver(cap);
        this.driver1.manage().deleteAllCookies();

        this.driver1.get("http://www.google.com");
        this.driver1.manage().window().maximize();

如果从当前页面导航到下一页的某个操作/事件,并且selenium驱动程序无法识别窗口,则以下解决方案也有效:-

对于64位Windows安装,关键是:

 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet explorer\Main\FeatureControl\FEATURE_BFCACHE

在这里面创建一个名为iexplore.exe的DWORD值,值为0。

由@David Kemp建议的解决方案不适用于windows 10-64位的ie 11。我已经按照IE 11中提到的步骤添加了注册表项
HKEY\u LOCAL\u MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet explorer\Main\FeatureControl\FEATURE\u BFCACHE
,但在打开https证书页(url)后,它无法执行
驱动程序。导航()(“javascript:document.getElementById('overridelink')。click()”;

但是,同样的适用于windows 7-64位的ie 11,并且能够执行脚本

让ie 11为win 10工作的解决方法是将initialBrowserUrl功能设置为,如下所示

capabilities.setCapability("initialBrowserUrl", "https://my-page:9443");

但我仍然不明白为什么ie11/windows 10会有所不同?

在ie11中添加到您的受信任站点。这对我来说很有效,因为我尝试了所有其他方法都没有结果。

将AUT域添加到“受信任站点”列表中,即“Internet选项”。解决了问题。

IE选项-->安全选项卡->取消选中”启用保护模式“对我有效。

首先忽略……我已经尝试了IE驱动程序的以下功能,然后它就有效了……)


您可以按照以下几个选项操作:

  • 在项目中使用相对路径,以后可以选择获取其绝对路径
  • 将所有的保护模式设置设置为启用或禁用
  • 尝试理解此异常的真正含义“org.openqa.selenium.NoSuchWindowException:无法在关闭的窗口中找到元素(警告:服务器未提供任何stacktrace信息) 命令持续时间或超时:18毫秒“
  • 这表明,无论您的代码(web驱动程序)执行什么操作,都无法识别IE的窗口

    可能的原因可能是: a、 多个驱动程序实例已在运行,这些实例由较旧的运行实例化,不能由quite()终止。 b、 有时在驱动程序上使用close()时,它不会终止IE驱动程序,因此在finally块中关闭后使用quite()。 是的,添加一些异常处理以避免上述问题

  • 异常“org.openqa.selenium.NoSuchWindowException“还表明web驱动程序实例无法获得IE窗口选项卡的句柄。我遇到了这个问题,当时浏览器被意外关闭,代码仍在尝试查找web元素并对其执行某些操作。在这种情况下,驱动程序抛出此异常以告知根本没有打开IE浏览器

  • 检查浏览器的打开情况也会有所帮助,我通常会保留一些代码,这些代码会给出所用驱动程序对象的日志,以及它试图连接的端口和要连接的浏览器


  • 对我来说,第4点和第5点奏效了。但您可能只想更改web驱动程序的服务,即浏览器。IE有时太慢,无法实现selenium API调用:(

    谢谢。对于任何面临相同问题的人来说,打开注册表设置的参考链接该配置的链接现在运行良好。但是输入速度非常慢-每分钟一个字母:-/有什么想法吗?希望你使用的是64位机器和64位IE驱动程序。改用32位IE驱动程序。我使用的是64位机器。添加了r相关注册表项并更改为32位IE驱动程序。仍将获得异常。internet Explorer中没有main请确保您在HKEY_LOCAL_机器下导航
                ieCapabilities.setCapability(InternetExplorerDriver.INITIAL_BROWSER_URL,false);