![image](https://habrastorage.org/getpro/habr/post_images/4f5/19c/8bd/4f519c8bdf0689062fec07bdc1480232.png)
В последнее время у нас на проекте остро стал вопрос о запуске 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?