python - Selenium 与 Docker:为什么 KeyError 'status'?
问题描述
我尝试将 selenium 与 Docker 和 Docker Compose 一起使用。每个文件的目录结构和内容如下。
本地目录结构
Desktop
└── selenium_example
├── docker-compose.yml
├── Dockerfile
├── requirements.txt
└── src
└── example.py
码头工人-compose.yml
version: "3"
services:
selenium:
image: selenium/standalone-firefox:4.0.0-rc-1-prerelease-20210618
ports:
- 4444:4444
- 5900:5900
volumes:
- /dev/shm:/dev/shm
shm_size: 2gb
app:
build: .
volumes:
- /path/to/Desktop/selenium_example:/app
environment:
SELENIUM_URL: http://selenium:4444/wd/hub
tty: true
Dockerfile
FROM python:3.9-slim
ENV PYTHONIOENCODING utf-8
ENV TZ="Asia/Tokyo"
ENV LANG=C.UTF-8
ENV LANGUAGE=en_US:en
RUN mkdir -p /app
WORKDIR /app
COPY ./requirements.txt ./requirements.txt
RUN pip install -r requirements.txt
要求.txt
selenium
例子.py
import os
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
driver = webdriver.Remote(
command_executor=os.environ["SELENIUM_URL"],
desired_capabilities=DesiredCapabilities.FIREFOX.copy(),
)
driver.get('https://www.google.com')
print(driver.title)
driver.quit()
问题
但是,当我运行时example.py
,出现以下错误。
selenium_example % docker-compose build
selenium_example % docker-compose up -d
selenium_example % docker-compose exec app python src/example.py
Traceback (most recent call last):
File "/app/src/example.py", line 10, in <module>
driver = webdriver.Remote(
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
self.start_session(capabilities, browser_profile)
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 130, in check_response
status = value["status"]
KeyError: 'status'
这些代码有什么问题?
额外信息
macOS Big Sur(version 11.4)
Apple M1
% docker version
Client:
Cloud integration: 1.0.17
Version: 20.10.7
API version: 1.41
Go version: go1.16.4
Git commit: f0df350
Built: Wed Jun 2 11:56:23 2021
OS/Arch: darwin/arm64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.7
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: b0f5bc3
Built: Wed Jun 2 11:55:36 2021
OS/Arch: linux/arm64
Experimental: false
containerd:
Version: 1.4.6
GitCommit: d71fcd7d8303cbf684402823e425e9dd2e99285d
runc:
Version: 1.0.0-rc95
GitCommit: b9ee9c6314599f1b4a7f497e1f1f856fe433d3b7
docker-init:
Version: 0.19.0
GitCommit: de40ad0
解决方案
我自己找到了解决方案。
问题是 docker selenium 不支持 M1/ARM。我在 M1/ARM 上找到了适用于 Chromium 和 Firefox 等的 docker 图像。
https://hub.docker.com/u/seleniarm
我固定docker-compose.yml
如下。
version: "3"
services:
selenium:
image: seleniarm/standalone-firefox:4.0.0-beta-1-20210215
ports:
- 4444:4444
- 5900:5900
shm_size: 2gb
app:
build: .
volumes:
- /path/to/Desktop/selenium_example:/app
environment:
SELENIUM_URL: http://selenium:4444/wd/hub
tty: true
使用seleniarm
图像可以解决问题。
selenium_example % docker-compose exec app python src/example.py
https://www.google.com/
参考:
推荐阅读
- android - RapidAPI 具有 API 密钥……它可以有一个通用的 URL 吗?
- postgresql - 使用 Poco::Data::Postgress::Connector 在 postgres db 中查询数组
- react-native - AsyncStorage 返回 Promise。你如何解决承诺?
- python - 如何在二维数组中使用更多索引?
- xml - 在邮递员中按名称而不是按索引解析 XML 响应
- autodesk-forge - viewer.restoreState 在标记视图模式下不起作用
- python - 更改数据框中的背景颜色时出错
- azure-cosmosdb - Database.ReadAsync() 有什么用?
- sql - Postgresql中的SQL Server MERGE语句?
- python - 给定一个名称,返回一个带有消息的字符串:一个给 X,一个给我。X 是给定的名字。我写了代码,但没有传递任何参数时出错