Pull to refresh

Selenium: Накачиваем Мышцы

Reading time6 min
Views14K
Original author: Ivan Krutov

Прошло довольно много времени с момента нашей последней статьи об эффективной Selenium-инфраструктуре. Если вы находитесь в самом начале непростого пути Selenium — советую ознакомиться с нашими статьями про масштабируемый Selenium (часть I, часть II), Selenoid — универсальный инструмент для автоматизации тестов в браузерах (раз, два), Selenium под Windows (ссылка). Если вам больше нравятся мотивирующие рассказы — посмотрите видео моего доклада про масштабируемый Selenium на SeleniumConf Berlin 2017.


Не правда ли, я мастер Фотошопа?


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


Ggr


Наш Selenium балансировщик получил несколько крутых улучшений.


  1. Во-первых, было добавлено API для определения хоста с браузерами по ID сессии. Это можно сделать вот таким HTTP-запросом:

$ curl -s http://test:test-password@my-ggr-host.example.com:4444/host/8e82f31f408b4a906f715228b5176efb0528ce32-66db-417f-8fa7-b12d85ce1ab5
{"Name":"my-hub-1.example.com","Port":4444,"Count":5,"Username":"","Password":""}

  1. Также была добавлена поддержка гостевых квот. Браузеры из гостевой квоты можно получить без указания имени пользователя и пароля. Оказывается удобным поддерживать небольшую песочницу, где новые пользователи могут пробовать запускать свои тесты, не изменяя их код. Включить гостевую квоту можно аргументами командной строки Ggr:

$ ./ggr -guests-allowed -guests-quota test <остальные флаги...>

При добавлении таких флагов любые браузеры из файла test.xml будут доступны без указания пароля.


  1. Третья крутая штука — это возможность проксировать запросы во внешние сервисы наподобие SauceLabs, BrowserStack или TestingBot. Некоторые задачи тестирования, такие как тестирование в мобильных браузерах или тестирование мобильных приложений на устройствах, являются сложными с точки зрения поддержания тестовой инфраструктуры. Вы можете принять решение поддерживать основную часть браузерной инфраструктуры самостоятельно и пользоваться платными сервисами только для таких сложных случаев. Для того, чтобы перенаправить запросы во внешнюю систему просто укажите имя пользователя и пароль в XML файле:

<qa:browsers xmlns:qa="urn:config.gridrouter.qatools.ru">
<browser name="some-mobile-browser" defaultVersion="45.0">
    <version number="45.0">
        <region name="1">
            <host name="ondemand.saucelabs.com" port="4444" count="1" username="test-user" password="my-password"/>
        </region>
    </version>
</browser>
</qa:browsers>

  1. Все наши инструменты, включая Ggr теперь компилируются версией Golang 1.9. Эта версия имеет гораздо более производительные алгоритмы сборки мусора, что дает значительное уменьшение времени ответа. Ggr теперь, действительно, летает.
  2. Самое важное изменение — это добавление поддержки проксирования VNC-данных. Если хосты из квот Ggr имеют запущенный на каком-то порту VNC-сервер (чтобы смотреть на экран браузера во время выполнения), то вы можете настроить Ggr так, чтобы иметь возможность получать доступ к VNC-данным по ID сессии. Без каких-либо изменений в квотах вы теперь можете использовать вот такие ссылки:

ws://test:test-password@my-ggr-host.example.com:4444/vnc/8e82f31f408b4a906f715228b5176efb0528ce32-66db-417f-8fa7-b12d85ce1ab5

Обратите внимание на протокол ws://, означающий WebSocket. Используя VNC-клиента, поддерживающего передачу данных через веб-сокеты (например, noVNC) вы можете увидеть экран браузера любой запущенной сессии. По-умолчанию Ggr ожидает, что VNC-сервер запущен на стандартном порту 5900, но это можно перенастроить.


Selenoid


Наиболее многочисленные изменения были сделаны в нашем, как говорят, "флагманском" open-source продукте — Selenoid. Selenoid — это полноценная замена Selenium-хаба, запускающая браузеры в Docker контейнерах:


Больше Возможностей Настройки


Теперь вы имеете гораздо больше возможностей по настройке окружения браузера. Например, в конфигурационном файле вы можете задавать любые переменные окружения, записи файла /etc/hosts и значение shmSize для операционной системы внутри контейнера, где будет запущен браузер:


{
    "firefox": {                                     
      "default": "46.0",                             
      "versions": {                                  
        "46.0": {                                    
          "image": "selenoid/firefox:46.0",          
          "port": "4444",                            
          "env" : ["TZ=Europe/Moscow"],              
          "hosts" : ["example.com:192.168.0.1"],     
          "shmSize" : 268435456,                     
        }      
      }
    }
}

Это позволяет, например, переопределять для каждой версии браузера часовой пояс или добавлять хосты из внутренней сети без изменения настроек DNS. В дополнение к этим настройкам вы можете изменять некоторые параметры отдельно для каждой запущенной сессии при помощи capabilities.


Новые Capabilities


1. Если вы запускаете несколько тестов параллельно, то, чтобы различить их в Selenoid UI, вы можете указать капабилити name с произвольной строкой внутри:


name: "MyCoolTestName"

Вот как это выглядит в UI:



2. Если тестируемое приложение также запускается в Docker контейнере — вы можете автоматически связать (link) контейнер с браузером с контейнером приложения, указав его имя:


applicationContainers: my-application-container

3. Иногда требуется переопределить содержимое /etc/hosts только для одного теста. Это можно сделать так:


hostsEntries: "some-host:192.168.0.1"

4. Наконец, чтобы переопределить часовой пояс для одной сессии — укажите:


timeZone: "Europe/Moscow"

Улучшения в Логировании


Мы добавили два важных улучшения в логирование:


1. Если браузеры запускаются в контейнерах — любые логи, отправленные в централизованное хранилище логов (такое как Amazon CloudWatch или Google Cloud logging), могут теперь быть помечены произвольной меткой. Значение метки указывается при помощи capability name, о которой я писал в предыдущем разделе.


2. Если вы запускаете Selenoid без Docker — вы, наконец, можете включить логи веб-драйверов в логи Selenoid. Для того, чтобы это заработало, нужно добавить флаг -capture-driver-logs при старте Selenoid:


./selenoid -conf ~/.aerokube/selenoid/browsers.json -capture-driver-logs

Образы с Браузерами


Мы пересобрали все образы с браузерами, добавив поддержку всех UTF-8 локалей и дополнительные шрифты для правильного отображения таких символов как:


  • Китайские иероглифы
  • Японские иероглифы
  • Корейские иероглифы
  • Хинди (деванагари)
  • Тайский алфавит
    Все эти изменения позволяют использовать новые образы для тестирования сайтов, переведенных на множество языков.

Selenoid UI


Мы полностью переделали внешний вид Selenoid UI — графического веб-интерфейса для Selenoid.



Наиболее часто используемые возможности такие как статистика использования браузеров и кнопки для просмотра сессий теперь располагаются на главной странице. Реже используемый экран выбора capabilities был унесен на отдельную вкладку.



Экран запущенного браузера и логи сессии теперь показываются на одной экране рядом друг с другом.


Configuration Manager


Configuration Manager — маленькое приложение, значительно упрощающее установку наших инструментов, стало еще более удобным. Теперь поддерживается возможность настройки Selenoid для работы с Microsoft Edge и Safari. Свежие версии CM работают без проблем на Windows 10. Вы также можете переопределить порт, на котором слушает Selenoid и Selenoid UI, например, чтобы одновременно запустить Selenium server и Selenoid.



Мы также сделали вывод CM приятным для глаза, раскрасив логи разными цветами.


Запись Видео


Вишенкой на торте является недавно добавленная возможность записывать видео браузерных сессий. В дополнение к возможности смотреть на экран браузера в реальном времени в Selenoid UI теперь стало возможно записать видео с экрана браузера и сохранить его в файле формата H264. Видео выглядит примерно так:



Для того, чтобы записать видео, просто добавьте одну capability в тесты:


enableVideo: true

По-умолчанию все записанные видео называются <sessionID>.mp4, где <sessionID> — уникальный идентификатор браузерной сессии, который можно легко вытащить из логов теста. Если вы хотите использовать свое имя — добавьте capability videoName:


videoName: "my-cool-video.mp4"

Selenoid автоматически предоставляет доступ к каталогу с видео по HTTP. Чтобы открыть файл в браузере, используйте URL:


http://my-selenoid-host.example.com:4444/video/my-cool-video.mp4

Чтобы посмотреть весь список файлов — сотрите имя файла:


http://my-selenoid-host.example.com:4444/video/

Я надеюсь теперь у вас есть гораздо больше мотивации, чтобы настроить в своей команде действительно эффективную инфраструктуру Selenium. Поверьте, запуск тестов в браузерах может быть безболезненным! Если у вас есть какие-то вопросы — не стесняйтесь писать нам на почту, в Telegram-канал поддержки или отправляйте вопросы на StackOverflow тег. Если вы уже используете Kubernetes в своих процессах — вас также может заинтересовать наш новый продукт — Moon, который был специально разработан для развертывания эффективного кластера Selenium в Kubernetes и поддерживает все лучшее, что есть в Selenoid.


До новых встреч.

Tags:
Hubs:
+3
Comments2

Articles