Запуск remote webdriver на linux без иксов - проблема с экспортом системной переменой DISPLAY=:99

Задача - запустить проверку сайтов через внешний ресурс. Решил использовать remote webdriver. Сперва пробный запуск сделал на VPS Digital Ocean с Ubuntu и без иксов. Заработало.
Далее на работе выделили комп с MacOS, но там что то сжирало память и потому всё таки дали сервак с линуксом, без рут прав, админ тут в помощь был. Думал просто повторю всё что делал на VPS и будет мне и фирме счастье, и займусь реализацией следующих тестов. Столкнулся с проблемой которая забрала достаточно много времени. Для настройки окружения на сервере без иксов добавил в crontab -e следующие таски (причины побудившие так сделать тут не буду пока описывать, на тот момент было главным чтоб заработало и не кушало ресурсов)

#запуск эмулятора иксов в фоне
* * * * * Xvfb :99 -ac > /dev/null 2>&1 &
#присвоение переменной DISPLAY порта на котором запущен эмулятор
* * * * * export DISPLAY=:99  
#запуск ранее написанного скрипта
* * * * * /home/javacheck.sh

На VPS эта схема прекрасно работала, на текущем сервере не работает export DISPLAY=:99, или она каким то образом экспортируется не в том окружении переменных в котором ищет Firefox, из за чего Firefox в консоли PyCharm ругается что не видит дисплея. Отличие от VPS - там я всё делал от рута, но админ говорит что в моём конкретном случае это не имеет значения.

Админ сказал что так не правильно писать экспорт переменной и посоветовал записать так:

* * * * * DISPLAY=:99 Xvfb :99 -ac > /dev/null 2>&1 

Но и так не сработало.

Последнее что админ посоветовал в самом селениуме прописать в параметрах запуска Firefox 'экспорт переменной

export DISPLAY=:99

Пока быстрым поиском в гугле ничего похожего не нашёл и что то мне подсказывает что это не оптимально решение.

Два вопроса:

  1. Как правильно экспортировать переменную?
  2. Есть предположения почему эта схема работа на VPS и не работает на другом сервере?

PS Также пробовали экспорт прописывать в конфиг шела, но для крона это не сработало.

По-моему, в вашей строке Вы забыли “;”

Пример:

export VAL=test ; echo $VAL

Результат будет “test”

Т.е. Вам, вероятно, надо будет написать вызов теста так:

export DISPLAY=:99 ; /home/javacheck.sh

В случае VPS Вы всё делали от рута => крон запускается от рута, руту и определилась переменная

2 лайка

Мне кажется схема не работает, потому что все три команды надо запускать одной командой.
Видимо определенная переменная DISPLAY не видна для последующей команды.

Т.е. нужно или создать shell скрипт и там указать все что необходимо для запуска и в кроне запускать shell скрипт. Или попробовать запустить все три команды в одной строке как указал @DmitriyZverev

Ну и просто смежные темы для прочтения:

1 лайк

Благодарю за ответы. Статьи прочёл.

не помогло, при запуске в консоли PyCharm Firefox всё также ругается на отсутствие дисплея:

WebDriverException: Message: u'Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms. Firefox console output:\nError: no display specified\nError: no display specified\n' ;

А вот за этот совет отдельно благодарю. Админ сервера говорил что в этом разницы нет: от рута я крон запускаю или от юзера, если от этого юзера при ручном запуске всё работает. В понедельник попрошу его от рута в крон добавить таску.

сделал, тоже не помогло. Перепроверял - процессы selenium-server и Xvfb запущены. Скрипт выглядит так:

#!/bin/bash
DISPLAY=:99 ; Xvfb :99 -ac > /dev/null 2>&1 >>/tmp/exportDISPLAY.log
(pidof java || java -jar /home/static/selenium-server-standalone-2.39.0.jar) &

В последней строке selenium-server запустится при условии что он сейчас не запущен. В отличии от Xvfb несколько копий selenium-server может быть запущено.

PS Кильнул процесс selenium-server и Xvfb, выполнил все три команды вручную:

Xvfb :99 -ac > /dev/null 2>&1 &
export DISPLAY=:99
java -jar /home/static/selenium-server-standalone-2.39.0.jar > /dev/null 2>&1 &

всё заработало. Но как только закрыл окно с SSH сессией - слетел процесс selenium-server и присвоенное значение переменной окружения DISPLAY, Xvfb сервер остался запущенным (потому что запустился как сервис?).

Остаётся надежда на информацию от @DmitriyZverev про запуск крона от рута. В понедельник проверю этот вариант.

Сравните ваши 2 скрипта
DISPLAY=:99
export DISPLAY=:99
Чтобы не топтаться на месте, вот это добавьте в файл start_selenium.sh

#!/bin/bash
Xvfb :99 -ac > /dev/null 2>&1 &
export DISPLAY=:99
java -jar /home/static/selenium-server-standalone-2.39.0.jar > /dev/null 2>&1 &

сделайте его исполняемым: chmod +x start_selenium.sh
Добавьте в cron

* * * * * <path_to>/start_selenium.sh

А теперь вопрос, который поможет понять, почему не работают тесты (я у себя с xvfb не работаю, поэтому ребята меня поправят). Эта переменная, DISPLAY, она кому нужна: selenium-server или тестам которые запускаются далее?
Ведь в кроне мы её выставили для селениума, она находится в окружении рута, потом @jeka коннектится своим пользователем, запускает тесты и … переменной этой нет. Если она нужна тестам, то перед запуском тестов её надо экспортнуть:
export DISPLAY=:99; “start my tests”

1 лайк

Она нужна Firefox, он для своего запуска ищет дисплей в системе. Присваивая значение DISPLAY=:99 мы говорим системе что на этом порту находится дисплей. Соответственно именно этот порт указал в параметрах при запуске Xvfb - Xvfb :99 -ac > /dev/null 2>&1 &. В окружении какого юзера запускается Firefox через selenium-server-standalone-2.39.0.jar - не знаю, как бы выяснить? В любом случае не в окружении root пользователя точно.

Вооооот))) об этом с админом спорил, так как чуял что в юзерах дело, раз ранее на VPS всё работало, там были root права. Но тогда он меня убедил что не в этом дело. Эх, спасибо за эти слова, теперь в голове картинка собирается.

Правда из этих же слов выходит, что последний совет админа был правильным - разобраться как объявлять переменную DISPLAY при запуске Firefox - кто то может подсказать как это сделать в момент вызова selenium-server’ом браузера Firefox?

Это похоже не мой случай, но тем не менее интересно будет узнать как экспортнуть DISPLAY перед запуском тестов?

УРА! Заработало!
Помог совет @DmitriyZverev:

Огромное спасибо!!

Ошибка была в следующем:

В файле launch_environment_for_selenium.sh я написал:
DISPLAY=:99 ; Xvfb :99 -ac > /dev/null 2>&1
Не добавил слово export так как по совету программиста с работы - это не обязательно. Оказалось обязательно + моя невнимательность (не замечал этого отличия).

Всем выражаю огромную благодарность. Достаточно долго не мог найти причину проблемы.