Как запустить браузер в selenium webdriver
Selenium WebDriver — это инструмент для автоматизации действий веб-браузера.
В большинстве случаев используется для тестирования Web-приложений, но этим не ограничивается.
Сам по себе Selenium Webdriver в отличие, например, от Selenium IDE ничего для тестирования не содержит, поэтому используется в связке с библиотеками для тестирования, которые есть в большинстве современных языков программирования.
В Python это unittest, nose, pytest и другие. В Java это JUnit.
В частности, он может быть использован для решения рутинных задач администрирования сайта или регулярного получения данных из различных источников (сайтов).
В этой статье вы узнаете как пользоваться Selenium без привязки к какому-то языку программирования.
О написании тестов на Python с использованием Selenium читайте в статье Selenium + Python . Если вас интересует Java рекомендую статью Selenium + Java
Подключить драйвер браузера
Перейдите на selenium.dev и скачайте драйвер для нужного браузера.
Скачайте архив с драйвером. Для Windows x64 выберите .zip файл
Распакуйте архив. Я распаковал в папку C:\webdrivers
Добавьте путь до этой папку в системную переменную PATH .
В поиске наберите env
В разделе System Variables нажмите New
Создайте новую переменную с именем WEBDRIVER_PATH в поле значение укажите путь до папки в которой у вас лежить geckodriver.exe
Выберите переменную Path и нажмите Edit
Нажмите New и введите %WEBDRIVER_PATH%
Подключить драйвер браузера в Linux
Сперва нужно скачать WebDriver той же версии что и ваш Chrome.
Аналогично и для Firefox
Затем нужно добавить путь до WebDriver в системную переменную PATH
Проверить версию браузера
Проверить версию google-chrome можно выполнив
Google Chrome 89.0.4389.114
Версию браузера можно посмотреть в графическом интерфейсе перейдя в Settings → About Chrome
Обновить google-chrome до последней стабильной версии в линукс
sudo apt-get update
sudo apt-get --only-upgrade install google-chrome-stable
Google Chrome 90.0.4430.93
Посетите selenium.dev и скачайте chromedriver_linux64.zip для Chrome или geckodriver-v0.28.0-linux64.tar.gz для Firefox
Предположим, что они теперь в папке Downloads
-rw-rw-r-- 1 andrei andrei 5564194 Nov 20 10:02 chromedriver_linux64.zip
-rw-rw-r-- 1 andrei andrei 2650003 Nov 20 10:03 geckodriver-v0.28.0-linux64.tar.gz
-rw-rw-r-- 1 andrei andrei 5564194 Nov 20 10:05 chromedriver_linux64.zip
-rw-rw-r-- 1 andrei andrei 2650003 Nov 20 10:05 geckodriver-v0.28.0-linux64.tar.gz
total 27M drwxr-xr-x 2 root root 4.0K Nov 20 10:46 ./ drwxr-xr-x 3 root root 4.0K Nov 20 10:07 ../ -rwxr-xr-x 1 root root 11M Oct 15 23:34 chromedriver* -rw-r--r-- 1 root root 5.4M Nov 20 10:19 chromedriver_linux64.zip -rwxr-xr-x 1 sshit sshit 7.6M Nov 3 18:13 geckodriver* -rw-r--r-- 1 root root 2.6M Nov 20 10:19 geckodriver-v0.28.0-linux64.tar.gz
После успешной распаковки можно убедиться в наличии двух исполняемых файлов chromedriver и geckodriver
Для этого откройте файл .bashrc и добавьте туда следующий код
PATH="/opt/WebDriver/bin:$" export PATH
Как раскрыть Selenium на весь экран
Первый способ - открыть в kiosk режиме
Второй способ - указать драйверу ширину равную ширине Вашего экрана
Действия
clear, click, findElement, findElements, getAttribute, getCssValue, sendKeys, submit, isDisplayed, isEnabled, getLocation, isSelected, getSize, getTagName, getText,
Определить подходящий селектор
Ошибки
Exception in thread "main" org.openqa.selenium.ElementNotInteractableException: element not interactable
Обычно появляется если вы пытаетесь выполнить sendKeys на элемент, который это не поддерживает.
Небольшая предыстория. Давным-давно, в 2010 году на конференции SeleniumCamp я рассказывал про оптимизацию скорости выполнения тестов, и одна из первых рекомендаций была «используйте уже запущенный браузер повторно, не перезапускайте его для каждого теста заново». Потому что запуск браузера — весьма длительная и ресурсоёмкая операция. Чуть позже, уже в 2011 году, я написал первую статью, в которой я изложил «теоретические основы науки о запуске браузеров». Через год после этого появилась вторая статья, в которой описывалась конкретная реализация утилиты, управляющей запущенными браузерами. К ней, естественно, прилагался проект с программным кодом этой утилиты. Ещё через год я наконец выложил усовершенствованный вариант этой утилиты на GitHub, и вот теперь пришло время написать сопроводительную документацию.
Что это такое?
WebDriverFactory — это библиотека, которая помогает управлять запущенными экземплярами WebDriver (ну и браузерами тоже, поскольку каждому экземпляру драйвера соответствует свой экземпляр браузера).
- автоматически создавать драйвер (и запускать браузер) по требованию в момент первого использования,
- повторно использовать уже созданные драйверы, если есть такая возможность,
- автоматически останавливать старый и запускать новый, когда понадобился драйвер с другими характеристиками,
- автоматически запускать нового драйвера, если предыдущий экземпляр недоступен,
- останавливать все запущенные драйверы одной командой.
- автоматический перезапуск драйвера после заданного количества использований — раньше это было актуально, когда у браузера Firefox наблюдались серьёзные утечки памяти, сейчас эта «фича» уже практически невостребована, а если очень нужно — её можно реализовать при помощи несложного счётчика на уровне конфигурацинных методов тестового набора (@Before)
- автоматический останов всех драйверов при завершении работы виртуальной машины Java — эта фича осталась, но её не рекомендуется использовать, потому что с некоторыми браузерами возникают проблемы именно при остановке их из shutdown hook, так что лучше явно в конце выполнять остановку всех драйверов специальной командой.
(Вообще говоря, название «фабрика» (Factory) не совсем правильное, потому что эта библиотека реализует шаблон проектирования, который больше похож на Object Pool, но я решил оставить сложившееся исторически название, потому что и «пул» тоже является одной из вариаций общей концепции Factory).
Как подключить библиотеку к проекту?
Если вы используете Maven — достаточно просто добавить зависимости от фабрики и от самой библиотеки Selenium:
Номер последней доступной версии смотрите в центральном репозитории Maven.
Если вы не используете Maven — тогда оттуда же из центрального репозитория нужно скачать jar-файл webdriver-factory-2.0.jar (номер версии может быть другим, конечно) и подключить его к вашему проекту так, как вы подключаете другие jar-файлы.
Как это работает?
- SINGLETON — в каждый момент времени может существовать не более одного экземпляра WebDriver, управляемого фабрикой
- THREADLOCAL_SINGLETON — в каждый момент времени в каждом потоке может существовать не более одного экземпляра WebDriver, управляемого фабрикой
По умолчанию используется режим работы THREADLOCAL_SINGLETON. Режимы работы можно переключать, если нет ни одного запущенного драйвера:
Режим работы SINGLETON
- При первом запросе запускается новый драйвер (и новый браузер).
- При втором запросе, поскольку требуется драйвер с теми же характеристиками, возвращается ранее запущенный драйвер.
- При третьем запросе, поскольку требуется драйвер с другими характеристиками, предыдущий драйвер автоматически останавливается, и вместо него запускается новый, с запрашиваемыми характеристиками.
- Метод dismiss останавливает единственный существующий драйвер.
Режим работы THREADLOCAL_SINGLETON
Этот режим работы необходим при параллельном выполнении тестов в нескольких потоках, чтобы избежать конфликтов. Он работает аналогично предыдущему, но только для каждого потока проверки выполняются независимо.
То есть если весь вышеуказанный код выполняется в одном и том же потоке — всё будет работать точно так же, как описано в предыдущем разделе: сначала запускается новый драйвер, потом он повторно используется, потом он останавливается и вместо него запускается драйвер с другими характеристиками, и наконец этот последний драйвер останавливается.
Но если тесты работают в нескольких параллельно выполняющихся потоках, то второй запрос драйвера с теми же характеристиками может случиться в другом потоке, и тогда будет создан новый драйвер, несмотря на то, что драйвер с нужными характеристиками уже есть. У каждого потока свой драйвер, использовать драйвер другого потока фабрика не позволит.
Аналогично, если потребовался драйвер с другими характеристиками — он будет запущен, но остановлен при этом может быть только драйвер, который ранее был запущен в том же самом потоке. Драйверы, принадлежащие другим потокам, останутся нетронутыми.
Чем ещё полезна фабрика?
Есть у фабрики ещё пара полезных функций, помимо хранения драйверов для повторного использования и их автоматического перезапуска.
Перед тем, как вернуть клиенту существующий драйвер, фабрика проверяет, что он функционирует нормально — вызывает метод getCurrentUrl() . Если этот метод отработает успешно — фабрика вернёт клиенту этот ранее запущенный драйвер. Но если возникают проблемы, драйвер считается «испорченным», в этом случае фабрика запустит новый и вернёт его. В любом случае, клиент получит старый или новый, но работающий драйвер, удовлетворяющий заданным характеристикам.
Кроме того, поскольку фабрика хранит все запущенные драйверы, она позволяет в конце остановить все оставшиеся активные драйверы одной командой dismissAll() :
В проекте на GitHub можно посмотреть примеры использования фабрики с тестовыми фреймворками JUnit и TestNG.
Будет ли продолжение?
Возможно, в будущем появятся новые режимы работы фабрики, накладывающие меньше ограничений и ориентированные на удалённый запуск с использованием Selenium Grid. Но с концептуальной точки зрения я считаю для себя тему запуска браузеров закрытой. Впрочем, я буду рад ошибиться. Если есть какие-то идеи развития — присылайте пулл-реквесты!
Представляю перевод неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.
Предисловие от автора статьи
Selenium WebDriver – это программная библиотека для управления браузерами. WebDriver представляет собой драйверы для различных браузеров и клиентские библиотеки на разных языках программирования, предназначенные для управления этими драйверами.
По сути своей использование такого веб-драйвера сводится к созданию бота, выполняющего всю ручную работу с браузером автоматизированно.
Чаще всего Selenium WebDriver используется для тестирования функционала веб-сайтов/веб-ориентированных приложений. Автоматизированное тестирование удобно, потому что позволяет многократно запускать повторяющиеся тесты. Регрессионное тестирование, то есть, проверка, что старый код не перестал работать правильно после внесения новых изменений, является типичным примером, когда необходима автоматизация. WebDriver предоставляет все необходимые методы, обеспечивает высокую скорость теста и гарантирует корректность проверки (поскольку человеский фактор исключен). В официальной документации Selenium приводятся следующие плюсы автоматизированного тестирования веб-приложений:
- возможность проводить чаще регрессионное тестирование;
- быстрое предоставление разработчикам отчета о состоянии продукта;
- получение потенциально бесконечного числа прогонов тестов;
- обеспечение поддержки Agile и экстремальным методам разработки;
- сохранение строгой документации тестов;
- обнаружение ошибок, которые были пропущены на стадии ручного тестирования.
Также одной из незаменимых особенностей Selenium WebDriver является ожидание загрузки страницы. Сюда можно отнести случаи, когда парсинг данных на странице невозможен из-за страниц перенаправления или ожидания, содержащих примерно такой текст: «Подождите, страница загружается». Такие страницы, само собой разумеется, не является целью парсинга, однако обойти их часто не представляется возможным. Естественно, без Selenium WebDriver. Selenium WebDriver позволяет в таких случаях «ожидать», как ожидал бы человек, пока на странице, к примеру, не появится элемент с необходимым именем.
Еще один плюс Selenium заключен в том, что действия веб-драйвера видимы визуально и требуют минимального времени нахождения на странице, это позволяет с удобством демонстрировать функционал сайта, когда необходима презентация сервиса.
Некоторые проблемы WebDriver (из сети и личного опыта):
- бывает, что поведение отличается в разных браузерах;
- иногда возникают сложности с поиском элементов (XPath и другие методы иногда просто не работают, хотя должны);
- необъяснимые падения драйвера прямо посреди теста;
- взаимодействие возможно только с первой вкладкой браузера, драйвер позволяет открывать новые вкладки и новые окна, но не позволяет в них работать;
- необходимо четко продумывать архитектуру теста, часто использовать assert или ожидания, чтобы тест умел «думать», когда делать и когда нет.
Содержание:
1.1. Введение
Привязка Selenium к Python предоставляет собой простой API [Интерфейс программирования приложений (англ. Application Programming Interface) — Прим. пер.] для написания тестов функциональности/тестов соответствия требованиям с использованием веб-драйвера Selenium WebDriver. С помощью Selenium Python API вы можете интуитивно просто получить доступ ко всему функционалу Selenium WebDriver.
Привязка Python-Selenium предоставляет удобный API для доступа к таким веб-драйверам Selenium как Firefox, Ie, Chrome, Remote и других. На данный момент поддерживаются версии Python 2.7, 3.2, 3.3 и 3.4.
В данной документации рассмотрен Selenium 2 WebDriver API. Selenium 1 / Selenium RC API в ней не охвачены.
1.2. Загрузка Selenium для Python
Вы можете загрузить привязку Selenium к Python со страницы пакета selenium на PyPI. Однако, лучшим способом будет использование модуля pip. Python 3.4 содержит pip в стандартной библиотеке. Используя pip, вы можете установить selenium следующей командой:
Для создания изолированной среды Python вы можете использовать virtualenv. Также библиотека Python 3.4 содержит модуль pyvenv, который практически аналогичен virtualenv.
1.3. Подробная инструкция для пользователей Windows
ПримечаниеТеперь вы можете запускать свои тестовые скрипты, используя Python. К примеру, если вы создали скрипт на основе Selenium и сохранили его в C:\my_selenium_script.py, то вы можете запустить его следующей командой:
Для данной инсталляции вам необходим доступ к сети Интернет.
1.4. Загрузка Selenium server
Примечание
Selenium server необходим в случаях, когда вы хотите использовать remote WebDriver [удаленный — Прим. пер.]. За дополнительной информацией обращайтесь к разделу Использование Selenium с remote WebDriver. Если вы только начинаете изучать Selenium, вы можете пропустить этот раздел и продолжить изучение со следующей главы.
Selenium server написан на языке Java. Для его запуска рекомендована среда Java Runtime Environment (JRE) версии 1.6 или выше.
Вы можете скачать Selenium server 2.x на странице загрузок сайта selenium. Имя файла должно выглядеть примерно таким образом: selenium-server-standalone-2.x.x.jar. Вы всегда можете загрузить последнюю версию Selenium server 2.x.
Если Java Runtime Environment (JRE) не установлена в вашей системе, вы можете скачать JRE с сайта Oracle. Если вы используете системы GNU/Linux и имеете права root [права администратора — Прим. пер.], вы так же можете установить JRE, используя инструкции вашей системы.
Если команда java доступна в PATH (переменная окружения), вы можете запустить Selenium server используя следующую команду:
Замените 2.x.x актуальной версией Selenium server, скачанной вами с сайта.
Если JRE установлена под пользователем, не обладающим правами root и/или если она недоступна в переменной окружения PATH, вы можете ввести относительный или полный путь до файла java. Аналогично, вы можете дополнить имя jar-файла Selenium server до относительного или полного пути. После этого команда будет выглядеть так:
Продолжение перевода неофициальной документации Selenium для Python.
Перевод сделан с разрешения автора Baiju Muthukadan.
Оригинал можно найти здесь.
Содержание:
2.1. Простое использование
Если вы установили привязку Selenium к Python, вы можете начать использовать ее с помощью интерпретатора Python.
Код выше может быть сохранен в файл (к примеру, python_org_search.py), и запущен:
Запускаемый вами Python должен содержать установленный модуль selenium.
2.2. Пошаговый разбор примера
Модуль selenium.webdriver предоставляет весь функционал WebDriver'а. На данный момент WebDriver поддерживает реализации Firefox, Chrome, Ie и Remote. Класс Keys обеспечивает взаимодействие с командами клавиатуры, такими как RETURN, F1, ALT и т.д…
Далее создается элемент класса Firefox WebDriver.
Метод driver.get перенаправляет к странице URL в параметре. WebDriver будет ждать пока страница не загрузится полностью (то есть, событие “onload” игнорируется), прежде чем передать контроль вашему тесту или скрипту. Стоит отметить, что если страница использует много AJAX-кода при загрузке, то WebDriver может не распознать, загрузилась ли она полностью:
Следующая строка — это утверждение (англ. assertion), что заголовок содержит слово “Python” [assert позволяет проверять предположения о значениях произвольных данных в произвольном месте программы. По своей сути assert напоминает констатацию факта, расположенную посреди кода программы. В случаях, когда произнесенное утверждение не верно, assert возбуждает исключение. Такое поведение позволяет контролировать выполнение программы в строго определенном русле. Отличие assert от условий заключается в том, что программа с assert не приемлет иного хода событий, считая дальнейшее выполнение программы или функции бессмысленным — Прим. пер.]:
WebDriver предоставляет ряд способов получения элементов с помощью методов find_element_by_*. Для примера, элемент ввода текста input может быть найден по его атрибуту name методом find_element_by_name. Подробное описание методов поиска элементов можно найти в главе Поиск Элементов:
После ответа страницы, вы получите результат, если таковой ожидается. Чтобы удостовериться, что мы получили какой-либо результат, добавим утверждение:
В завершение, окно браузера закрывается. Вы можете также вызывать метод quit вместо close. Метод quit закроет браузер полностью, в то время как close закроет одну вкладку. Однако, в случае, когда открыта только одна вкладка, по умолчанию большинство браузеров закрывается полностью:
2.3. Использование Selenium для написания тестов
Вы можете запустить тест выше из командной строки следующей командой:
Результат сверху показывает, что тест завершился успешно.
2.4. Пошаговый разбор примера
Сначала были импортированы все основные необходимые модули. Модуль unittest встроен в Python и реализован на Java’s JUnit. Этот модуль предоставляет собой утилиту для организации тестов.
Модуль selenium.webdriver предоставляет весь функционал WebDriver'а. На данный момент WebDriver поддерживает реализации Firefox, Chrome, Ie и Remote. Класс Keys обеспечивает взаимодействие с командами клавиатуры, такими как RETURN, F1, ALT и т.д…
setUp — это часть инициализации, этот метод будет вызываться перед каждым методом теста, который вы собираетесь написать внутри класса теста. Здесь мы создаем элемент класса Firefox WebDriver.
Далее описан метод нашего теста. Метод теста всегда должен начинаться с фразы test. Первая строка метода создает локальную ссылку на объект драйвера, созданный методом setUp.
Метод driver.get перенаправляет к странице URL в параметре. WebDriver будет ждать пока страница не загрузится полностью (то есть, событие “onload” игнорируется), прежде чем передать контроль вашему тесту или скрипту. Стоит отметить, что если страница использует много AJAX-кода при загрузке, то WebDriver может не распознать, загрузилась ли она полностью:
Следующая строка — это утверждение, что заголовок содержит слово “Python”:
WebDriver предоставляет ряд способов получения элементов с помощью методов find_element_by_*. Для примера, элемент ввода текста input может быть найден по его атрибуту name методом find_element_by_name. Подробное описание методов поиска элементов можно найти в главе Поиск Элементов:
После ответа страницы, вы получите результат, если таковой ожидается. Чтобы удостовериться, что мы получили какой-либо результат, добавим утверждение:
Метод tearDown будет вызван после каждого метода теста. Это метод для действий чистки. В текущем методе реализовано закрытие окна браузера. Вы можете также вызывать метод quit вместо close. Метод quit закроет браузер полностью, в то время как close закроет одну вкладку. Однако, в случае, когда открыта только одна вкладка, по умолчанию большинство браузеров закрывается полностью.:
Завершающий код — это стандартная вставка кода для запуска набора тестов [Сравнение __name__ с "__main__" означает, что модуль (файл программы) запущен как отдельная программа («main» (англ.) — «основная», «главная») (а не импортирован из другого модуля). Если вы импортируете модуль, атрибут модуля __name__ будет равен имени файла без каталога и расширения — Прим. пер.]:
2.5. Использование Selenium с remote WebDriver
Для использования remote WebDriver (удаленного веб-драйвера) необходимо запустить Selenium server. Для запуска сервера используйте команду:
Строка выше сообщает о том, что вы можете использовать указанный URL для подключения remote WebDriver. Ниже приводится несколько примеров:
Переменная desired_capabilities — это словарь. Вместо того, чтобы использовать словари по умолчанию, вы можете явно прописать значения:
Впервые выпущенная более 30 лет назад Microsoft Windows сегодня является неоспоримым лидером среди настольных операционных систем. Это просто нельзя игнорировать при разработке веб-приложений. В этой статье я хотел бы обсудить некоторые особенности использования Selenium под Windows и предложить простое и проверенное в боевых условиях решение, значительно упрощающее жизнь.
Чем Windows отличается от Linux
В своих предыдущих статьях (первая, вторая, третья) я описал подходы и инструменты с открытым кодом, позволяющие организовать масштабируемый кластер Selenium. Мы также поговорили о том, как при помощи тех же инструментов эффективно запускать тесты на машине разработчика. Во всех статьях в качестве операционной системы использовался Linux. Чем же Windows отличается от Linux с точки зрения Selenium?
- Наличие браузеров, не существующих на других платформах. В зависимости от версии, Windows поставляется с предустановленным Internet Explorer (IE) или Microsoft Edge. Единовременно может быть установлена только одна версия каждого браузера. Для обоих браузеров имеются готовые исполняемые файлы web-драйверов (IEDriverServer и EdgeDriver соответственно), которые используют вызовы Windows API для запуска и управления браузером. С этой стороны Windows браузеры архитектурно ничем не отличаются от браузеров на Linux.
- Графический интерфейс встроен в операционную систему. Большинство версий Windows (кроме последних версий Windows Server) имеют встроенный графический интерфейс, который нельзя ни отключить ни заменить другим графическим сервером. Интерфейс автоматически стартует вместе с операционной системой и постоянно потребляет ресурсы. Кроме того графический интерфейс Windows по-умолчанию отображает все открываемые окна (в том числе и окна браузеров) в одном и том же рабочем столе и только одно из этих окон может быть в фокусе в заданный момент времени. Из-за этого попытки запустить несколько IE или Edge параллельно часто приводят к различным проблемам с фокусом окна: отличающиеся CSS-стили (например, при наведении на ссылки), не срабатывающие события DOM и так далее. Эта проблема очень мешает работе.
- Практически полное отсуствие поддержки Docker. Последние версии Windows Server поддерживают большинство функций Docker нативно, но на интересующих нас настольных версиях нет такой поддержки. Поэтому единственный способ запустить Docker на этих версиях — при помощи виртуальной машины с Linux, в которую установлен Docker.
Как видите многие современные подходы при работе с Selenium: использование X сервера без монитора и запуск браузеров в контейнерах не работают в Windows. Но можно ли достичь сходной с Linux производительности и обойти известные ограничения Windows? Да, и это проще, чем вы могли бы подумать! В следующих разделах я расскажу как это сделать.
Создаем порядок из хаоса
Мы будем двигаться к поставленной цели шаг за шагом. Для начала сделаем решение как можно проще. Как известно, обычная схема установки Selenium на Windows выглядит так:
Схема состоит из Selenium сервера, запущенного при помощи виртуальной машины Java (JRE), затем исполняемый файл IEDriverServer или EdgeDriver и, наконец, сам браузер — IE или Edge. В этой цепочке есть как минимум одно слабое звено — Selenium сервер и Java. Все потому, что Selenium здесь выступает в роли простого прокси-сервера, который запускает процесс драйвера на случайном порту и затем отправляет все запросы на этот порт. Проксирование сетевого трафика — простейшая задача в любом языке программирования, потому что основная работа выполняется сетевой подсистемой операционной системы. Именно поэтому установка Java (50 и более Мб) и скачивание Selenium server (20 и более Мб) для простого проксирования выглядит чересчур громоздким решением. Более того Selenium сервер плохо работает под нагрузкой:
Как заменить Selenium сервер на Selenoid
Selenoid — это легковесная замена Selenium сервера, написанная на языке Go. Selenoid поставляется в виде одного маленького (около 7 Мб) исполняемого файла и не имеет внешних зависимостей. Для начала использования нужно просто скачать и запустить этот файл. В моей предыдущей статье я кратко описал насколько удобным может быть Selenoid для запуска браузеров в Docker контейнерах — основного его назначения. Второй поддерживаемый режим — это запуск исполняемых файлов вместо контейнеров и проксирование сетевого трафика в них — также, как Selenium сервер делает это с IEDriverServer и EdgeDriver. Заменить Selenium сервер на Selenoid очень просто. Для примера, запустим Internet Explorer при помощи Selenoid:
- Скачиваем исполняемый файл Selenoid со страницы релизов. Исполняемый файл обычно называется selenoid_windows_386.exe для 32-битной Windows и selenoid_windows_amd64.exe для Windows 64 bit. Насколько мне известно настольные версии Windows не имеют встроенной консольной программы для скачивания файлов. Но, если у вас установлен Cygwin и curl, то скачать файл можно так:
- Скачиваем и распаковываем архив с IEDriverServer.exe со страницы загрузок Selenium. К примеру сохраним IEDriverServer.exe в C:\ .
- Настраиваем Internet Explorer как описано в вики.
- Создаем простой файл конфигурации для Selenoid — browsers.json :
Запускаем Selenoid вместо Selenium сервера (порт 4444 должен быть свободен) при помощи вот такого файла selenoid.bat :
Здесь мы предполагаем, что все файлы из предыдущих шагов были сохранены в C:\ . Логи Selenoid будут сохранены в C:\selenoid.log . Обратите внимание на параметр -limit — он определяет сколько сессий можно запустить одновременно. Когда указанное количество сессий запущено — новые запросы становятся в очередь точно также, как в Selenium сервере.
Запускаем тесты на нескольких рабочих столах
После замены Selenium сервера на Selenoid вы увидите значительное снижение потребления памяти и CPU. Этот простой шаг может даже позволить вам запускать больше браузеров параллельно. Тем не менее простая замена не лечит проблемы с открытием нескольких окон браузеров одновременно. Окна по-прежнему показывается на одном рабочем столе и продолжают терять фокус. Для того, чтобы обойти это препятствие требуется научиться запускать браузеры в отдельных рабочих столах. Хорошая новость — внутренние API Windows даже в настольных версиях имеют поддержку виртуальных рабочих столов — можно переключаться между рабочими столами и запускать окна в этих рабочих столах независимо друг от друга. Но есть новость получше — не нужно погружаться во внутренности Windows, чтобы получить такое поведение для Selenium — нужная функциональность уже реализована в проекте headless-selenium-for-win. Скачав релиз, вы получите архив с двумя исполняемыми файлами: desktop_utils.exe и headless_ie_selenium.exe .
Первый из них — это консольная утилита для ручного переключения между рабочими столами. Команда выглядит примерно так:
Для работы с Selenium нам потребуется вторая утилита — headless_ie_selenium.exe . Она является надстройкой к IEDriverServer.exe , обрабатывающей запросы на сессии и автоматически запускающей IEDriverServer.exe в новом рабочем столе. headless_ie_selenium.exe должна лежать в одном каталоге с IEDriverServer.exe . Для того, чтобы использовать утилиту с Selenoid нужно просто заменить пусть до исполняемого файла в browsers.json и перезапустить Selenoid:
Теперь все проблемы с фокусом окон должны уйти.
Немного магии с Selenium capabilities
Простой заменой Selenium на Selenoid и IEDriverServer.exe на headless_ie_selenium.exe мы решили наиболее острые проблемы Selenium под Windows. Давайте сделаем из алмаза бриллиант, выставив несколько полезных capabilities в тестах.
Также не забудьте выставить:
Заключение
В этой статье я коротко описал основные проблемы, с которыми вы можете столкнуться при запуске Selenium тестов под Windows и предложил простое решение. Я продолжаю утверждать — тесты в Selenium могут не доставлять боли. Нужно только правильно уметь его готовить.
Читайте также: