Привет, Хабр! Меня зовут Кристина Курашова и я отвечаю за качество в VK Assistant. Это платформа по созданию диалогового ассистента с использованием NLP-моделей. Его можно интегрировать с любой корпоративной системой (как SAP и CRM, например) и подключить к корпоративному мессенджеру или даже web-приложению с возможностью голосового управления. 

Одной из киллер фич нашего продукта является многофункциональная админка для настройки всего-всего-всего. В том числе и для обучения моделей, составления сценариев диалогов, интеграции с корпоративными системами и многого другого.

Некоторое время назад я приступила к автоматизации ее регрессионного тестирования. ​​И вот февраль 2022 принес в нашу команду новые вызовы. Один из них — запуск этих тестов также в Atom Browser и Yandex Browser. Ок, запускаем.

Внимание! Эта статья будет полезна тем, кто, как и я, столкнулся с задачей запуска UI-автотестов в том числе в браузерах на основе Chromium (не только Chrome). Пройдя этот путь, решила поделиться с вами. Возможно, кому-то это поможет сэкономить время.

Для UI-автотестов мы используем Nightwatch.js без Selenuim-сервера. Nightwatch.js — это фреймворк для автоматизации end-to-end тестирования на Node.js. Один из плюсов этого фреймворка, на мой взгляд, очень подробная документация. Про Selenium-сервер можно почитать здесь. Вкратце, он помогает запускать автотесты параллельно с использованием нескольких машин (реальных или виртуальных). Пока для нас скорость выполнения тестов не так важна, мы отложили его в сторону, и вот так выглядит наша текущая схема:

Источник https://nightwatchjs.org/
Источник https://nightwatchjs.org/

То есть для запуска достаточно установленных на машине Node.js, Nightwatch.js и драйвера, который будет выполнять команды теста. Под каждый браузер потребуется свой драйвер. Об этом расскажу далее.

Схема с использованием Selenium-сервера будет выглядеть так:

Источник https://nightwatchjs.org/
Источник https://nightwatchjs.org/

На месте Nightwatch.js может быть любой другой фреймворк. Независимо от использования Selenium-сервера для запуска понадобится драйвер конкретного браузера. 

В этой статье речь идет о запуске именно в Chromium-браузерах.

Спойлер

Схема одинаковая. Отличается только драйвер, который будем подкладывать ???? Но обо всем по порядку.

Когда составили список интересующих нас браузеров, надо понять, какая версия драйвера понадобится для каждого из них. Версию для Chromium-браузеров посмотреть можно так: chrome://version. Выглядит это следующий образом, например:

В Atom.
В Atom.
В Microsoft Edge.
В Microsoft Edge.

А далее самое интересное ???? Найти драйвер под каждый браузер — тот еще квест. Но вполне посильный для каждого джедая тестировщика. Слегка упрощу задачу:

Конечно, есть и другие Chromium-браузеры, делитесь ссылками в комментариях.

Итак, скачиваем драйвер под нужную версию, распаковываем, запоминаем путь до exe-файла (я положила в /usr/local/bin для удобства). На macOS, возможно, после распаковки еще потребуется сделать файл исполняемым. Для этого в консоли выполним:

chmod +x msedgedrive

где msedgedrive — название исполняемого файла, который мы распаковали ранее. И теперь нужно выдать соответствующие разрешения на запуск. В Windows никаких дополнительных манипуляций не потребовалось.

Далее идем в конфиги фреймворка. Они обычно лежат в корне проекта. Мой называется nightwatch.conf.js. И там нас интересуют настройки окружения test_settings. Здесь задаются настройки окружения, в том числе для каждого браузера. Можно добавлять туда сколько угодно вариантов окружений с учетом ограничений среды (Safari будет бегать только на macOS, Atom — пока только на Windows, и т.д.). Вот так, например, будет выглядеть блок с настройками под Microsoft Edge в Linux-среде (в том числе на macOS):

   edge: {
     desiredCapabilities: {
       browserName: 'MicrosoftEdge',
       'ms:edgeOptions': {
         w3c: true,
         // More info on EdgeDriver: https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/capabilities-edge-options
         args: [
           //'--headless'
         ]
       }
     },
 
     webdriver: {
       start_process: true,
       // Download msedgedriver from https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/
       //  and set the location below:
       server_path: '/usr/local/bin/msedgedriver',
       cli_args: [
         // --verbose
       ]
     }
   }

Вот тут самое интересное:

desiredCapabilities.browserName=chrome будет актуально для всех Chromium-браузеров. 

webdriver.server_path — это непосредственно путь до драйвера, исполняемого файла, который мы скачали и распаковали до этого.

Важно! В Linux-системах пусть указываем вплоть до файла, без расширения.

Для запуска в среде Windows понадобится немного больше извращения. Обратите внимание на путь до драйвера (двойные обратные слеши). И расширение для драйвера в данном случае указываем.

   atom: {
      desiredCapabilities: {
        browserName: 'chrome',
        'goog:chromeOptions': {
          // More info on Chromedriver: https://sites.google.com/a/chromium.org/chromedriver/
          //
          // w3c:false tells Chromedriver to run using the legacy JSONWire protocol (not required in Chrome 78)
          w3c: true,
          args: [
            //'--no-sandbox',
            //'--ignore-certificate-errors',
            //'--allow-insecure-localhost',
            //'--headless'
          ]
        }
      },
 
      webdriver: {
        start_process: true,
        server_path: 'C:\\Users\\username\\AppData\\Local\\Mail.Ru\\Atom\\Application\\chromedriver_18.0.0.660_x64.exe',
        cli_args: [
          // --verbose
        ]
      }
    },

Вот, собственно, и всё. Погнали! В Nightwatch.js команда запуска выглядит так:

nightwatch -g login -e atom

где -e atom — окружение, в котором запускаем, от слова environment (в данном случае Atom Browser). Это название нашего энва из test_settings, которое мы задали ранее.

И в заключение упомяну ограничения и ошибки, с которыми есть вероятность столкнуться в процессе.

Основное ограничение: по такой схеме не получится запускать тесты параллельно на одной машине (если речь не идет про использование Selenium-сервера). То есть только последовательно можно будет запускать. Это касается лишь Chromium-браузеров, потому что они используют один движок.

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

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

Тут надо будет подогнать либо драйвер под браузер, либо браузер под драйвер. Обычно первое проще ????

Делитесь вашими успехами и примерами в комментариях. До скорых встреч.

Комментарии (17)


  1. VanKrock
    26.08.2022 17:22
    +1

    А если использовать selenoid, то браузер можно запускать в docker контейнерах на удалённой машинке, можно знатно распараллелить регресс, и к тому же получить видео прохождения автотеста


    1. kkurashova Автор
      26.08.2022 17:33

      Ага, спасибо! Возможно, мы в эту сторону пойдем как наберем побольше базу автотестов.


  1. Doman
    26.08.2022 18:41
    +2

    А не смотрели в сторону Playwright? Должен поддерживать все chromium-based браузеры из коробки по протоколу CDP (никаких драйверов не надо), а бонусом идут Firefox и Webkit (который почти Safari).


    1. kkurashova Автор
      28.08.2022 11:00

      Получилось так, что на момент когда появилось требование поддержки новых браузеров, уже писали на Nightwаtch.js. До этого рассматривала, конечно, Playwright, когда выбирали фреймворк. Но у него документация показалась более запутанной. Сыграло еще то, что в Nightwatch.js уже был опыт, в него быстрее и проще было заехать.


    1. kkurashova Автор
      28.08.2022 11:07

      С CDP заинтересовали прямо. Интересно стало как автотесты по CDP устроены. Если поделитесь материалами по теме, буду признательна ????


      1. Doman
        28.08.2022 22:15
        +1

        Вот хороший доклад с расшифровкой: https://habr.com/ru/company/jugru/blog/652919/

        Официальная документация у них тоже очень приятная и в актуальном состоянии: https://playwright.dev/docs/intro . Возможно, сначала покажется, что это какая-то штука для разработчиков или типа того, но по факту оно не сложнее других фреймворков. Но быстрее и стабильнее.


        1. kkurashova Автор
          29.08.2022 10:23

          Спасибо! ????


  1. cashby
    26.08.2022 20:14

    Часты ли у вас баги, которые воспроизводятся только в одном конкретном хромиум-бэйзд браузере? а сколько среди них таких, что могли бы задетектиться вашими авто-тестами?


    1. kkurashova Автор
      28.08.2022 11:13

      Пару раз всего ловили ???? Но есть четкое требование с поддержкой определенных браузеров, которому надо соответствовать.


  1. cashby
    26.08.2022 20:25

    А потом надо обновить браузеры (или какой-то из них сам автоматом обновился) и... "эта песня хороша - начинай сначала". Вам правильно посоветовали селеноид (причем готовые образы даже яндекс-браузера, как вижу, существуют).
    А еще более правильным бы было иметь минимум UI-тестов и не "набирать их базу". Много UI-тестов - злое зло.


    1. kkurashova Автор
      28.08.2022 11:21

      Согласна с вами, что UI-тестов должно быть минимум. У нас и unit-тесты есть на mocha. Под базой автотестов имелось ввиду скорее процент покрытия. Пока что очень низкий, т.к. полноценного ресурса на автотесты сейчас нет.

      С селеноидом да, это полезный комментарий. Планирую покопать в эту сторону. Нас причем скорее под Atom готовый образ даже больше интересует ????


  1. Mes
    27.08.2022 11:09
    +1

    Если уж прям в любом - попробуйте testcafe


    1. kkurashova Автор
      28.08.2022 11:22

      Сходу не нашла... Atom поддерживает?


      1. Mes
        29.08.2022 09:39

        А нужен ли атом - если он chromium based? Не проверял, но думаю, если задать прямой путь к запускаемому файлу - то сможет и в Atom https://testcafe.io/documentation/402828/guides/intermediate-guides/browsers?search#custom-browsers


  1. pythonist1234
    28.08.2022 10:28
    +1

    Моего любимого Chromium-based'а нет, Samsung Internet(

    Он, правда, для мобильных устройств, но тесты же должны и их проверять, по идее?


    1. kkurashova Автор
      28.08.2022 11:27

      Зависит от требований ???? Тот продукт, автоматизацией которого сейчас занимаюсь, пока без мобильной версии у нас.

      А так да. Еще же целый зоопарк мобильных браузеров существует.


  1. alexey_girin
    28.08.2022 23:15

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