Интересный способ запуска Selenium тестов на заднем плане

    image
    В последнее время у нас на проекте остро стал вопрос о запуске Selenium тестов на заднем плане. Одно из правил в нашей команде гласит, что мы не комитим код, пока не прошли все авто-тесты. Для проекта нашего размера это вполне реально. Проекты у нас меняются каждые 2-3 месяца и обычно занимает от 5 до 15 минут прогнать все тесты. Операционная система, в которой мы работаем — Ubuntu, у всех по два монитора (спасибо заказчику). Поэтому, поглядывая на тесты, удобно поделать что-то еще. Поревьювить таски, например, или начать делать новую задачу. Главная проблема заключается в том, что во время прохождения тестов на компьютере ничего сделать невозможно. А именно, каждое действие веб-драйвера делает его окно активным. Таким образом, можно только нормально послушать музыку. В лучшем случае — почитать или посмотреть видео. А вот если печатать — то почти стопроцентно завалишь какой-нибудь тест. Из-за этой проблемы каждый team member тратил кучу драгоценного времени впустую. Так я начал инвистигейшн данной проблемы.

    Изначально все советовали перейти с хрома на phantomJs. Мы попробовали это, но одна проблема переросла в другую. Многие элементы перестали находиться на странице. Было замечено еще пару минусов: он медленнее и занимает много памяти в репозитории. И вообще phantomJs не совсем соответствовал требованиям, все-таки Хром самый популярный браузер и нам следовало тестировать на нем.

    На моем прошлом проекте мы тоже использовали хром драйвер, но поведение у него существенно отличалось. Во время запуска теста хром открывался и его окно становилось активным, но достаточно было кликнуть мышкой один раз в другом месте и после этого можно было нормально продолжать работу. Даже можно было свернуть окно. Тест продолжал работать, скриншоты делались и репорты генерились… Я хотел настроить настроить поведение драйвера в новом проекте именно так.

    Я задал вопрос по данной проблеме на многих площадках. Написал письма разным экспертам, в том числе и тем, кто комитит непосредственно в Selenium. По сути, мне так никто и не ответил. В основном были предложения использовать phantomJs и настроить локальный дженкинс… Собирая информацию, я пришел к выводу, что такое поведение связано с операционной системой. А именно — на Windows хром забирает фокус только на старте, а в Ubuntu и Mac OS на каждое действие, будь-то клик или проверка значения элемента. Успеха настроить драйвер таким образом, чтобы после запуска он больше не делал окно активным, я так и не добился. Поэтому, если у вас есть решение по этому вопросу, обязательно поделитесь, много людей будут очень благодарны вам.

    В какой-то момент я совсем отчаялся и подумал, что так и не смогу решить эту проблему. И тут совсем случайно я решил посоветоваться со знакомым из другой команды, и он мне рассказал, что они запускают тесты через vncserver. Он мне обьяснил, как это настроить, а потом в процессе использования я придумал еще несколько деталей, которые облегчили процесс и сделали его более быстрым и удобным. Этим способом я и хочу сегодня с вами поделиться.

    Немного отклоняясь от темы, хочу сообщить, что мы используем thucydides репорты и поэтому мы видим красивый результат всех тестов после их прохождения. Это делает процесс наблюдения за тестами ненужным. Эта инструкция для Ubuntu и конкретно для java проектов, использующих maven. Кто работает на Mac, думаю, данный подход должен работать, поэтому у кого получится настроить — поделитесь инструкцией, чтобы дополнить статью.

    Советую вначале полностью прочитать всю инструкцию, а только потом приступать к настройке:

    1. В первую очередь нужно установить vncserver, вводим в терминале команду: sudo apt-get install vnc4server

    2. Нужно запустить сервер, под каким-то номером дисплея, я выбрал номер 7. Когда вы запускаете сервер в первый раз, вас попросят ввести пароль. Запомните пароль, он нужен будет в будущем для подключения. Вводим: vncserver :7

    3. Сервер может запуститься с маленьким разрешением дисплея, с помощью этой команды (сразу без выполнения второго шага) вы можете сами задать нужное разрешение для вас: vncserver :7 -geometry 1920-1080

    4. Для подключения к серверу можно использовать любой vncviewer, я предпочитаю Real VNC. Скачиваете, устанавливаете…

    5. Открываем viewer. Нажимаем кнопку «начать новое подключение» и вводим в строке сервер: localhost:7, а в строке Encryption: Let VNC Server choose

    6. Жмем «подключиться» и вводим пароль, который мы указали в пункте два.

    7. Должно открыться окно, дублируещее ваш десктоп. Запустите терминал в этом окне.

    8. В моем случае переходим в папку проекта и вводим команду: mvn clean install

    9. Тесты запускаются, не мешая остальным программам. Можно спокойно свернуть окно или даже закрыть программу vnc viewer — на прохождение тестов это никак не повлияет.

    Дополнительные шаги:
    Если вы желаете запускать тесты без vncviewer, то существует замечательная команда, переходим в папку проекта в теминале (можно и в терминале IDE) и вводим:
    xterm -display localhost:7 -e mvn clean install
    Недостаток такого способа в том, что вы не видите вывод консоли, а только окончание процесса. Если же у вас имеются репорты, то для вас это не особо важно.

    Если вы хотите остановить vncserver, то введите: vncserver -kill :7
    После перезагрузки компьютера обычно нужно повторить шаг 2 или 3. А потом запускаете тесты через viewer или напрямую в терминале командой, написанной выше.

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

    Сейчас для меня самое удобное — это стартовать сервер и сразу напрямую стартовать тесты из консоли IDE. Я также пробовал открывать IDE прямо в vncviewer(для этого вначале нужно ее закрыть в обычном окне). Работать и запускать тесты стандартным способом, по одному, например. Это тоже довольно удобно, особенно если дебажишь один длинный тест и запускаешь его по много раз.

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

    UPD: Совершенно случайно, я нашел причину(или одну из причин) такого поведения вебдрайвера. Наши тесты проходили очень долго и мы приняли решение отключить скриншоты на каждый шаг. Теперь скриншот делается только на зафейлиный шаг, перед тем как тест упадет. И неожиданно тесты начали нормально проходить на заднем плане. Теперь интересно, если тесты со скриншотыми на каждый шаг не дают вебдрайверу работать на заднем плане на Mac OS X и Windows?
    Поделиться публикацией
    Ммм, длинные выходные!
    Самое время просмотреть заказы на Фрилансим.
    Мне повезёт!
    Реклама
    Комментарии 24
    • 0
      Также сталкивался с подобным поведением.
      Решили вопрос гоняя тесты на отдельной машине, где они запускаются автоматом при комитах.

      PS кстати на OSX такой проблемы нет.
      • 0
        Мне жаловался друг, что у него такая проблема на Mac. И у меня на домашнем OSX один в один. Подскажите вашу версию OS и драйвера может уже пофиксили?
        • 0
          Сейчас специально проверил и на firefox и на chrome – все в фоне.

          OSX 10.10 (на 10.9 тоже было так, на более раних уже не припомню).
          Selenium 2.43.1
          chromedriver 2.9
          • 0
            Спасибо, это супер! Буду дома попробую. Я проверял довольно давно, возможно еще 10.8 стояла.
      • 0
        Да, есть такая трабла.

        Я таки не пожадничал и для личного проекта купил ВПС сервер за 5 баксом на минимальной конфигурации но с SSD диском.
        512 мб оперативки расширил еще 4 гб SSD свопа и запустил там.
        Jenkins + Selenium + Браузер + какую-то штуку для тасков.

        Оперативка поглощена мгновенно, но вот своп работает достаточно шустро.

        Настроил jenkins, что в случае если были коммиты, то он собирает это всё и выдает результат. Успешно или нет.

        Думаю лучше вам задуматся, чтоб был CI сервер, который вам будет говорить что коммиты успешны или нет.
        • 0
          У нас есть CI сервер с jenkins. Просто заказчик ведет метрику как часто и как долго билд лежит. Поэтому нам нужно четко комитить только рабочий код.
          • +4
            Странноватый подход, как мне кажется. Говорят, что если билд не бывает красным, значит CI бесполезен в данном процессе.
            • 0
              Можно сделать второй CI сервер, который будет гонять билды для вас, а если билд зеленый — пушить в другой репозиторий, откуда уже будет собираться билд, который видит заказчик =)
              • НЛО прилетело и опубликовало эту надпись здесь
                • 0
                  У нас реализовано нечто подобное. В jenkins'e есть две сборки: dev и master. Тесты гоняются два раза в день, мастер подтягивает в себя изменения только тогда, когда дев-сборка зеленая.
            • +1
              Есть ещё более красивый вариант (кроме адского CI) — использование xephyr (это реализация X-сервера для X-сервера). Указываете export DISPLAY=:1 (или какой он там образуется) перед запуском FF, и имеете его в нормальной отрисовке, минуя растеризацию в VNC.
              • +1
                > X-сервера для X-сервера

                we need to go deeper
                • +5
                  Можно обойтись вообще без физической отрисовки — xvfb.
                  Скриншоты создаются без проблем.
                • +4
                  Дешево и сердито — parallels/virtualbox :)
                  • 0
                    Проще сделать, надежней, переносимей, но пожалуй дороже — памяти больше расходуется.
                  • 0
                    А я использую самописный браузер на движке Webkit, он работает как в консольном режиме так и в GUI, один минус — под Винду, но вроде как можно переписать и на линукс, но я этим не запаривался. Работает на серваке в консольном режиме, понимает все: Java,JavaScript, Flash и т.д… Иногда запускаю на десктопе с выводом логов в консоль для отладки, для тестов использую GUI режим. Работает идеально, как Chrome. Использую для разного, для накручивания счетчиков, кликания рекламы, поведенческого фактора, автоматизации работы с веб сайтами. Виртуальными машинами даже не запариваюсь.
                    • +4
                      VNC здесь ни к чему, есть более простое решение — эмуляторы X-ов, например en.wikipedia.org/wiki/Xvfb
                      Вся инструкция по его настройке займет 2 строчки — установка + запуск Selenium через xvfb-run. Не нужно ни виртуалок, ни VNC/RDP.
                      • 0
                        Когда нужно постоянно менять и запускать тесты в видимом и невидимом режиме, xvfb не очень удобная штука. Но главная проблема в том, что мы не смогли его нормально настроить.
                        • 0
                          Мой коллега запускает тесты в убунте с помощью xvfb вот так:
                          Xvfb :10 -ac > /dev/null &
                          DISPLAY=:10 java -jar selenium.jar
                          Отправляет браузер на другой монитор и его не видит :]
                      • НЛО прилетело и опубликовало эту надпись здесь
                        • НЛО прилетело и опубликовало эту надпись здесь
                        • 0
                          Когда была на курсах по автоматизации тестирования, там использовала Jenkins, отлично в фоне запускал.
                          • НЛО прилетело и опубликовало эту надпись здесь
                          • 0
                            Почему не использовать headless режим? www.installationpage.com/selenium/how-to-run-selenium-headless-firefox-in-ubuntu/

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