Selenium 脚本从控制台工作,不能在 CRON 中工作 - Geckodriver 错误

Posted

技术标签:

【中文标题】Selenium 脚本从控制台工作,不能在 CRON 中工作 - Geckodriver 错误【英文标题】:Selenium script working from console, not working in CRON - Geckodriver error 【发布时间】:2018-01-13 04:46:14 【问题描述】:

我有从 SH 文件运行的 Selenium 脚本。 当我从控制台运行 sh 文件时,它工作得很好, 但从 Cron 作业运行的相同文件失败。

SH 文件:

#!/bin/sh

export DISPLAY=:10
cd /home/user
python3 selenium.py > /home/user/selenium.log 2>&1

我得到的错误是众所周知的:

Traceback(最近一次调用最后一次):文件 "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/common/service.py", 第 74 行,开始 stdout=self.log_file, stderr=self.log_file) 文件“/usr/lib/python3.5/subprocess.py”,第 947 行,在 init restore_signals,start_new_session)文件“/usr/lib/python3.5/subprocess.py”,第 1551 行,在 _execute_child raise child_exception_type(errno_num, err_msg) FileNotFoundError: [Errno 2] No such file or directory: 'geckodriver'

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件“so_login.py”,第 12 行,在 设置 self.driver = webdriver.Firefox() 文件“/usr/local/lib/python3.5/dist-packages/selenium/webdriver/firefox/webdriver.py”, 第 142 行,在 init 中 self.service.start() 文件“/usr/local/lib/python3.5/dist-packages/selenium/webdriver/common/service.py”, 第 81 行,开始 os.path.basename(self.path),self.start_error_message)selenium.common.exceptions.WebDriverException:消息:'geckodriver' 可执行文件需要在 PATH 中。

我在控制台也有这个错误,但我通过安装 geckodriver 并将其移动到 /usr/local/bin 解决了它,它在控制台上工作正常,但为什么它不能从 CRON 工作?

【问题讨论】:

如果您需要一个 X-Windows/GUI 会话,那么它将无法与 crontab 一起使用,因为 crontab 不知道与哪个 X-Windows 会话关联。 如何让它工作?我像这里描述的那样无头使用它medium.com/@griggheo/… Cron 假定不显示,因此没有帧缓冲区。因此,我看不到它与 Cron 一起工作。您是否考虑过使用 Jenkins 进行调度? @RamanSailopal 确定它可以工作。使用 XVFB 作为 X 的虚拟帧缓冲区 【参考方案1】:

考虑使用pyvirtualdisplay 为您管理窗口会话

用 pip 安装

$ pip install pyvirtualdisplay

然后在您的代码中添加如下内容:

from pyvirtualdisplay import Display


def main():
    # Display creates a virtual frame buffer and manages it for you
    with Display(visible=False, size=(1200, 1500)):
        # Run the test of your code here

    # When your code is finished and exits the with block, the with
    # context manager cleans up the virtual display for you


if __name__ == "__main__":
    main()

【讨论】:

以上是关于Selenium 脚本从控制台工作,不能在 CRON 中工作 - Geckodriver 错误的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins怎么安装?Jenkins控制台输出乱码怎么处理?Jenkins执行selenium脚本时浏览器不显示怎么处理?

Selenium python find_element_by_class_name() 从 v 2.2 到 2.21 停止工作——不能使用“复合类名”

selenium自动化原理

Selenium 脚本不工作异常

如何运行无头的selenium脚本,独立于主机和浏览器

Selenium - 使用 Windows 任务计划程序与命令行