Эксперимент с запуском «безголового» Internet Explorer через WebDriver

Я давно искал такой вариант запуска Internet Explorer в Windows, чтобы окно открывалось в скрытом режиме, и не мешало дальнейшей работе на локальной машине, пока там же идут тесты.
Я конечно, пользуюсь PhantomJS для этих задач… но мне нужен Internet Explorer!

В поисках, я дошёл до отчаянья. Даже уже хотел допилить Triflejs для того чтобы он поддерживал протокол Вебдрайвера…

И случайно, нашёл решение запуска окна IE в скрытом режиме. Ну… скорее даже хак :slight_smile:

Недавно, я ошибся в параметре PsExec, которую использовал для запуска тестов на виртуалках. Результатом ошибки было то, что тесты для IE были запущены и прошли успешно… но, при этом, окно браузера не открывалось на рабочем столе.

Как оказалось, этот трюк с PsExec отлично работает для локальной машины.
Но, появилась другая проблема в том, что таким образом, я могу запустить локально весь test suite, но не отдельные тесты на выбор.

Первым рабочим решением было запустить selenium-server-standalone в невидимом режиме, и подключатся к нему локально.

Это я делал при помощи следующего bat-файла:

@REM psstart.bat:
@set IE=-Dwebdriver.ie.driver="%cd%\IEDriverServer.exe"
@set CHROME=-Dwebdriver.chrome.driver="%cd%\chromedriver.exe"
@set PHANTOM=-Dphantomjs.binary.path="%cd%\phantomjs.exe"

@set SELENIUM_SERVER_EXE=selenium-server-standalone-2.41.0.jar

psexec.exe \\localhost  -u dzhariy -p paSSwww0RD -w "%cd%" java %PHANTOM% %CHROME% %IE% -jar %SELENIUM_SERVER_EXE%

И это решение работало, но я хотел каким-то образом избавить себя от запуска selenium-server-standalone.

Мне нужно было как-то подменить прямой запуск IEDriverServer.exe на свой bat-файл.
И хорошо, что WebDriver это позволяет сделать.

var ieservice = InternetExplorerDriverService.CreateDefaultService(@"D:\projects_current\HeadlessIETest", "headlessie.cmd");
var options = new InternetExplorerOptions();
var wd = new InternetExplorerDriver(ieservice, options);

В этом примере, вместо IEDriverServer.exe, первоначально будет запущен headlessie.cmd.
Ну, а в свою очередь, headlessie.cmd запустит IEDriverServer.exe в скрытом режиме.

@REM headlessie.cmd:
%~dp0psexec.exe \\localhost  -u dzhariy -p PassW0rd %~dp0IEDriverServer.exe %*

Пока эксперимент продолжается. Я столкнулся с проблемой снятия скриншотов. В таком режиме, к сожалению, WebDriver возвращает «чёрный квадрат» вместо скриншота страницы. Возможно, в том месте, где он был запущен действительно так темно.
Но, пока что это удалось решить при помощи ещё одного хака:
Html2CanvasWebDriver.cs.

To be continued…

2 лайка

Эвенты синтетические?

Я отдельно ставил NativeEvents = true и прогонял тесты. Тесты проходили без проблем.
Но, с уверенностью, что там происходит я ничего сказать не могу.

Мне нужен такой кейс, страница, где манипуляции возможны только при NativeEvents = true, а при синтетических – валилось бы.
Пока такой кейс найти не могу.

Здесь не дело в противопоставлении синтетики и нативности. На моей памяти огромное кол-во тем-вопросов на различных ресурсах, когда топик-стартеры сталкиваются с различными проблемами в связке ie_native_events+session_0.
То же “вещает” и Джим (?) [ GitHub - SeleniumHQ/selenium-google-code-issue-archive: Archive, please see main selenium repo ]:

[quote]Running IEDriverServer.exe Under a Windows Service

Attempting to use IEDriverServer.exe as part of a Windows Service application is expressly unsupported. Service processes, and processes spawned by them, have much different requirements than those executing in a regular user context. IEDriverServer.exe is explicitly untested in that environment, and includes Windows API calls that are documented to be prohibited to be used in service processes. While it may be possible to get the IE driver to work while running under a service process, users encountering problems in that environment will need to seek out their own solutions.[/quote]

Навскидку проблемы могут быть с алертами/аплоадом/ховером.
А еще круче было бы прогнать CI тесты самого селениума на этой конфигурации :slight_smile:

Могу подтвердить негативный результат.
Если такая штука работает для статических страниц, то на динамических (которые строятся через JavaScript), возникает множество проблем. С чем я столкнулся:

  • Размер браузера меняется до 850x500 и его невозможно изменить. Пробовал как средствами драйвера, так и JavaScript

  • Zoom Level в IE почему-то был 125%, хотя при открытии в нормальном режиме все корректно

  • Одна форма просто не отправлялась корректно. Сервер возвращал не корректные данные в итоге.

Пока от идеи я отказался.