Pra*_*gar 13 python selenium selenium-webdriver docker alpine-linux
我正在尝试在运行 alpine 的 Docker 容器中使用 Python 和 selenium 运行 chrome。它运行得很好,直到有一天,当我实例化 chrome 时,它开始抛出以下错误。
Message: unknown error: Chrome failed to start: crashed.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/lib/chromium/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Run Code Online (Sandbox Code Playgroud)
这是创建此错误的代码:
from selenium import webdriver
def generate_plugin():
pluginfile = 'proxy_auth_plugin.zip'
# manifest_json, background_js same as https://stackoverflow.com/a/61764363/9809865
with zipfile.ZipFile(pluginfile, 'w') as zp:
zp.writestr("manifest.json", manifest_json)
zp.writestr("background.js", background_js)
return pluginfile
chrome_options = webdriver.ChromeOptions()
prefs = {"profile.default_content_setting_values.notifications": 2}
chrome_options.add_experimental_option("prefs", prefs)
plugin = generate_plugin()
chrome_options.add_extension(plugin)
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument("--window-size=1920,1080")
chrome_options.add_argument("--remote-debugging-port=9222")
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("https://google.com")
Run Code Online (Sandbox Code Playgroud)
它生成的异常的完整回溯
driver = webdriver.Chrome(chrome_options=chrome_options)
| File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
| desired_capabilities=desired_capabilities)
| File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
| self.start_session(capabilities, browser_profile)
| File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
| response = self.execute(Command.NEW_SESSION, parameters)
| File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
| self.error_handler.check_response(response)
| File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
| raise exception_class(message, screen, stacktrace)
Message: unknown error: Chrome failed to start: crashed.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/lib/chromium/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Run Code Online (Sandbox Code Playgroud)
我正在使用pyvirtualdisplay
webdriver 的显示,但即使我--headless
在代码中添加该选项,它也会引发相同的错误。
这是我的 Dockerfile:
FROM python:3.6-alpine
RUN apk add xvfb
# update apk repo
RUN echo "http://dl-4.alpinelinux.org/alpine/v3.7/main" >> /etc/apk/repositories && \
echo "http://dl-4.alpinelinux.org/alpine/v3.7/community" >> /etc/apk/repositories
# install chromedriver
RUN apk update
RUN apk add chromium=93.0.4577.82-r2 --repository=http://dl-cdn.alpinelinux.org/alpine/v3.15/community chromium-chromedriver=93.0.4577.82-r2
Run Code Online (Sandbox Code Playgroud)
FROM python:3.6-alpine
RUN apk add xvfb
# update apk repo
RUN echo "http://dl-4.alpinelinux.org/alpine/v3.7/main" >> /etc/apk/repositories && \
echo "http://dl-4.alpinelinux.org/alpine/v3.7/community" >> /etc/apk/repositories
# install chromedriver
RUN apk update
RUN apk add chromium=93.0.4577.82-r2 --repository=http://dl-cdn.alpinelinux.org/alpine/v3.15/community chromium-chromedriver=93.0.4577.82-r2
Run Code Online (Sandbox Code Playgroud)
我原来用的是RUN apk add chromium=86.0.4240.111-r0 --repository=http://dl-cdn.alpinelinux.org/alpine/v3.13/community chromium-chromedriver=86.0.4240.111-r0
它一直运行良好,直到开始抛出该异常。所以我转到我的 docker 容器并尝试手动运行 Chrome。它引发了这个错误
/usr/lib/chromium # ./chrome --version
Chromium 93.0.4577.82
/usr/lib/chromium # ./chromedriver --version
ChromeDriver 93.0.4577.82 (e3a25d9b9e2d0b728e045ec87c0aa4942aa46e4e-refs/branch-heads/4577@{#1237})
/usr/lib/chromium #
Run Code Online (Sandbox Code Playgroud)
将 Chrome 版本升级到 93.0.4577.82 后,我可以手动启动 Chrome 和 Chromedriver,但运行代码会产生相同的回溯。
我使用的是 Macbook Pro M1 (2020) 和 MacOS 12.1
Docker版本是最新的:4.3.2(72729)
我已经查看了 StackOverflow 和其他论坛上提出的几乎所有其他问题,但到目前为止,没有一个建议对我有用。
我尝试了 alpine 上可用的所有 Chrome 和 Chromedriver 版本,从 72.0.3626.121-r0 到 Edge 版本
我什至从 Docker 中清除了所有映像、容器和卷并重新安装了它。这也没有帮助。
传递--headless
参数使其运行。这让我假设问题与使用有关pyvirtualdisplay
我错过了补充一点,我正在创建一个扩展 zip 文件以将其即时添加到 Chrome。
这是现在发生的事情:
selenium.common.exceptions.WebDriverException: Message: Message: unknown error: failed to wait for extension background page to load: chrome-extension://ilkejjjhcpjkcecgdkkdfaocminnclpo/_generated_background_page.html
--headless
参数并禁用扩展,它工作得很好--headless
参数并启用扩展,它会抛出与第 2 点相同的异常。我在使用官方 selenium docker image的 M1 上遇到了同样的问题。
但有一段关于如何修复它:
对于在 Mac M1 或 Raspberry Pi 等平台上运行的实验性 docker 容器映像,请参阅托管在seleniumhq-community/docker-seleniarm 的社区驱动存储库。这些映像是为三个独立的体系结构构建的:linux/arm64 (aarch64)、linux/arm/v7 (armhf) 和 linux/amd64。
此外,这些实验性容器镜像发布在 Seleniarm Docker Hub注册表上。
有关这些图像的更多信息,请参阅问题#1076 。
如果您正在使用 Intel 或 AMD64 架构,我们建议使用此存储库 (SeleniumHQ/docker-selenium) 中的容器映像,而不是实验性映像。
归档时间: |
|
查看次数: |
13613 次 |
最近记录: |