我有一个python脚本,它使用下一行selenium调用chrome。
ff = webdriver.Chrome('/home/user01/webScraping/CollectAndGo/chromedriver')python脚本是从shell脚本调用的。
python /home/user01/webScraping/CollectAndGo/cgcom.py > /home/user01/webScraping/CollectAndGo/cgcom.log 2>&1当我从终端运行脚本或只执行.sh文件时,它工作得很完美,但是当我安排一个crontab作业时,它会失败,下一个错误就会失败。
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: u'unknown error: Chrome failed to start: exited abnormally\n (Driver info: chromedriver=2.9.248304,platform=Linux 3.5.0-36-generic x86_64)' 此错误与此问题的第一行代码有关。有人知道为什么会发生这种事吗?
发布于 2014-05-28 16:43:54
尝试从cron启动浏览器最明显的问题是,即使您的计算机上运行了X,也不会为从crontab运行的进程设置DISPLAY环境变量,因此从crontab启动浏览器将失败。
解决方案的范围从琐碎到超级复杂。一个简单的解决方案是,如果没有X运行,脚本就不会运行,并手动将DISPLAY设置为:0,这是Ubuntu启动的默认X服务器的默认显示号。
例如,如果我将此命令放在command行的crontab列中,则Chrome启动时没有问题:
DISPLAY=:0 google-chrome特定于用户的crontab文件中的完整行如下所示:
0 * * * * DISPLAY=:0 google-chrome如果您想运行一个通过selenium启动chrome的python脚本,那么该行将改为如下所示:
0 * * * * DISPLAY=:0 python my_script.py命令字符串仅作为-原样发送到shell,因此在最后一个示例中,字符串DISPLAY=:0 python my_script.py将被传递给shell。将命令开始时立即给出的变量赋值解释为设置环境变量是常见的shell语法。( dash和bash的情况肯定是这样,其中之一很可能是大多数安装中默认的shell。)因此,shell解释的命令将环境变量DISPLAY设置为值:0,然后运行python my_script.py。因为python从启动它的shell继承了它的环境,所以变量DISPLAY也是它的:0。
设置DISPLAY=:0,如我前面所示,只为下面的命令设置变量。对于crontab执行的所有命令,还可以将DISPLAY设置为:0。例如,在以下特定于用户的crontab中:
DISPLAY=:0
30 * * * * google-chrome
0 * * * * python my_script.py行DISPLAY=:0设置环境变量DISPLAY,用于执行google-chrome和python my_script.py。
发布于 2020-05-10 21:33:55
在MacOS Catalina上,只有这个命令对我有效。
* * * * * export DISPLAY=:0 && export PATH=$PATH:/usr/local/bin && /usr/bin/python3 ~/Documents/Scripts/my_script.py发布于 2021-03-04 03:13:16
使用pyvirtualdisplay和Xvfb为您管理窗口会话(最初来自这个答案)
背景:
就我而言,公认的答案是行不通的。
解决方案:
pip3 install pyvirtualdisplay
sudo apt-get install xvfb.py脚本中分配窗口处理程序from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from pyvirtualdisplay import Display
import time
# Display creates a virtual frame buffer and manages it for you
with Display(visible=False, size=(1200, 1500)):
driver = webdriver.Firefox()
driver.get("https://website-target.com")
time.sleep(1)
print(driver.current_url) # check connection
time.sleep(1)
print(driver.current_url)
driver.close()https://stackoverflow.com/questions/23908319
复制相似问题