Docker Selenium:selenium.common.exceptions.WebDriverException:消息:服务 chromedriver 意外退出。状态码是:127

Posted

技术标签:

【中文标题】Docker Selenium:selenium.common.exceptions.WebDriverException:消息:服务 chromedriver 意外退出。状态码是:127【英文标题】:Docker Selenium: selenium.common.exceptions.WebDriverException: Message: Service chromedriver unexpectedly exited. Status code was: 127 【发布时间】:2019-05-31 06:40:35 【问题描述】:

我在我的 python 项目中使用 selenium 的 chromedriver。

我正在成功构建我的 Dockerfile:

FROM ubuntu:17.04
FROM selenium/standalone-chrome
FROM python:3.6
RUN apt update
RUN apt-get install -y libnss3 libgconf-2-4
ADD ./requirements.txt /tmp/requirements.txt
RUN python -m pip install -r /tmp/requirements.txt
ADD . /opt/example1/
# rights?
RUN chmod +x /opt/example1/assets/chromedriver
WORKDIR /opt/example1
CMD ["python","-u","program.py"]

但是当我运行我的 docker 容器时,我得到了以下错误:

Traceback(最近一次调用最后一次):文件“program.py”,第 8 行,在 MdCrawler(MD_START_URL, "MobileDe").start() 文件 "/opt/example1/mobile_de_crawler.py",第 17 行,在 init 中 self.web_driver_chrome = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH) 文件 "/usr/local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", 第 73 行,在 init 中 self.service.start() 文件“/usr/local/lib/python3.6/site-packages/selenium/webdriver/common/service.py”, 第 98 行,开始 self.assert_process_still_running() 文件“/usr/local/lib/python3.6/site-packages/selenium/webdriver/common/service.py”, 第 111 行,在 assert_process_still_running % (self.path, return_code) selenium.common.exceptions.WebDriverException:消息:服务 /opt/example1/assets/chromedriver 意外退出。状态码 是:127

有人知道我可以做些什么来防止这个错误吗? 是什么导致了这个崩溃?

这是我发生错误的初始化代码:

CHROME_DRIVER_PATH = os.path.abspath('assets/chromedriver')


class MdCrawler(Crawler):

def __init__(self, start_url, source):
    super().__init__(start_url, source)
    serialized_arr = self.read_data_from_json_file(JSON_FILE_PATH)
    self.sent_ids = [] if serialized_arr is None else serialized_arr
    >>> self.web_driver_chrome = webdriver.Chrome(executable_path=CHROME_DRIVER_PATH)
    exit(1)

编辑 1:

我已经编辑了 Dockerfile(添加了 ubuntu:17.04 和 aptget libnss3 libgconf-2-4)。构建我的 docker 镜像后,我得到了不同的错误:

selenium.common.exceptions.WebDriverException:消息:未知错误: 找不到 Chrome 二进制文件(驱动程序信息:chromedriver=2.45.615279 (12b89733300bd268cff3b78fc76cb8f3a7cc44e5),平台=Linux 4.9.125-linuxkit x86_64)

编辑 2:

我已经添加了

RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list
RUN apt-get update
RUN apt-get install -y google-chrome-stable

到我的 Dockerfile,但新的错误来了:

raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome 无法启动:异常退出(未知错误: DevToolsActivePort 文件不存在)(进程从 chrome location /usr/bin/google-chrome 不再运行,所以 ChromeDriver 假设 Chrome 已崩溃。)(驱动程序信息: 铬驱动程序=2.45.615279 (12b89733300bd268cff3b78fc76cb8f3a7cc44e5),平台=Linux 4.9.125-linuxkit x86_64)

【问题讨论】:

docker run imagename /opt/example1/assets/chromedriver 可能会提供信息;到目前为止,您显示的错误消息只是说不起作用。 @DavidMaze 这是我的输出: (carcrawler) Lukas-MacBook-Pro-2:carcrawler lukadragicevic$ docker run lukatest /opt/example1/assets/chromedriver /opt/example1/assets/ chromedriver: 加载共享库时出错:libnss3.so:无法打开共享对象文件:没有这样的文件或目录 @DavidMaze 我已经更新了我的帖子(见编辑 1)。感谢您的回复。 【参考方案1】:

我的 Docker 容器中 Selenium chromedriver 的最小测试脚本如下所示:

import selenium.webdriver

options = selenium.webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')

driver = selenium.webdriver.Chrome(chrome_options=options)
driver.get('https://www.python.org/')
print(driver.title)
driver.close()

所以看起来您缺少 --headless--no-sandbox 参数。

【讨论】:

我现在有完全相同的代码并且运行良好,但我从目标网站 (mobile.de) 收到消息“很遗憾,自动访问此页面被拒绝。”。我怎么能通过这个街区?【参考方案2】:

你没有忘记添加无头模式吗?

chrome_options = Options()
chrome_options.add_argument("--headless")

【讨论】:

我忘记了,现在我已经用这部分代码进行了测试,但我遇到了同样的错误。

以上是关于Docker Selenium:selenium.common.exceptions.WebDriverException:消息:服务 chromedriver 意外退出。状态码是:127的主要内容,如果未能解决你的问题,请参考以下文章

在docker-compose中运行python selenium

在 docker 中使用 selenium 运行 django 测试

Docker Selenium:selenium.common.exceptions.WebDriverException:消息:服务 chromedriver 意外退出。状态码是:127

如何录制在 docker 内无头运行的 selenium 测试?

需要检查如何在 Docker 中使用 sikuli 和 Selenium

selenium结合docker构建分布式测试环境