Selenium - IE 11中的NoSuchWindowException

时间:2014-07-14 22:03:55

标签: 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() );       
   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)

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

10 个答案:

答案 0 :(得分:22)

首先,不要使用

capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);

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

https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration

答案 1 :(得分:10)

我正在使用 IE 11 - 64位Windows机器。这一点对我有用。

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

  

对于32位Windows安装,您必须在中检查密钥   注册表编辑器是HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Internet   资源管理器\主\ FeatureControl \ FEATURE_BFCACHE。

     

对于64位Windows安装,关键是   HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\互联网   资源管理器\主\ FeatureControl \ FEATURE_BFCACHE。

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

重要提示:在此密钥中,创建一个名为DWORD的{​​{1}}值,其值为0.

答案 2 :(得分:7)

@David Kemp建议的解决方案不适用于11个窗口10 - 64位。我已根据仅在https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration之后针对IE 11提到的步骤添加了注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet explorer\Main\FeatureControl\FEATURE_BFCACHE,但在打开https证书页面(url https://my-page:9443)之后,它无法执行driver.navigate().to("javascript:document.getElementById('overridelink').click()"); }投掷NoSuchWindowException

然而,相同的适用于11个Windows 7-64位并且能够执行脚本。

让11为win 10工作的工作是将 initialBrowserUrl 功能设置为 https://my-page:9443 ,如下所示

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

但我仍然感到困惑,为什么ie11 / windows 10会有所不同?

答案 3 :(得分:1)

我发现,如果启动的浏览器保持焦点,您将获得该异常。一旦启动webdriver,打开任何其他窗口,例如,您可以在脚本启动IE Driver后立即打开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();

答案 4 :(得分:1)

以下解决方案也适用于从当前页面导航到下一页的某些操作/事件并且selenium驱动程序无法识别窗口: -

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

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

在其中创建一个名为iexplore.exe的值为0的DWORD值。

答案 5 :(得分:1)

在“Internet选项”中为“可信站点”列表添加了AUT域。解决了这个问题。

答案 6 :(得分:0)

IE选项 - >安全选项卡 - >取消选中"启用保护模式"为我工作。

答案 7 :(得分:0)

最重要的是...我已经在IE驱动程序的期望功能下尝试过以下行,然后它起作用了.. :)

            ieCapabilities.setCapability(InternetExplorerDriver.INITIAL_BROWSER_URL,false);

答案 8 :(得分:0)

您可以遵循以下几个选项:

  1. 在项目中使用相对路径,稍后您可以选择获取其绝对路径。
  2. 将所有保护模式设置为启用或禁用。
  3. 尝试了解此异常的真正含义是“ org.openqa.selenium.NoSuchWindowException:无法在关闭的窗口上找到元素(警告:服务器未提供任何堆栈跟踪信息) 命令持续时间或超时:18毫秒”

这表明您的代码(Web驱动程序)所做的任何操作都无法识别IE窗口。

可能的原因可能是: 一种。多个驱动程序实例已在运行,这些实例是由较早的运行实例化的,并且不能由pretty()终止。 b。有时,当您在驱动程序上使用close()时,它不会终止IE驱动程序,因此在finally块内关闭后请使用pretty()。 是的,添加一些异常处理来避免上述问题。

  1. 异常“ org.openqa.selenium.NoSuchWindowException”也表明Web驱动程序实例无法获取IE的窗口选项卡的句柄。偶然地,我关闭了浏览器,并且代码仍在尝试查找Web元素并对其执行某些操作,从而遇到了这个问题。在这种情况下,驱动程序将抛出此异常,以告知根本没有打开IE浏览器。

  2. 检查浏览器的打开也会有所帮助,我通常会保留一些代码,以提供使用过的Driver对象的日志以及它尝试连接的端口以及连接到哪个浏览器。

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

答案 9 :(得分:-1)

http://localhost/添加到IE11中的可信站点。在尝试了其他一切没有结果之后,这对我有用。