繁体   English   中英

如何使用 Selenium 在 Docker 容器中运行 Chrome Headless?

[英]How to run Chrome Headless in Docker Container with Selenium?

我正在尝试运行一个简单的测试文件,该文件旨在在 openjdk docker 容器内的 chrome 上打开 google.com 并在完成后返回“完全成功”,但是,我不断收到相同的错误消息,指出“服务 object 没有属性过程”。 这是我不断收到的错误:

Traceback (most recent call last):
  File "/NewJersey/test.py", line 60, in <module>
    print(main())
          ^^^^^^
  File "/NewJersey/test.py", line 42, in main
    driver = webdriver.Chrome(service = service, options=chrome_options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    super().__init__(
  File "/usr/local/lib/python3.11/dist-packages/selenium/webdriver/chromium/webdriver.py", line 103, in __init__
    self.service.start()
  File "/usr/local/lib/python3.11/dist-packages/selenium/webdriver/common/service.py", line 106, in start
    self.assert_process_still_running()
  File "/usr/local/lib/python3.11/dist-packages/selenium/webdriver/common/service.py", line 117, in assert_process_still_running
    return_code = self.process.poll()
                  ^^^^^^^^^^^^
AttributeError: 'Service' object has no attribute 'process'

这是我正在运行的代码:

#General Imports
from logging import error
import os
import sys
import time
import os.path
import random


#Selenium Imports (Chrome)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

#ChromeDriver Import
from webdriver_manager.chrome import ChromeDriverManager

def main():
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-gpu")

    service = ChromeService("/chromedriver")

    driver = webdriver.Chrome(service = service, options=chrome_options)

    try:
        completion_msg = reroute(driver)
        print(completion_msg)
        driver.close()
        return "Test Completed Successfully"
    
    except error as Error:
        return Error


def reroute(driver):
    driver.get("https://www.google.com")
    return "Success"

if __name__ == "__main__":
    print(main())

这是我的 docker 容器:

# syntax=docker/dockerfile:1

FROM openjdk:11

ENV PATH = "${PATH}:/chromedriver/chromedriver.exe"


RUN apt-get update && apt-get install -y \
      software-properties-common \
      unzip \
      curl \
      xvfb \
      wget \
          bzip2 \
          snapd

# Chrome
RUN apt-get update && \
    apt-get install -y gnupg wget curl unzip --no-install-recommends && \
    wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
    echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list && \
    apt-get update -y && \
    apt-get install -y google-chrome-stable && \
    CHROMEVER=$(google-chrome --product-version | grep -o "[^\.]*\.[^\.]*\.[^\.]*") && \
    DRIVERVER=$(curl -s "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_$CHROMEVER") && \
    wget -q --continue -P /chromedriver "http://chromedriver.storage.googleapis.com/$DRIVERVER/chromedriver_linux64.zip" && \
    unzip /chromedriver/chromedriver* -d /chromedriver

# Python
RUN apt-get update && apt-get install -y \
    python2.7 \
    python-setuptools \
    python3-pip

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt

COPY . .

CMD python3 test.py

当我第一次开始我的项目时,我尝试用 firefox 来做,但由于某些限制选择切换到 chrome。

尝试研究后,有建议将chromedriver的路径传递给服务object,并将chromedriver的路径添加到docker容器中的PATH中,这两个我都已经做了,如上所示。 我继续得到完全相同的错误。

我还没有找到上述问题的任何其他解决方案,所以我将不胜感激任何帮助!

万一其他人偶然发现这个问题并遇到类似的问题,这就是我解决它的方法。

我只是完全删除了服务 object。 似乎无论出于何种原因,服务 object 都未正确配置,甚至在我将 ChromeDriver 路径添加到 dockerfile 上的系统路径后甚至不需要。代码片段现在如下所示:

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-gpu")

driver = webdriver.Chrome(options=chrome_options)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM