Selenium InternetExplorerDriver не фокусируется на окне

Мой проект включает в себя веб-драйвер Selenium, JAVA, Maven, TestNG, Jenkins, Allure (отчеты). У меня есть несколько наборов тестов с более чем 100 тестовыми примерами, и я перебираю их в 3 разных браузерах (тесты выполняются параллельно с использованием TestNG).

Есть один тест, который не может пройти, если я на самом деле не наблюдаю за окном и не вижу тестовый прогон.

Я объясню: что я пытаюсь проверить? наши разработчики JS создали функцию, которая, только если пользователь фокусируется на окне, тогда слайд-шоу изображений начнет перемещаться и изменять изображения.

На Firefox и Chrome он проходит отлично - мне не нужно видеть тест. В центре внимания могут быть другие вкладки или браузеры, и драйвер будет эмулировать все. На IEdriver это не так!!

Я попытался добавить много возможностей для драйвера и до сих пор ничего (некоторые из них решили некоторые другие проблемы):

}else if (browser.equalsIgnoreCase("ie")) {

    String exeServiceIEdriver = Consts.ieDriverPath;
    System.setProperty("webdriver.ie.driver", exeServiceIEdriver);
      DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
      ieCapabilities.setCapability("nativeEvents", false);
      ieCapabilities.setCapability("unexpectedAlertBehaviour", "accept");
      ieCapabilities.setCapability("ignoreProtectedModeSettings", true);
      ieCapabilities.setCapability("disable-popup-blocking", true);
      ieCapabilities.setCapability("enablePersistentHover", true);
      ieCapabilities.setCapability("ignoreZoomSetting", true);
        //ieCapabilities.setCapability("version", "12"); does it work?? don't think so..
      ieCapabilities.setCapability("requireWindowFocus", true);
        //ieCapabilities.setCapability("browser_version", "9.0");  // Does NOT work. need user agent
      ieCapabilities.setCapability("IE_ENSURE_CLEAN_SESSION", true);  // Does NOT work. need user agent
      ieCapabilities.setCapability("browserAttachTimeout",5000);
      ieCapabilities.setCapability(CapabilityType.ACCEPT_INSECURE_CERTS,true);
      ieCapabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS,true);
      ieCapabilities.setCapability(CapabilityType.SUPPORTS_APPLICATION_CACHE,false);

    driver = new InternetExplorerDriver(ieCapabilities);
    Log.info("\n*** Starting IE Browser ***");

1 ответ

Решение

Кажется, вы решили добавить все InternetExplorerDriver связанные возможности.

Browser Focus

Проблема в том, что сам IE, похоже, не полностью соблюдает сообщения Windows, которые мы отправляем в окно браузера IE (WM_MOUSEDOWN а также WM_MOUSEUP) если у окна нет фокуса. В частности, элемент, по которому щелкают, получит окно фокусировки вокруг него, но элемент не будет обрабатывать щелчок. Возможно, мы не должны отправлять сообщения вообще; скорее, мы должны использовать SendInput() API, но этот API явно требует, чтобы окно имело фокус. У нас есть две противоречивые цели с проектом WebDriver.

Итак, во-первых, мы стремимся подражать пользователю как можно ближе. Это означает использование собственных событий, а не имитацию событий с использованием JavaScript.

Во-вторых, мы не хотим, чтобы фокус окна браузера был автоматизирован. Это означает, что просто принудительное перемещение окна браузера на передний план является неоптимальным.

Дополнительным соображением является возможность запуска нескольких экземпляров IE под несколькими экземплярами WebDriver, что означает любой такой bring the window to the foreground решение должно быть заключено в какую-то синхронизирующую конструкцию (вероятно, mutex) в коде C++ драйвера IE. Даже в этом случае этот код будет по-прежнему зависеть от условий гонки, если, например, пользователь выводит другое окно на передний план между драйвером, выводящим IE на передний план и выполняющим собственное событие.

Дискуссия вокруг требований водителя и того, как расставить приоритеты для этих двух конфликтующих целей, продолжается. В настоящее время преобладает мудрость в том, чтобы расставлять приоритеты над первыми, а не документировать, что ваша машина будет недоступна для других задач при использовании драйвера IE. Однако это решение далеко не окончательно, и код для его реализации, вероятно, будет довольно сложным.

Решение

В качестве временного решения вы можете добавить возможность:

ieCapabilities.setCapability("requireWindowFocus", false);
Другие вопросы по тегам