Selenium за 60 секунд

    Представляю вам перевод моей статьи на Medium.com.


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




    Проблема


    Как веб-разработчик или инженер по автоматизации тестирования вы можете столкнуться со следующими неудобствами при работе со стандартным Selenium сервером:


    1. Нужно устаналивать несколько разных браузеров себе на компьютер. В обычной жизни вы, как правило, используете один браузер, например, Chrome, но вам приходится устанавливать себе Firefox и Opera, чтобы отлаживать в них Selenium-тесты.
    2. Трудно устанавливать и использовать несколько версий одного браузера. Если вы устанавливаете браузер из пакетов, то вообще можно иметь только одну установленную версию. Кроме того Selenium и его веб-драйверы обычно ищут исполняемый файл браузера по определенному пути. Поэтому, поверьте, использовать несколько версий может быть трудной задачей.
    3. Если вы запускаете браузер, установленный в вашей операционной системе — он забивает место на диске своими временными файлами и содержимым кеша.
    4. Нельзя гарантировать, что настройки браузера всегда останутся в том же состоянии, как после чистой установки. Например, вы можете случайно изменить адрес прокси-сервера или настройки безопасности. Это может привести к падению ранее работавших тестов.
    5. Трудно запускать несколько тестов в разных браузерах параллельно. Попытка сделать это как правило приводит к различным проблемам: окна начинают конкурировать за фокус, не срабатывающие события, не ожидаемые CSS стили и так далее.
    6. Нужно знать какая версия Selenium совместима с какой версией браузера. То же самое верно для исполняемых файлов веб-драйверов (например, Chromedriver).

    Приведенный выше список недостатков далеко не полный. Но давайте остановимся на этом и попробуем гораздо более удобный способ отладки Selenium-тестов локально.


    Selenoid


    В моей предыдущей статье (часть I, часть II) я коротко описал новые открытые инструменты для работы с Selenium: Ggr и Selenoid. Ggr в основном нужен для больших Selenium кластеров и не нужен для отладки тестов на вашей машине. Сегодня я более подробно расскажу о Selenoid — альтернативной реализации Selenium хаба, которая запускает браузеры в Docker контейнерах.


    Но почему же запуск браузеров в контейнерах так удобен? И в чем разница между запуском браузеров из контейнеров, поставляемых разработчиками Selenium и Selenoid? — Основная идея Selenoid состоит в том, чтобы запускать новый контейнер для каждой Selenium сессии (т.е. запроса нового браузера) и останавливать их сразу же после закрытия сессии. Такой подход сразу же решает все проблемы связанные с залипанием состояния в кешах и использования одних настроек браузера в разных сессиях. В каждом контейнере находится конкретная версия браузера, правильная версия веб-драйвера или Selenium сервера, поддерживающая этот браузер и все зависимости наподобие шрифтов, графических библиотек и так далее. Более того, контейнеры обеспечивают достаточный уровень изоляции процессов браузеров. Это позволяет запускать неограниченное количество разлиных версий браузеров параллельно и забыть о проблемах с фокусом. Безусловно, эти же проблемы решаются и обычными Selenium контейнерами. Но для того, чтобы получить поведение, аналогичное Selenoid, в дополнение к Docker как правило требуется использовать сложные админские инструменты наподобие Ansible или Salt.


    Установка


    Немного порекламировав Selenoid, настало время показать как просто с ним работать. Для того, чтобы получить работающий Selenium нужно выполнить 3 коротких шага:


    1. Установить Docker. Обычно это делается при помощи стандартного менеджера пакетов вашей операционной системы такого как APT, Yum или Homebrew. Подробности можно найти в документации Docker.


    2. Создать каталог для хранения конфигурации Selenoid и сгенерировать конфигурационный файл:


      # mkdir -p /etc/selenoid
      # docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aerokube/cm:1.0.0 selenoid \
        --last-versions 2 --tmpfs 128 --pull > /etc/selenoid/browsers.json

      Последняя команда также скачает образы Docker-контейнеров двух последних версий Firefox, Chrome и Opera и сгенерирует правильный файл конфигурации для Selenoid.


    3. Запустить Selenoid:

    # docker run -d --name selenoid -p 4444:4444 -v /etc/selenoid:/etc/selenoid:ro \
          -v /var/run/docker.sock:/var/run/docker.sock aerokube/selenoid:1.1.1

    Все — прошло 60 секунд и Selenoid готов к работе. Не нужно устанавливать Java и скачивать Selenium руками. Просто запустите свои тесты, используя тот же самый URL, что и у обычного Selenium server:


    http://localhost:4444/wd/hub

    Мордочка и сбор статистики


    Selenoid может использоваться совместно с Ggr для настройки большого Selenium кластера, поэтому у него нет графического интерфейса наподобие Grid Console в обычном Selenium. Посмотреть потребление браузеров можно двумя способами:


    I. Запустить дополнительный легковесный контейнер с Selenoid UI. Это делается командой:


    # docker run -d --name selenoid-ui --net host aerokube/selenoid-ui:1.0.0

    Мордочка будет доступна в браузере по адресу http://localhost:8080/:



    II. Отправлять статистику Selenoid во внешнюю систему: Graphite, InfluxDB, ElasticSearch и так далее. Статистика Selenoid может быть получена по следующему URL:


    http://localhost:4444/status

    Данные отправляются в виде JSON следующего формата:


      $ curl http://localhost:4444/status
      {
        "total": 80,
        "used": 14,
        "queued": 0,
        "pending": 1,
        "browsers": {
          "firefox": {
            "46.0": {
              "user1": 5,
              "user2": 6
            },
            "48.0": {
              "user2": 3
            }
          }
        }
      }

    Selenoid возвращает сколько контейнеров может быть запущено одновременно (total), сколько запущено в данный момент (used), сколько запросов ожидают в очереди (queued) и сколько контейнеров еще стартуют (pending). Элемент browsers содержит информацию о потреблении браузеров различными пользователями. Имя пользователя извлекается из Basic HTTP headers, если они выставлены или выставляется в unknown, если нет. Хотя вы можете разбирать показанный JSON вручную при помощи скрипта, мы рекомендуем использовать для этой цели Telegraf. Больше информации о том, как использовать Telegraf изложено в этом разделе нашей документации.


    Готовые контейнеры с браузерами


    Согласитесь, круто иметь инструмент, автоматически запускающий контейнеры с разными браузерами. Но еще круче иметь набор готовых контейнеров с разными версиями популярных браузеров. Мы проделали много работы и подготовили образы контейнеров с разными версиями Firefox, Chrome и Opera. Полный список можно посмотреть на selenoid@DockerHub.


    Чтобы всегда иметь набор свежих версий браузеров нужно лишь время от времени выполнять команду:


    # docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aerokube/cm:1.0.0 \
        selenoid --last-versions 2 --tmpfs 128 --pull > /etc/selenoid/browsers.json

    Эта команда автоматически скачивает последние версии контейнеров и генерирует новую JSON-конфигурацию для Selenoid. Чтобы начать использовать новые браузеры отправьте Selenoid команду на перечитывание конфигурации (можно делать под нагрузкой):


    # docker kill -s HUP selenoid

    Наши контейнеры также поддерживают возможность установки произвольно разрешения экрана (по-умолчанию 1920x1080x24). Чтобы выставить разрешение просто передайте capability screenResolution:


    screenResolution: "1280x1024x24"

    Заключение


    В этой статье я рассказал как эффективно управлять различными браузерами при помощи Selenoid. Поверьте — работа с Selenium может быть комфортной. Если вам интересны вопросы построения эффективной инфраструктуры тестирования, вы можете взглянуть на другие открытые инструменты в нашей организации на Github или подпишитесь на наш Твиттер @aerokube.


    В благодарность автору замечательной картинки, посмотрите как ее рисовали.

    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 20
    • 0
      Спасибо. А есть статья по построению эффективной инфраструктуры тестирования? Очень интересно как все это правильно организовать.
      • 0
        Вас интересует именно Selenium или запуск автотестов тоже? Про Selenium было вот такое: https://habrahabr.ru/post/322742/
        • 0
          О спасибо. Как то я её пропустил. Конечно не только selenium, а правильный подход к правильной структуре системы функционального и нагрузочного тестирования с возможностью масштабирования, основанный на современном инструментарии.
          • 0
            Мы в Aerokube сейчас делаем масштабируемое решение по параллельному запуску автотестов в контейнерах примерно аналогичное Selenoid. Пока показать нечего. Когда будет первый работающий прототип, напишем об этом.
            • 0
              Спасибо. Будем ждать.
      • 0
        Заинтересовало, но уже в разделе Установка понял, что это не для Windows.
        Сам докер для windows есть, но вот команды, которые приводятся Вами предназначены для линукса. И описания нет.
        Можете привести описание настроек для докера под windows? Тогда бы Вашей статье цены не было бы! :)
        • +2
          Selenoid позволяет запускать драйверы процессами без докера, для этого в конфигурационном файле в поле image задается команда в виде json массива, примеры конфигурации можно посмотреть здесь:

          https://github.com/aerokube/selenoid/issues/25

          Это работает и на Windows с IEDriverServer'ом. Docker для Windows мы пока не поддерживаем.

          Бинарные файлы можно скачать здесь:

          https://github.com/aerokube/selenoid/releases
          • 0
            Еще про конфигурацию с драйверами написано тут: https://github.com/aerokube/selenoid#image Мы в ближайшем будущем планируем сделать возможность автоматической настройки Selenoid на разработческой машине, для локальной отладки тестов. Следите за обновлениями.
            • 0

              А есть ли в планах поддержка на Windows?

              • 0
                Selenoid работает на Windows и запускает процессы драйверов на свободном порту, которые в свою очередь запускают браузеры. Для изоляции браузеров на виртуальных десктопах можно использовать такую вещь:

                https://github.com/kybu/headless-selenium-for-win

                С Docker для Windows у нас пока отсутствует опыт работы.
          • 0
            Перезалейте, пожалуйста, все образы для инструмента с типом automated build. Тогда в интерфейсе будет прямая ссылка на репозиторий и видны исходные Dockerfile.
            • 0
              А мы их собираем вручную. Automated build предполагает, что собирает сам Docker.
            • 0
              Подскажите, пожалуйста, по таким вопросам:

              1) Запускаю все как у вас в документации указано — сначала подтягиваются образы с браузерами, затем сам selenoid на 4444 порт, страница status выдает корректный ответ, а вот /wd/hub отдает 404 page not found. Не могу понять что еще требуется запустить?

              2) будет ли поддержка браузера safari

              Спасибо заранее!
              • 0
                По п.1 Саша отписал (см. ниже), по этой ссылке и должно отдаваться 404 на GET запрос (клиент Selenium делает POST). По п. 2 — насколько мне известно нельзя запустить Safari под Linux (только Mac и вроде бы Windows). При этом нельзя запустить Mac \ Windows в Docker. Как вы предполагаете запускать Safari? А кроме того мы проверяли — Safari в Selenium поддерживается через установку расширения в браузер (это нужно делать руками) и поддерживаются далеко не все функции API. На мой взгляд Safari — плохой кандидат на использование в Selenium.
            • 0
              URL http://localhost:4444/wd/hub используется в тестах.

              Selenoid имеет отдельный web интерфейс, который запускается в другом контейнере.

              Такой командой:

              # docker run -d --name selenoid-ui --net host aerokube/selenoid-ui:1.0.0

              После этого откройте в браузере url: http://localhost:8080

              • 0
                Спасибо за статью!
                Хотелось бы уточнить возможность распределенного запуска контейнеров между несколькими хостами.
                Если я правильно понял, по настройке изложенной в статье, все контейнеры будут запускаться на хосте самого Selenoid.
                Что нужно сделать для распределенного создания контейнеров на нескольких хостах?
                • 0
                  Вы можете развернуть Docker Swarm и, через переменные окружения, такие же как для Docker клиента, нацелить на него Selenoid. В предыдущей статье описаны разные подходы к организации Selenium кластеров:

                  https://habrahabr.ru/post/322742/
              • 0
                Спасибо, полезные инструменты!

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.