Использование Selenium сервера для автоматизации работы с внешними ресурсами

IT-копирайтер
Время чтения: 6 минут
Прочитав заглавие статьи, Вы, наверняка, зададитесь вопросом «А зачем это нужно?» с последующими утверждениями, что «это же медленно!», да и вообще «это же совсем не целевое использование такого замечательного средства для тестирования как Selenium server». Всему свое время и, в этой небольшой статье я попытаюсь ответить на ваши вопросы.
Начнем с того, что кратко расскажем, что же такое Selenium и для чего он нужен. Главным образом Selenium — это инструмент для автоматизации тестирования Web-приложений, как проект был начат в июне 2004 года и на текущий момент включает несколько инструментов. В совокупности набор инструментов Selenium предоставляет богатый набор возможностей для тестирования Web-приложений различных типов. Ключевыми особенностями Selenium является возможность запуска в различных браузерах и использование нескольких типов селекторов для идентификации элементов страницы (например, XPath или CSS селекторы).
Набор инструментов Selenium
Selenium включает несколько инструментов с разным назначением:
-
Selenium 2 (или Selenium Webdriver)
Новое направление развития проекта Selenium: результат слияния двух проектов WebDriver и Selenium1. Каждый из этих продуктов обладал своими достоинствами, поэтому разработчики пришли к мысли слияния проектов для получения более надежного и развитого инструмента автоматизации.
-
Selenium 1 (или Selenium Remote Control)
На протяжении длительного времени Selenium RC был основным направлением развития проекта, пока в результате слияния WebDriver и Selenium не появился Selenium 2, более новый и мощный инструмент, однако Selenium 1 все еще активно поддерживается.
-
Selenium IDE
Представляет собой инструмент для разработки и создания прототипов тестовых сценариев. Это плагин для браузера Firefox, с простым и удобным интерфейсом для создания автоматизированных тестов.
-
Selenium Grid
Selenium Grid позволяет масштабировать большие тестовые наборы, а также запускать тесты, которые необходимо выполнить в нескольких окружениях. Selenium Grid позволяет запускать тесты параллельно, то есть разные тесты могут быть запущены в одно и то же время на нескольких удаленных машинах.
Использование Selenium не в целях тестирования в реальном проекте
В качестве примера рассмотрим реальный проект по реализации одной крупной Web-системы, которая должна была взаимодействовать с большим количеством внешних ресурсов. О внутренней структуре и организации сторонних ресурсах мы ничего не знаем, хотя спокойно можем создать в них новый аккаунт или можем использовать уже существующий с помощью предоставляемого web-интерфейса. Реализуемая система кроме этого представляла собой «агрегатор аккаунтов» сторонних ресурсов и способна была выполнять определенный набор операций над ними. По большей степени набор операций был одинаков для всех сторонних ресурсов. Операции выполнялись с помощью использования предоставляемого ресурсом API, но при добавлении очередного ресурса в систему разработчики столкнулись с проблемой ограниченности и недостаточности API, кроме того некоторые ресурсы не предоставляли ровным счетом никакого API, а включить их в создаваемую систему было просто необходимо.
Таким образом, одни ресурсы предоставляли довольно хорошую реализацию API, с полным набором необходимых методов, другие же либо имели скудное API с ограниченными возможностями, либо не имели его вообще. Кроме этого, предоставляемое ресурсами API зачастую имело разный интерфейс и требовало использование дополнительных специфических библиотек, включение которых в проект, значительно увеличивало его размер, поэтому говорить о каком-то стандартном методе использования API речи и не шло. Единственный вариант общей реализации в этом случае заключался в имплементации набора адаптеров для каждого нового ресурса.
Поэтому возникла идея использования «Selenium-подхода». Действительно, мы ведь можем сымитировать действия пользователя на стороннем ресурсе. Запустить реальный браузер, забить значения в поля, сделать необходимую цепочку переходов и выйти из аккаунта.
Конечно, вы скажете, что можно анализировать и разбирать запросы. Зачем поднимать сервер для этого? Это же медленно! Гораздо проще проанализировать пары каждого запроса в цепочке переходов и реализовать их с помощью какой-нибудь CURL-based библиотеки на сервере. Ответ будет довольно простым, из личного опыта разработчиков системы следует вывод: во-первых, разработка в этом случае затягивается, по причине довольно сложных запросов и ответов, средств защиты, например:
- Наличие различных проверочных hash-значений в запросах
- JS-based cookies
- Последовательность пересылок при переходе
- Большое количество ajax-запросов
- Проверка специфических заголовков запроса
Во-вторых, внешние ресурсы часто что-то меняют, и оперативно внести изменения в реализуемую систему гораздо проще и быстрее в случае «Selenium»-подхода, чем в “переанализе» request/response-пар.
Итак, подытожим причины:
- Ограниченность или отсутствие API;
- Существенное различие интерфейсов API и требование дополнительных библиотек;
- Сложность анализа и разбора отсылаемых запросов и получаемых ответов;
- Механизмы защиты внешних ресурсов и специфика их внутренней реализации;
- Быстрота внесения изменений и разработки в целом;
Но что же со временем и стабильностью исполнения, скажете вы? Единственное действительно уязвимое место данного подхода. Использование данного подхода имеет смысл для автоматизации действий, не критичных ко времени исполнения, возможно, массовые действия с использованием очереди. Время исполнения той или иной операции с использованием Selenium-подхода всегда можно оптимизировать, как это было сделано и в реализуемой системе. Что касается стабильности, то ее тоже довольно легко можно вывести на приемлемый уровень путем реализации дополнительных компонент, направленных на увеличение стабильности работы с Selenium-сервером, занимающихся мониторингом процессов, так или иначе связанных с работой Selenium-сервера. Кроме того, в сети можно найти большое количество статей о том, как ускорить работу Selenium-сервера.
Установка и настройка Selenium-сервера
Рассмотрим на примере CentOS последовательность шагов по установке и настройке Selenium-сервера, с последующим его использованием в PHP:
- Устанавливаем Java:
yum install java;
- Скачиваем виртуальный буфер для эмуляции иксов:
yum install Xvfb;
- Пишем скрипт демонизации для xvfb (прилагаться не будет):
/etc/init.d/xvfb
- Меняем параметры и запускаем:
chmod +x /etc/init.d/xvfb chkconfig xvfb on service xvfb start
-
Качаем Selenium (версия может отличаться на момент развертывания сервера):
cd /usr/local/lib/selenium wget http://selenium.googlecode.com/files/selenium-server-standalone-2.20.0.jar mkdir -p /var/log/selenium/ chmod a+w /var/log/selenium/
-
Пишим скрипт загрузки (прилагаться не будет):
/etc/init.d/selenium
-
Не забудьте параметры, необходимые для полноценного использования Selenium-сервера:
PARAMS="-disable-web-security -ignore-certificate-errors -interactive -multiWindow -trustAllSSLCertificates"
-
Запускаем Selenium:
chmod +x /etc/init.d/selenium chkconfig selenium on service selenium start
-
Ставим браузер (рекомендации: лучше google chrome, не забудьте сперва добавить репу /etc/yum.repos.d/google.repo):
yum install google-chrome-stable
-
Возможно вам придется добавить WebDriver для браузера Google Chrome:
PARAMS="-disable-web-security -ignore-certificate-errors -interactive -multiWindow -trustAllSSLCertificates - Dwebdriver.chrome.driver=/var/….. /chromedriver"
-
Ставим PHPUnit:
yum install php-pear pear install phpunit/PHPUnit_Selenium
-
Добавьте каналы:
pear channel-discover pear.phpunit.de pear channel-discover pear.symfony-project.com pear channel-discover components.ez.no
-
Добавляем возможность работы с Selenium-сервером из PHP:
pear install -a Testing_Selenium-0.4.4
Итог
Использование Selenium сервера для автоматизации действий пользователя не в целях тестирования имеет смыл в проектах, не критичных ко времени исполнения. Очевидные плюсы заключаются в простоте разработки и внесении изменений — не нужно анализировать каждый запрос. Отличное «расширение» существующего API до требуемого уровня 😉
Комментарии