Как мы перешли на Selenoid

Наконец-то я добрался до написания заметки о Selenoid. Расскажу о том, как и зачем мы его внедрили и что это нам дало.

Еще со времен, когда я только вошел в IT в целом и в мир автоматизации в частности, я знал о таком инструменте, как Selenium Grid. Достаточно полезная штука и, по всей видимости, очень популярная, так как заметка о настройке грида является одной из самых читаемых. Сам грид - штука прикольная, но очень нестабильная. Многие проекты и компании научились танцевать с бубном и настраивать грид так, чтобы он не падал. Скажем, ребята из Яндекса наваяли свой грид роутер, ребята из Альфа-лаборатории придумали свой кластер. Когда же пришло наше время настроить инфраструктуру для запуска UI тестов, мы решили не изобретать велосипед и взять готовое решение - Selenoid.

Почему именно Selenoid?

Все просто: его очень легко настроить, там есть докер и хорошая производительность.

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

Selenoid же был решением, которое очень хотелось попробовать в реальной работе. Его плюс в том, что настроить его очень просто при помощи Configuration Manager.

Выполняете пару команд:

$ curl -L -o cm https://github.com/aerokube/cm/releases/download/1.2.3/cm_linux_amd64
$ chmod +x ./cm
$ ./cm selenoid start --vnc
$ ./cm selenoid-ui start

и у вас уже все настроено и работает. У нас это все заняло 10 минут (версия докера не подходила и нам его пришлось обновлять) =)

Всего через неделю использования мы забыли о том, что такое локальный запуск браузера. При наличии VNC можно абсолютно спокойно дебажить тесты прямо на удаленной машине. Огромным преимуществом, из-за которого я вообще посмотрел в сторону Selenoid, является запуск контейнера по запросу и повторяемость окружения. У вас всегда известна версия браузера, в котором будут бежать тесты. Всегда создается новый контейнер под новую сессию. Больше нету неожиданных автообновлений хрома или файрфокса. Более того, мы полечили синдром "А у меня локально работает!", так как все запускают тесты только удаленно.

Минусы есть?

Пока что у нас почему-то проскакивает ошибка Could not create remote session. Случается она редко и лечится банальным перезапуском, но все же неприятно. Да и проблема, скорее всего, у нас в коде. Еще в контейнере не работает команда driver.manage.window.maximize(), поэтому приходится ставить размер окна явно.

Мы используем Selenide (на Kirk мы пишем пока только один проект) и написали свой SelenoidDriverProvider. Специально приведу пример кода, так как многие часто задают один и тот же вопрос: а как настроить? Так как у Selenide с документацией, скажем откровенно, "проблемы", можете опираться на пример ниже:

public class SelenoidWebDriverProvider implements WebDriverProvider {
  @Override
  public WebDriver createDriver(DesiredCapabilities capabilities) {
    DesiredCapabilities browser = new DesiredCapabilities();
    browser.setBrowserName("chrome");
    browser.setVersion("59.0");
    browser.setCapability("enableVNC", true);

    try {
      RemoteWebDriver driver = new RemoteWebDriver(
              URI.create("http://172.28.27.17:4444/wd/hub").toURL(),
              browser
      );
      driver.manage().window().setSize(new Dimension(1280, 1024));
      return driver;
    } catch (MalformedURLException e) {
      throw new RuntimeException(e);
    }
  }
}

В коде это можно использовать так:

Configuration.browser = "com.tests.utils.SelenoidWebDriverProvider"

В целом я очень доволен и мы получаем реальный профит. Что мы еще не пробовали, так это обновляться. В новой версии Selenoid добавили возможность сетить имя для контейнера, чтобы можно было по имени легко определить нужную VNC сессию. Вот это мы пока не тестили, так что все еще гадаем, на какой табке кино смотреть =)

P/S Приятная новость: автор Selenoid будет выступать с докладом на конференции QAFest, поэтому у всех посетителей будет возможность не только послушать доклад, но и познакомиться лично. Собственно, это я и собираюсь сделать. Тоже буду там выступать, но об этом уже в следующей заметке.