Скрипт веб-драйвера Python в порядке с консоли, но не запускается как служба Upstart

Мне нужно запустить скрипт Python, который использует веб-драйвер Selenium:

import platform
from selenium import webdriver
from pyvirtualdisplay import Display

driver = None

if platform.system() == 'Linux':
    print("Initializing browser for chrome...")
    DISPLAY = Display(visible=0, size=(800, 600))
    DISPLAY.start()
    print("Started display")
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument('--no-sandbox')
    driver = webdriver.Chrome('/usr/local/bin/chromedriver', chrome_options=chrome_options)
    print("Done init chrome")
    connected = True
else:
    try:
        print("Starting firefox...")
        driver = webdriver.Firefox()
        connected = True
    except:
        print("Could not connect through firefox")

if driver:
    print("driver ok")
    driver.quit()
    print("All ok")

Скрипт запускается нормально из консоли:

sudo ~/environments/scrapers/bin/python test_webdriver.py
Initializing browser for chrome...
Started display
Done init chrome
driver ok
All ok

Но выдает ошибку WebDriverException при попытке запустить с помощью строфы exec с Upstart:

Initializing browser for chrome...
Started display
...
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.26.436382 (70eb799287ce4c2208441fc057053a5b07ceabac),platform=Linux 4.8.0-58-generic x86_64)

Я добавил, возможно, отсутствующие пути в скрипт выскочки, например

env PYTHON_HOME=/home/rsa-key-20161031/environments/scrapers
env PATH=/usr/local/bin:/usr/bin:$PYTHON_HOME:$PATH
env ENV=production
env DISPLAY=:10
chdir /home/user/project
console log
exec $PYTHON_HOME/bin/python test_webdriver.py

Без эффекта. Поиск ошибки ничего конкретного по этому поводу не дает. Любое понимание того, как заставить эту работу работать, очень ценится.

Обновление: Мое текущее решение — использовать Cron, так как у него нет проблем с использованием Xvfb. Я все еще очень хотел бы знать, можно ли запустить задачу веб-драйвера как службу. Я также пытался использовать Selenium в качестве удаленного веб-драйвера с теми же отрицательными результатами (Chrome завершает работу после того, как, по-видимому, не может подключиться к виртуальному дисплею)


person Alex Bausk    schedule 11.07.2017    source источник
comment
Upstart не имеет сеанса X-Windows для запуска Chrome. Upstart и другие системы управления службами Linux (systemd, sysVinit) не предназначены для использования со службами, использующими графический интерфейс.   -  person Raman Sailopal    schedule 11.07.2017
comment
Спасибо; Изменяет ли что-нибудь тот факт, что я использую Pyvirtualdisplay/start Xvfb как отдельный процесс?   -  person Alex Bausk    schedule 11.07.2017


Ответы (1)


Я столкнулся с похожей ситуацией, когда настраивал pytest для работы с веб-драйвером selenium и firefox.

В качестве решения вы можете установить xvfb, т.е. в Debian

sudo apt install xvfb

Теперь вы можете настроить файл upstart после позиции exec, чтобы xvfb вызывался с вашим скриптом в качестве параметра.

xvfb-run --server-num=10 <script>

Таким образом, xvfb запускается перед вашим скриптом.

person andpei    schedule 13.07.2017
comment
Хорошая идея, спасибо; при попытке это; при запуске Xvfb-run выдает следующую ошибку: /usr/bin/xvfb-run: mktemp: not found, при этом в системе присутствует mktemp. Есть мысли по этому поводу? - person Alex Bausk; 14.07.2017
comment
@AlexBausk Рад слышать, что это почти работает. Я предполагаю, что mktemp не является частью вашей переменной PATH; поэтому введите which mktemp (в моем случае /bin) и добавьте путь через двоеточие, т.е. env PATH=/bin:/usr/local/bin:... - person andpei; 14.07.2017
comment
Вау, теперь это действительно работает. Я невероятно благодарен за вашу помощь! Это беспокоило меня до бесконечности - person Alex Bausk; 14.07.2017