Selenium - NoSuchWindowException в IE 11
Я пытаюсь автоматизировать веб-страницу с помощью селена в IE11. Я установил настройки защищенного режима на тот же уровень, и уровень масштабирования составляет 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)
Любые предложения о том, как решить эту проблему.
8 ответов
Прежде всего, не используйте
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,true);
как вы уже установили настройки защищенного режима. Для проблемы, которую вы видите, это должно быть из-за отсутствующих параметров реестра, которые добавляются в качестве предварительного условия для запуска тестов в IE11:
https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver
Я использую IE 11 - 64-битную машину Windows. Этот момент работал для меня.
Только для IE 11 вам потребуется установить запись реестра на целевом компьютере, чтобы драйвер мог поддерживать соединение с экземпляром Internet Explorer, который он создает.
Для 32-битных установок Windows ключ, который вы должны проверить в редакторе реестра, это HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE.
Для 64-разрядных установок Windows ключ HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE.
Обратите внимание, что подраздел FEATURE_BFCACHE может присутствовать или не присутствовать, и его следует создать, если он отсутствует.
Важно: внутри этого ключа создайте DWORD
значение по имени iexplore.exe
со значением 0.
Решение, предложенное @David Kemp, не работает для 11 окон 10 - 64 бит. Я добавил раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet explorer\Main\FeatureControl\FEATURE_BFCACHE
в соответствии с шагами, упомянутыми для IE 11 только после https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver, но после открытия страницы сертификата https (URL https://my-page:9443/) это невозможно выполнить driver.navigate().to("javascript:document.getElementById('overridelink').click()");
бросая NoSuchWindowException
Однако то же самое работает нормально, то есть 11 из 7-битных окон и способен выполнять сценарии.
Обойти, чтобы то есть 11 работали для win 10, установив возможности initialBrowserUrl в https://my-page:9443/, как показано ниже
capabilities.setCapability("initialBrowserUrl", "https://my-page:9443");
но я до сих пор растерялся, почему для ie11 / windows 10 все иначе?
Приведенное ниже решение также работает, если с текущей страницы вы переходите на следующую страницу по какому-либо действию / событию, а драйвер селена не распознает окно:-
Для 64-битных установок Windows ключ:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet explorer\Main\FeatureControl\FEATURE_BFCACHE
Внутри этого создайте значение DWORD с именем iexplore.exe со значением 0.
Домен AUT добавлен в список "Надежных сайтов", например, в "Свойствах Интернета". Решил проблему.
IE Options -> вкладка Security -> Снимите флажок "Включить защищенный режим", который работал для меня.
Я обнаружил, что если запущенный браузер остается в фокусе, вы получите это исключение. Как только вы запустите веб-драйвер, откройте любое другое окно, например, вы можете открыть затмение, как только скрипт запустит IE Driver. Начинается выполнение скрипта, и затем вы можете открыть свой драйвер 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();
Добавьте http://localhost/ к вашим доверенным сайтам в IE11. Это сработало для меня, попробовав все остальное безрезультатно.
Игнорируйте прежде всего... я пробовал строку ниже в своих желаемых возможностях для драйвера IE, тогда она сработала..:)
ieCapabilities.setCapability(InternetExplorerDriver.INITIAL_BROWSER_URL,false);
Вы можете воспользоваться несколькими вариантами ниже:
- Используйте относительные пути в проекте, позже вы можете выбрать его абсолютный путь.
- Установка параметра защищенного режима для всех: включено или отключено.
- Попытайтесь понять, что на самом деле означает это исключение "org.openqa.selenium.NoSuchWindowException: Невозможно найти элемент в закрытом окне (ПРЕДУПРЕЖДЕНИЕ: сервер не предоставил никакой информации о трассировке стека). Продолжительность или тайм-аут команды: 18 миллисекунд"
Это означает, что все, что делается вашим кодом (веб-драйвером), не может идентифицировать окно IE.
Возможными причинами могут быть: a. Уже запущено несколько экземпляров драйверов, которые были созданы более старыми запусками и не могли быть прерваны с помощью функции very (). б. Иногда, когда вы используете close() для драйвера, он не завершает работу драйвера IE, поэтому используйте довольно () после закрытия внутри блока finally. Да, добавьте обработку исключений, чтобы избежать вышеуказанной проблемы.
Исключение org.openqa.selenium.NoSuchWindowException также предполагает, что экземпляр веб-драйвера не может получить дескриптор вкладки окна IE. Я столкнулся с этой проблемой, когда случайно браузер был закрыт, а код все еще пытался найти и выполнить какое-то действие с веб-элементом. В этом случае драйвер генерирует это исключение, чтобы сообщить, что браузер IE вообще не открыт.
Проверка открытия браузера также может помочь, я обычно сохраняю некоторый фрагмент кода, который дает журналы использования объекта драйвера и порта, к которому он пытается подключиться и к какому браузеру.
Для меня пункты 4 и 5 работали. но вы можете просто изменить службу веб-драйвера, то есть браузер. IE просто иногда слишком медленный, чтобы выполнять вызовы API селена:(