Rate this post

Готовим плейбукnnДля работы Selenium Server понадобится Java, драйверы и браузеры. Мы будем устанавливать драйверы и браузеры Firefox и Chrome как наиболее популярные. Для тестирования основных функций этого более чем достаточно. Основы работы в Ansible можно найти на сайте проекта. В плейбуке оставлены основные функции, достаточные для работы. При необходимости можно расширить.nnДля удобства последующего обновления задаем переменные. Пока будем запускать две копии Selenium Server на портах, указанных в selenium.ports. При желании можно расширить на любое количество, просто добавив нужные номера.n

$ nano group_vars/selenium/vars.ymlnchromedriver: 2.31ngeckodriver: v0.18.0nselenium:nports:n- '4444'n- '4445'nversion: 3.5.3

Указываем роли.n

selenium.ymln- hosts: seleniumnbecome: Truenbecome_method: sudonroles:n- javan- selenium

Для работы будем использовать официальную версию Java от Oracle, для установки которой необходимо подключить репозиторий.n

roles/java/tasks/main.ymln- name: add repo for java 8napt_repository:nrepo: 'ppa:webupd8team/java'

При установке пакета задаются вопросы, поэтому нужно сконфигурировать ответ.n

- name: configure java 8 installationndebconf:ame: oracle-java8-installernquestion: shared/accepted-oracle-license-v1-1nvalue: 'true'nvtype: select

Ставим пакеты. name:n

name: install java 8napt:ame: '{{item}}'nupdate_cache: Truencache_valid_time: 3600nwith_items:n- oracle-java8-installern- oracle-java8-set-default

Роль простая. При необходимости ее можно использовать для развертывания Java на других серверах.nnТеперь Selenium. Для работы понадобятся веб-браузеры (можно поставить один из них), драйверы и собственно Selenium. Версию самого Selenium, драйвера и веб-браузера не обязательно брать последнюю. Проекты развиваются, и постоянно происходят разные нестыковки. Хотя в последнем релизе селениума обычно устраняют все известные проблемы.n

$ nano roles/selenium/tasks/main.yml

Добавляем ключ и репозиторий Google Chrome.n

- name: Add Google signing keynapt_key:nurl: 'https://dl-ssl.google.com/linux/linux_signing_key.pub'nstate: presentn- name: Add Chrome reponapt_repository:nrepo: 'deb http://dl.google.com/linux/chrome/deb/ stable main'nfilename: 'google-chrome'

Все остальные зависимости уже есть в репозитории. Запуск Selenium Server на сервере без графической оболочки требует framebuffer сервера – xvfb.n

- name: Install browsernapt:npkg: "{{ item }}"nstate: presentnupdate_cache: yesncache_valid_time: 3600nwith_items:n- xvfbn- firefoxn- google-chrome-stable

Создадим каталог для файлов Selenium. Я предпочитаю все класть в /opt. name:n

- name: Create selenium directorynfile:npath: /opt/seleniumnstate: directory

Скачиваем сервер selenium-server-standalone и копируем на свое место.n

- name: Download Seleniumnget_url:nurl: "http://selenium-release.storage.googleapis.com/ ↵n{{ selenium.version | regex_replace('\\.[0-9]+$', ↵n'') }}/selenium-server-standalone-{{ ↵nselenium.version }}.jar"ndest: "/opt/selenium/selenium-server-standalone.jar"

Драйверы должны быть видны в переменой PATH. Поэтому каталог для них другой. Можно положить в тот же каталог, что и selenium-server, и изменить настройки, но так более универсально.n

- name: Download and untar geckodriver tarballnunarchive:nsrc: "https://github.com/mozilla/geckodriver/releases/ ↵ndownload/{{ geckodriver }}/ ↵ngeckodriver-{{ geckodriver }}-linux64.tar.gz"ndest: "/usr/bin"ncopy: noncreates: "/usr/bin/geckodriver"n- name: download and unzip chromedriver tarballnunarchive:nsrc: "http://chromedriver.storage.googleapis.com/ ↵n{{ chromedriver }}/chromedriver_linux64.zip"ndest: "/usr/bin"ncopy: noncreates: "/usr/bin/chromedriver"

Теперь осталось все это запустить. Так как планируется использовать несколько копий Selenium Server ,то для запуска используем шаблон.n

- name: Create selenium systemd filesntemplate:nsrc: selenium.service.j2ndest: "/etc/systemd/system/selenium-{{ item }}.service"nwith_items: '{{ selenium.ports }}'

В результате работы этой части в каталоге /etc/systemd/ system будет создано несколько файлов с именем вроде selenium-4444.service. Включаем автозагрузку сервисов при перезагрузке ОС.n

- name: Enable selenium. servicensystemd:ame: "selenium-{{ item }}.service"nenabled: truendaemon_reload: yesnstate: restartednwith_items: '{{ selenium.ports }}'

Команда для запуска сервера Selenium такая:n

xvfb-run -a -s "-screen 0 1920x1080x24" /usr/bin/java ↵n-jar /opt/selenium/selenium-server-standalone.jar ↵n-port 4444

По умолчанию используется порт 4444, остальным копиям можно задавать любые удобные. Осталось написать шаблон для запуска сервиса через systemd.nnСам шаблон с именем selenium.service.j2 копируем в каталог roles/selenium/templates.n

[Unit]nDescription=SelenuimnAfter=syslog.targetn[Service]nUser=rootnEnvironment=DBUS_SESSION_BUS_ADDRESS=/dev/nullnExecStart=/usr/bin/xvfb-run -a -s "-screen 0 1920x1080x24" ↵n/usr/bin/java -jar /opt/selenium/ ↵nselenium-server-standalone.jar -port {{ item }} ↵n-log /var/log/selenium-{{ item }}.lognSuccessExitStatus=0nRestart=alwaysnRestartSec=30n[Install]nWantedBy=multi-user.target

Два момента. Запуск здесь происходит от root, это не очень хорошо. Лучше создать отдельную учетную запись, дав права на доступ в рабочие каталоги. Журналы при большом количестве очень быстро разрастаются и забирают много места. Если они не нужны, то после отладки их лучше отключить и настроить ротацию.nnПосле запуска плейбука netstat покажет, что слушаются нужные порты. Можем подключиться к ним в браузере http:// server_ip:4444/wd/hub (см. рис. 1) и попробовать создать сессию (см. рис. 2).Работающий Selenium Server Если все нормально, то задача, считаем, выполнена. Так как Selenium никак не авторизируются, то, если используется сервер, находящийся за пределами внутренней сети, порты лучше прикрыть при помощи iptables, разрешив доступ только с определенных IP. Правила можно сразу генерировать плейбуком.n

Создаем сессию ansiblenНаша компания предоставляет услуги Devops администратора, обращайтесь [email protected] и мы поможем автоматизировать процессы.