首页 > 解决方案 > 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

标签: pythondockerseleniumselenium-webdriverdocker-compose

解决方案


我自己找到了解决方案。

问题是 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/

参考:


推荐阅读