Selenium: для любителей яблок

https://medium.com/@aandryashin/selenium-an-apple-story-ab0c0b68cd35
  • Перевод

Привет! Это моя новая статья, посвященная Selenium. Ранее я уже подробно рассказал об организации масштабируемого кластера Selenium (часть I, часть II). Затем мы рассмотрели вопрос использования Selenium в качестве инструмента отладки автотестов (раз, два), Наконец, нам удалось создать порядок из хаоса на Windows (ссылка). Сегодня мы будем иметь дело с яблоками, точнее с одним большим Яблоком (т.е. с Apple).




Хотя Selenium является относительно простым инструментом, жизнь усложняется, когда мы пытаемся запускать автоматические тесты в браузерах из Купертино: Safari под MacOS и мобильный Safari под iOS. Чтобы полностью разобраться с браузерами для настольных операционных систем, давайте сегодня поговорим о Safari под MacOS. Сегодня свежие версии Safari разрабатываются только под MacOS. Исторически работа с Safari была реализована в Selenium при помощи браузерного расширения, которое транслировало команды Selenium во внутренние команды браузера. Изначально расширение загружалось в Safari автоматически. Позже из-за изменения правил безопасности в Safari нужно было установить расширение один раз вручную. Наконец, с выходом Safari X все значительно поменялось. Теперь Safari использует отдельно стоящий процесс веб-драйвера — safaridriver, аналогично chromedriver у Chrome и geckodriver у Firefox. Чтобы запустить тесты в Safari нужно:


  1. Запустить safaridriver (обычно устанавливаемый вместе с Safari и расположенный в /usr/bin/safaridriver) на свободном порту, например, 4444. Команда для запуска будет такая:


    $ /usr/bin/safaridriver --port 4444

  2. Запустить тесты, используя следующий Selenium URL:


    http://localhost:4444/

  3. Остановить запущенный процесс драйвера.

Звучит легко, не правда ли? И так оно и есть! Тем не менее есть проблема — safaridriver умеет работать только с одной копией Safari параллельно. Как преодолеть это ограничение? — Запустить драйвер несколько раз на разных портах и запустить тесты на разных URL с этими портами. Просто, но требует много ручной работы. Давайте автоматизируем этот процесс! Как это могло бы работать? А вот как:



  1. Вы запускаете сервер, предоставляющий Selenium API и указываете ему при старте, где расположен safaridriver.
  2. Когда приходит запрос на новую сессию — запущенный сервер ищет свободный порт и занимает его. Затем он запускает процесс safaridriver на этом порту и проксирует все последующие запросы туда же.
  3. Когда поступает запрос на закрытие сессии — процесс safaridriver также останавливается.

Описанный алгоритм очень прост, поэтому он не должен требовать разработки сложного сервера, не так ли? Если вы возьмете в качестве сервера сегодняший стандарт — Selenium сервер, то будете использовать чересчур сложный инструмент для такой просто задачи. Почему это так:


  1. Selenium server — огромный как слон! Размер дистрибутива начинается от 20 Мб.
  2. Он требует установки Java — еще одного гигантского существа в ваш зоопарк. Со всякими всплывающими окнами об обновлении и графическим интерфейсом из 90-х.
  3. Он всегда голоден и ест память без причины.
  4. Он довольно плохо документирован и не работает из коробки. Нужно быть волшебником, чтобы заставить его заработать.

Короче говоря, позвольте мне показать вам более подходящий инструмент — Selenoid. Selenoid — это легковесный демон, созданный полностью заменить тучный Selenium сервер. Завести Selenoid с Safari очень просто:


  1. Скопировать кусочек JSON, приведенный ниже, в файл (например, в ~/browsers.json):


    {
    "safari": {
        "default": "latest",
        "versions": {
            "latest": {
                    "image": ["/usr/bin/safaridriver"]
            }
        }
    }
    }

  2. Запустить и скачать исполняемый файл Selenoid:


    $ curl -Lo ~/selenoid \
     https://github.com/aerokube/selenoid/releases/download/1.3.3/selenoid_darwin_amd64
    $ chmod +x ~/selenoid
    $ ~/selenoid -conf ~/browsers.json -disable-docker

  3. Запустить тесты, используя URL:

    http://localhost:4444/wd/hub

Больше не нужно устанавливать Java и компанию! Но если вы, как я, не хотите делать руками и это, то можете получить аналогичный результат, используя однострочный скрипт:


$ curl -Lo ~/cm https://github.com/aerokube/cm/releases/download/1.2.1/cm_darwin_amd64 && \
    chmod +x ~/cm && \
    ~/cm selenoid start --browsers safari

При желании вы также можете скачать и запустить легковесный UI для Selenoid. Подробнее об этом можно почитать в документации.


Простое Selenium тестирование в Safari никогда не было так близко. Хорошего дня!

Поделиться публикацией
Похожие публикации
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 8
  • 0

    Вот честно — не вижу проблем поставить java и селениум сервер. Все работает в таком режиме довольно стабильно, до 80 браузеров на 16 виртуалках. Сколько можно селеноидом сэкономить — 200 метров на винте и 100 метров в оперативке?

    • 0
      Для нас тоже не составляет проблемы установить java, мы эксплуатировали Selenium долгое время, и до сих пор некоторые имиджи его содержат. Дело не в экономии а в удобстве и стабильности.
      • 0

        Вот я про удобство и говорю — у меня совершенно нет проблем ездить на большом автомобиле, чем на самокате. А по поводу стабильности: чаще всего просто обновлять библиотеки надо не сразу а недельки через три, когда коммьюнити уже протестит. Вообщем для меня это очень похоже на биткоин — сами придумали проблему, которой раньше не существовало и сами ее решили

        • 0
          Работа с Safari — это не лучший пример того, почему Selenoid лучше Selenium server, потому что тестирование в Safari до последнего времени работало совсем плохо. Кластер, на котором эксплуатируется Selenoid, по размеру примерно в 50 раз больше, чем ваш, и на таких масштабах экономия даже 100 Мб памяти у одного процесса приводит к существенной экономии в стоимости вычислительных мощностей. В нашем случае под нагрузкой Selenium может потреблять гигабайты памяти, а Selenoid — десятки и сотни мегабайт.

          Основное преимущество Selenoid достигается на браузерах, которые можно упаковать в Docker контейнеры (Firefox, Chrome, Opera). В этом случае можно на 1 железной машине или нескольких виртуальных машинах получить облако, по требованию поднимающее вообще любую версию браузера. Selenium без сложных манипуляций с инструментами наливки типа Ansible такого делать не умеет, не говоря уже об автоматическом старте контейнеров под запрос.

          Согласен, что некоторые из аргументов, приведенных в этой статье, кому-то могут показаться недостаточно убедительными. Но я все равно советую посмотреть на Selenoid, быть может он где-то облегчит жизнь и вам.
    • 0

      Спасибо большое за ваши статьи и, собственно, сам selenoid. Очень полезное решение.
      Подскажите, а как вы решали проблему с ресайзом окна сафари в последней версии OSX? Потому что у меня, текущая версия, отказывается менять размер окна и падает с ошибкой.

      • 0
        А здесь можно подробности ошибки? Или приходите в наш чатик: https://telegram.me/aerokube
        • 0
          Я имел ввиду проблему описанную в этм ишью https://github.com/webdriverio/webdriverio/issues/1963
          Есть вариант поставить бета версию 11 сафари или техникал превью.
          Но хотелось узнать мнение экспертов.

          Спасибо, приду :)
          • 0
            Это баг в сафари, они уже исправили, но доступен пока только в техникал превью. Тут приходится только ждать.

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

      Самое читаемое