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

Алексей Багрянцев

Алексей Багрянцев

IT-копирайтер

#Инсайты

19 Ноя 2012

Время чтения: 6 минут

19 Ноя 2012

Прочитав заглавие статьи, Вы, наверняка, зададитесь вопросом «А зачем это нужно?» с последующими утверждениями, что «это же медленно!», да и вообще «это же совсем не целевое использование такого замечательного средства для тестирования как Selenium server». Всему свое время и, в этой небольшой статье я попытаюсь ответить на ваши вопросы.

Начнем с того, что кратко расскажем, что же такое Selenium и для чего он нужен. Главным образом Selenium — это инструмент для автоматизации тестирования Web-приложений, как проект был начат в июне 2004 года и на текущий момент включает несколько инструментов. В совокупности набор инструментов Selenium предоставляет богатый набор возможностей для тестирования Web-приложений различных типов. Ключевыми особенностями Selenium является возможность запуска в различных браузерах и использование нескольких типов селекторов для идентификации элементов страницы (например, XPath или CSS селекторы).

Набор инструментов Selenium

Selenium включает несколько инструментов с разным назначением:

  1. Selenium 2 (или Selenium Webdriver)

Новое направление развития проекта Selenium: результат слияния двух проектов WebDriver и Selenium1. Каждый из этих продуктов обладал своими достоинствами, поэтому разработчики пришли к мысли слияния проектов для получения более надежного и развитого инструмента автоматизации.

  1. Selenium 1 (или Selenium Remote Control)

На протяжении длительного времени Selenium RC был основным направлением развития проекта, пока в результате слияния WebDriver и Selenium не появился Selenium 2, более новый и мощный инструмент, однако Selenium 1 все еще активно поддерживается.

  1. Selenium IDE

Представляет собой инструмент для разработки и создания прототипов тестовых сценариев. Это плагин для браузера Firefox, с простым и удобным интерфейсом для создания автоматизированных тестов.

  1. 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-пар.

Итак, подытожим причины:

  1. Ограниченность или отсутствие API;
  2. Существенное различие интерфейсов API и требование дополнительных библиотек;
  3. Сложность анализа и разбора отсылаемых запросов и получаемых ответов;
  4. Механизмы защиты внешних ресурсов и специфика их внутренней реализации;
  5. Быстрота внесения изменений и разработки в целом;

Но что же со временем и стабильностью исполнения, скажете вы? Единственное действительно уязвимое место данного подхода. Использование данного подхода имеет смысл для автоматизации действий, не критичных ко времени исполнения, возможно, массовые действия с использованием очереди. Время исполнения той или иной операции с использованием Selenium-подхода всегда можно оптимизировать, как это было сделано и в реализуемой системе. Что касается стабильности, то ее тоже довольно легко можно вывести на приемлемый уровень путем реализации дополнительных компонент, направленных на увеличение стабильности работы с Selenium-сервером, занимающихся мониторингом процессов, так или иначе связанных с работой Selenium-сервера. Кроме того, в сети можно найти большое количество статей о том, как ускорить работу Selenium-сервера.

Установка и настройка Selenium-сервера

Рассмотрим на примере CentOS последовательность шагов по установке и настройке Selenium-сервера, с последующим его использованием в PHP:

  1. Устанавливаем  Java:
yum install java;
  1. Скачиваем виртуальный буфер для эмуляции иксов:
yum install Xvfb;
  1. Пишем скрипт демонизации для xvfb (прилагаться не будет):
/etc/init.d/xvfb
  1. Меняем параметры и запускаем:
chmod +x /etc/init.d/xvfb

chkconfig xvfb on

service xvfb start
  1. Качаем 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/
  1. Пишим скрипт загрузки (прилагаться не будет):

/etc/init.d/selenium
  1. Не забудьте параметры, необходимые для полноценного использования Selenium-сервера:

PARAMS="-disable-web-security -ignore-certificate-errors -interactive -multiWindow -trustAllSSLCertificates"
  1. Запускаем Selenium:

chmod +x /etc/init.d/selenium

chkconfig selenium on

service selenium start
  1. Ставим браузер (рекомендации: лучше google chrome, не забудьте сперва добавить репу /etc/yum.repos.d/google.repo):

yum install google-chrome-stable
  1. Возможно вам придется добавить WebDriver для браузера Google Chrome:

PARAMS="-disable-web-security -ignore-certificate-errors -interactive -multiWindow -trustAllSSLCertificates -
Dwebdriver.chrome.driver=/var/….. /chromedriver"
  1. Ставим PHPUnit:

yum install php-pear

pear install phpunit/PHPUnit_Selenium
  1. Добавьте каналы:

pear channel-discover pear.phpunit.de

pear channel-discover pear.symfony-project.com

pear channel-discover components.ez.no
  1. Добавляем возможность работы с Selenium-сервером из PHP:

pear install -a Testing_Selenium-0.4.4

Итог

Использование Selenium сервера для автоматизации действий пользователя не в целях тестирования имеет смыл в проектах, не критичных ко времени исполнения. Очевидные плюсы заключаются в простоте разработки и внесении изменений — не нужно анализировать каждый запрос. Отличное «расширение» существующего API до требуемого уровня 😉

Комментарии

Фильтр

Закрыть

Технологии

Индустрии