Python webdriver脚本可以从控制台运行,但不会作为Upstart服务启动

时间:2017-07-11 13:04:18

标签: python linux bash selenium-webdriver upstart

我需要运行一个使用Selenium webdriver的Python脚本:

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

但是如果尝试使用带有Upstart的exec节运行,则会出现WebDriverException错误:

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)

我在upstart脚本中添加了可能缺席的路径,比如

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的问题。我仍然非常想知道是否可以将webdriver任务作为服务运行。我也尝试使用Selenium作为远程webdriver,具有相同的负面结果(Chrome显然无法连接到虚拟显示器后退出)

1 个答案:

答案 0 :(得分:1)

我遇到了类似的情况,而我配置了pytest以运行selenium和firefox webdriver。

作为解决方案,您可以安装xvfb,即在debian

sudo apt install xvfb

现在你可以在exec位置之后调整你的upstart文件,以便用你的脚本作为参数调用xvfb

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

这种方式xvfb会在您的脚本前面启动。