Селен не обнаруживает второе окно в IE
Мое приложение открывает новое окно при нажатии кнопки, и мне нужно выполнить некоторые действия в этом окне. Но ответный метод getWindowHandles() веб-драйвера selenium содержит только один идентификатор окна. Это происходит особенно, если есть задержка вызова getWindowHandles() после открытия нового окна. Существует известная проблема с селеном. https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver
Но даже решение для этого не работает для меня.
Код выглядит следующим образом
DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
RemoteWebDriver driver = new
RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
driver.get("https://<url>");
WebElement userName = driver.findElement(By.name("usr_name"));
userName.sendKeys("ABCD");
WebElement password = driver.findElement(By.name("usr_password"));
password.sendKeys("password");
WebElement login = driver.findElement(By.name("OK"));
login.click();
WebElement popup= driver.findElement(By.name("popup"));
popup.click();
Thread.sleep(1000);
Set<String> windowHandles = driver.getWindowHandles();
System.out.println(windowHandles);
Набор " windowHandles " вернет только одно окно:
"[fcdad457-9090-4dfd-8da1-acb9d6f73f74]"
Но если я снимаю сон. он вернет два идентификатора окна:
[90cc6006-0679-450c-a5b3-6602bcb41a16, 7211bbfd-2616-4460-97e7-56c0e632c3bb]
Я не могу удалить сон, так как это всего лишь пример программы, и в реальном приложении между ними будет некоторая задержка. Пожалуйста, поделись своими мыслями. Эта проблема только для IE11.
Синий экран - домашняя страница; Серый экран - всплывающее окно
3 ответа
Есть пара вещей, о которых вы должны позаботиться, имея дело с InternetExplorer
следующее:
Как вы упомянули There is a known issue with selenium
задокументировано в github
это не проблемы как таковые, а совокупный набор Required Configuration
имея дело с InternetExplorer
, Не заботясь об этих настройках InternetExplorer
может не вести себя, как ожидалось. Следующие пункты имеют решающее значение для демонстрации правильного поведения InternetExplorer v11
:
Enhanced Protected Mode
должен быть отключен для IE 10 и выше. Эта опция находится вAdvanced
вкладкаInternet Options
Диалог.- Браузер
Zoom Level
должен быть установлен на 100%, чтобы родные события мыши могли быть установлены в правильные координаты. - Вы должны установить
Change the size of text, apps, and other items
до 100% в настройках дисплея. Для IE 11 вам потребуется установить запись реестра на целевом компьютере, чтобы драйвер мог поддерживать соединение с экземпляром InternetExplorer, который он создает.
For 32-bit Windows installations, the key you have to look in the registry is : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE For 64-bit Windows installations, the key is : HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE The FEATURE_BFCACHE subkey may or may not be present, and should be created if it is not present.
Native Events
Преимущество использования собственных событий заключается в том, что они не зависят от изолированной программной среды JavaScript и обеспечивают правильное распространение событий JavaScript в браузере. Однако в настоящее время существуют некоторые проблемы с событиями мыши, когда окно браузера IE не имеет фокуса и при попытке навести курсор на элементы.Browser Focus
Похоже, что сам IE не полностью соблюдает сообщения Windows, которые мы отправляем в окно браузера IE (WM_MOUSEDOWN и WM_MOUSEUP), если окно не имеет фокуса.Вы можете найти подробное обсуждение
Native Events
а такжеBrowser Focus
here
,Теперь вы должны настроить все эти параметры через
DesiredCapabilities
Класс следующим образом:DesiredCapabilities cap = DesiredCapabilities.internetExplorer(); cap.setCapability("ignoreProtectedModeSettings",1); cap.setCapability("IntroduceInstabilityByIgnoringProtectedModeSettings",true); cap.setCapability("nativeEvents",true); cap.setCapability("browserFocus",true); cap.setCapability("ignoreZoomSetting", true); cap.setCapability("requireWindowFocus","true"); cap.setCapability("INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS", true);
Согласно
Best Programming
практикаThread.sleep(1000);
это огромное Нет, так как это ухудшаетTest Performance
Теперь, когда вы знаете, что
Browser Clients
отстаетWebDriver
Например, мы должны часто синхронизировать их. Поэтому, прежде чем вы соберете окно, вы должны побудитьWebDriverWait
следующим образом, для которого вы можете найтиdetailed discussion here
:WebElement popup= driver.findElement(By.name("popup")); popup.click(); new WebDriverWait(driver,5).until(ExpectedConditions.numberOfWindowsToBe(2)); Set<String> windowHandles = driver.getWindowHandles(); System.out.println(windowHandles);
Обновить
Я могу видеть из ваших комментариев:
"Enable Enhanced Protected Mode" is unchecked in IE options. – Renjith Jan 9 at 7:26
Вот пример из чувственного блога @JimEvans на Protected Mode settings and the Capabilities hack
где @JimEvans делает контекст понятным и недвусмысленным:
Когда впервые был представлен переписанный драйвер IE, было решено, что он принудительно введет необходимые параметры защищенного режима и выдаст исключение, если они не были правильно установлены. Параметры защищенного режима, как и почти все остальные параметры IE, хранятся в реестре Windows и проверяются при создании экземпляра браузера. Однако некоторые ошибочные ИТ-отделы не позволяют разработчикам и тестировщикам устанавливать даже самые базовые настройки на своих машинах.
Драйверу нужен был обходной путь для людей, которые не могли установить эти настройки IE, потому что их машина была чрезмерно заблокирована. Это то, для чего предназначена настройка возможностей. Это просто обходит проверку реестра. Использование возможности не решает основную проблему, хотя. Если граница защищенного режима пересекается, это может привести к очень неожиданному поведению, включая зависания, расположение элемента не работает и щелчки не распространяются. Чтобы предупредить людей об этой потенциальной проблеме, этой способности дали большие страшные имена, такие как
INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS
вJava
а такжеIntroduceInstabilityByIgnoringProtectedModeSettings
в.NET
, Мы действительно думали, что если вы скажете пользователю, что использование этого параметра может привести к появлению потенциальной ошибки в его коде, это будет препятствовать его использованию, но это оказалось не так.Если вы можете установить параметры защищенного режима IE, и вы все еще используете эту возможность, вы рискуете стабильностью своего кода. Не делай этого. Установите настройки. Это не так сложно.
Вот как вам нужно установить Protected Mode settings
:
- Вот еще одно обсуждение
Selenium IEServerDriver not finding new windows for IE9
где решением было включение режима совместимости
Проблема обработки окон, в основном из-за настроек защищенного режима. Либо включите защищенный режим для всех зон, либо отключите его для всех зон и попробуйте.
Не знаю, что такое Set, но я тестировал следующий код
while (true)
{
int qw = ololo.WindowHandles.Count;
string[] wh = ololo.WindowHandles.ToArray();
ololo.FindElement(By.LinkText("Помощь")).Click();
Thread.Sleep(1000);
}
И это сработало отлично.
В IE11 настройка "Включить защищенный режим" в браузере является ключевой - она может быть включена или выключена (для всех зон).
Другие настройки возможностей драйвера не имели значения (в моем случае) - все работало так же хорошо:
caps.setCapability("ignoreZoomSetting", false);
caps.setCapability("nativeEvents", false);
caps.setCapability("ignoreProtectedModeSettings", false);