python - 从另一个脚本调用时,如何修复 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
。不显示错误消息。浏览器未启动。我该如何解决?
解决方案
我必须将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文件中设置这些环境变量。
推荐阅读
- postgresql - 使用 jsonb 对象将 varchar 数组转换为数组
- winforms - 如何使用 Winforms 对 SourceCache 进行排序、绑定到 BindingList 以及手动处理 IChangeSet?
- swift - 如何在 Swift 中杀死并重启 UnityGLView
- javascript - 无法在代码中使用从 js 文件导入的 var
- python - 如何检查一个数字是否只出现在一个列中?
- java - Vaadin Grid Table:如何为空单元格绘制边框?
- excel - 从多个日历中删除会议
- python - 在 Windows 上运行 docker-py 时出现客户端错误
- json - AWS - API Gateway 的 IAM 策略
- erlang - 如何修改 erts 模块