docker - 为什么使用未检测到的 chromedriver 无法连接到 Chrome?

标签 docker selenium selenium-chromedriver undetected-chromedriver

我正在运行 https://hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc/ 的 docker 容器内运行 python 脚本.
python 脚本可以在下面找到:

import logging
logging.basicConfig(level=logging.NOTSET)
import undetected_chromedriver.v2 as uc
import time
driver = uc.Chrome()
driver.get('https://www.google.com/')
time.sleep(777)

日志的输出可以在下面找到:

DEBUG:undetected_chromedriver.patcher:getting release number from /LATEST_RELEASE
DEBUG:undetected_chromedriver.patcher:downloading from https://chromedriver.storage.googleapis.com/105.0.5195.52/chromedriver_linux64.zip
DEBUG:undetected_chromedriver.patcher:unzipping /tmp/tmpo6txm7dt
INFO:undetected_chromedriver.patcher:patching driver executable /root/.local/share/undetected_chromedriver/f628cdd8dcd9c5f0_chromedriver
DEBUG:uc:created a temporary folder in which the user-data (profile) will be stored during this
session, and added it to chrome startup arguments: --user-data-dir=/tmp/tmp5ctkku_n
DEBUG:uc:did not find a bad exit_type flag 
DEBUG:selenium.webdriver.remote.remote_connection:POST http://localhost:48393/session {"capabilities": {"firstMatch": [{}], "alwaysMatch": {"browserName": "chrome", "pageLoadStrategy": "normal", "goog:chromeOptions": {"extensions": [], "binary": "/usr/bin/google-chrome", "args": ["--remote-debugging-host=127.0.0.1", "--remote-debugging-port=52403", "--user-data-dir=/tmp/tmp5ctkku_n", "--lang=en-US", "--no-default-browser-check", "--no-first-run", "--log-level=0"], "debuggerAddress": "127.0.0.1:52403"}}}}
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): localhost:48393
DEBUG:urllib3.connectionpool:http://localhost:48393 "POST /session HTTP/1.1" 500 769
DEBUG:selenium.webdriver.remote.remote_connection:Remote response: status=500 | data={"value":{"error":"unknown error","message":"unknown error: cannot connect to chrome at 127.0.0.1:52403\nfrom chrome not reachable","stacktrace":"#0 0x55ca526ee693 \u003Cunknown>\n#1 0x55ca524e79db \u003Cunknown>\n#2 0x55ca524d781e \u003Cunknown>\n#3 0x55ca52510677 \u003Cunknown>\n#4 0x55ca52507e9f \u003Cunknown>\n#5 0x55ca52543953 \u003Cunknown>\n#6 0x55ca5253d743 \u003Cunknown>\n#7 0x55ca52513533 \u003Cunknown>\n#8 0x55ca52514715 \u003Cunknown>\n#9 0x55ca5273e7bd \u003Cunknown>\n#10 0x55ca52741bf9 \u003Cunknown>\n#11 0x55ca52723f2e \u003Cunknown>\n#12 0x55ca527429b3 \u003Cunknown>\n#13 0x55ca52717e4f \u003Cunknown>\n#14 0x55ca52761ea8 \u003Cunknown>\n#15 0x55ca52762052 \u003Cunknown>\n#16 0x55ca5277c71f \u003Cunknown>\n#17 0x7f2846a68609 \u003Cunknown>\n"}} | headers=HTTPHeaderDict({'Content-Length': '769', 'Content-Type': 'application/json; charset=utf-8', 'cache-control': 'no-cache'})
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:uc:closing webdriver
DEBUG:uc:killing browser
DEBUG:uc:successfully removed /tmp/tmp5ctkku_n
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    driver = uc.Chrome()
  File "/usr/local/lib/python3.8/dist-packages/undetected_chromedriver/__init__.py", line 401, in __init__
    super(Chrome, self).__init__(
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chrome/webdriver.py", line 69, in __init__
    super().__init__(DesiredCapabilities.CHROME['browserName'], "goog",
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chromium/webdriver.py", line 92, in __init__
    super().__init__(
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 270, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.8/dist-packages/undetected_chromedriver/__init__.py", line 589, in start_session
    super(selenium.webdriver.chrome.webdriver.WebDriver, self).start_session(
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 363, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 428, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 243, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot connect to chrome at 127.0.0.1:52403
from chrome not reachable
Stacktrace:
#0 0x55ca526ee693 <unknown>
#1 0x55ca524e79db <unknown>
#2 0x55ca524d781e <unknown>
#3 0x55ca52510677 <unknown>
#4 0x55ca52507e9f <unknown>
#5 0x55ca52543953 <unknown>
#6 0x55ca5253d743 <unknown>
#7 0x55ca52513533 <unknown>
#8 0x55ca52514715 <unknown>
#9 0x55ca5273e7bd <unknown>
#10 0x55ca52741bf9 <unknown>
#11 0x55ca52723f2e <unknown>
#12 0x55ca527429b3 <unknown>
#13 0x55ca52717e4f <unknown>
#14 0x55ca52761ea8 <unknown>
#15 0x55ca52762052 <unknown>
#16 0x55ca5277c71f <unknown>
#17 0x7f2846a68609 <unknown>

DEBUG:undetected_chromedriver.dprocess:cleaning up pid 2685 
DEBUG:undetected_chromedriver.patcher:successfully unlinked /root/.local/share/undetected_chromedriver/f628cdd8dcd9c5f0_chromedriver
DEBUG:uc:closing webdriver
DEBUG:uc:killing browser

如您所见,它下载了一个新版本“105.0.5195.52”,我知道这个版本必须与设备上的 chrome 浏览器版本相匹配。这可以在下面看到:

root@5e90a4da40db:~# /usr/bin/google-chrome --version
Google Chrome 105.0.5195.125

我很迷茫,如果有人知道如何解决这个问题,请告诉我!

最佳答案

在 GitHub 票证上发布了一个解决方案:https://github.com/ultrafunkamsterdam/undetected-chromedriver/issues/743#issuecomment-1249283856

首先,您需要在该 Linux 机器上安装 Xvfb 虚拟显示器,以避免使用 headless 模式。更多信息在这里:https://stackoverflow.com/a/36608933/7058266

其次,您可能需要 --no-sandbox 作为 Chromium 选项以避免在 Linux 上出错。

那应该涵盖了一些事情。为了简化这个过程,您可以使用现有的 Selenium Python 框架,https://github.com/seleniumbase/SeleniumBase ,它已经根据您使用的操作系统为您提供了所需的设置。

SeleniumBase 包括 pytest 选项:--xvfb--uc 用于自动使用 Xvfb 模式和未检测到的 chromedriver 模式作为选项.它包括对 undetected-chromedriver 库的更新,该库在本文发布时已有 6 个多月没有更新。

关于docker - 为什么使用未检测到的 chromedriver 无法连接到 Chrome?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73838436/

相关文章:

django - 为什么docker容器中的Django不起作用?

python - 如何在没有 Polipo 的情况下将 Crawlera 与 selenium(Python、Chrome、Windows)一起使用

java - 如何使用 Selenium 和 Java 在自动化测试中单击按钮

javascript - 使用 Webdriverjs Selenium 加载默认的 chrome 配置文件

python - Selenium 中的 Invalid XPath expression 错误(具有有效的 XPath 表达式)

python - selenium-python chrome webdriver 的 'service_args' 是什么?

python - 使用 selenium 和 chromedriver 时出现 BrokenPipeError

docker - 为什么 "Docker run"每次都创建新容器?

django - docker-compose 不启动 postgres 图像

运行 docker-compose up 时出现 Azure DevOps Pipeline 错误