首页 > 解决方案 > 从另一个脚本调用时,如何修复 selenium 在服务器中不打开浏览器?

问题描述

我想从特定站点单击按钮打开 selenium 浏览器。我正在使用flask服务器。因此,我从一个端点调用 selenium 脚本,使用subprocess.

服务器.py

import subprocess

args = [PYTHON_PATH, SCRIPT_PATH]
subprocess.Popen(args,
                 cwd="/",
                 stdout=subprocess.DEVNULL,
                 stderr=subprocess.STDOUT,
                 start_new_session=True)

这是打开浏览器的脚本。

脚本.py

from selenium import webdriver

chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_experimental_option('excludeSwitches', ['enable-logging'])
chromeOptions.add_argument("--headless")
chromeOptions.add_argument('--no-sandbox')
chromeOptions.add_argument('--disable-dev-shm-usage')
chromeOptions.add_argument('--disable-gpu')

print("Starting Browser")
browser = webdriver.Chrome(executable_path='/usr/local/bin/chromedriver', chrome_options=chromeOptions)
print("Browser opened")

script.py外壳打开时,它可以正常工作。但是当从 调用作为子进程时server.py,它会停止在Starting Browser。不显示错误消息。浏览器未启动。我该如何解决?

标签: pythonseleniumsubprocess

解决方案


我必须将DISPLAY环境变量设置为:0. 并更新PATH变量。

import subprocess

// These two lines
os.environ['DISPLAY'] = ':0' 
os.environ['PATH'] = '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'

args = [PYTHON_PATH, SCRIPT_PATH]
subprocess.Popen(args,
                 cwd="/",
                 stdout=subprocess.DEVNULL,
                 stderr=subprocess.STDOUT,
                 start_new_session=True)

这解决了这个问题。

同样的解决方案适用于那些通过cronjob. 在调用脚本之前 crontab文件中设置这些环境变量。


推荐阅读