docker容器中的python jupyter笔记本连接到selenium/standalone-chrome

标签 python selenium docker jupyter-notebook

我使用以下docker-compose.yml运行基于jupyter/datascience-notebook:87210526f381的jupyter笔记本和selenium/node-chrome :

    version: '3'
    services:
    selenium-hub:
        image: selenium/hub:3.141.59-dubnium
        container_name: selenium-hub
        ports:
        - "4444:4444"
    chrome:
        image: selenium/node-chrome:3.141.59-dubnium
        volumes:
        - /dev/shm:/dev/shm
        depends_on:
        - selenium-hub
        environment:
        - HUB_HOST=selenium-hub
        - HUB_PORT=4444
        networks: 
        - backend
    nbdatascience: 
        container_name: nbdatascience
        image: aabor/nbdatascience
        build: nbdatascience/.
        volumes:
        - /home/$USER/py:/home/jovyan/work/py
        - /home/$USER/.jupyter:/home/jovyan/.jupyter
        ports:
        - "10000:8888"
        environment:
        - TZ="Europe/Kiev"
        restart: always
        networks: 
        - backend
        depends_on:
        - chrome
    networks: 
    backend:
        driver: bridge

当 selenium hub 上的所有这些容器都可以通过 http://localhost:4444/ 访问时,以及 jupyter 实验室 http://localhost:10000/lab

我正在尝试从执行以下 python 脚本的笔记本打开 Web 浏览器 session :

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
cap = DesiredCapabilities.CHROME
driver = webdriver.Remote(command_executor='localhost:4444', desired_capabilities=cap)

这给了我错误消息: HTTPConnectionPool(host='localhost', port=4444): Max retries exceeded with url: /session (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f4c17137278>: Failed to establish a new connection: [Errno 111] Connection refused',))

更正:运行此 python 脚本可以解决问题,创建驱动程序并且可以在 headless 模式下浏览互联网:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
cap = DesiredCapabilities.CHROME 
driver = webdriver.Remote(command_executor='http://selenium-hub:4444/wd/hub',desired_capabilities=cap)

如何打开与另一个 docker 容器中运行的 selenium chrome 的连接? SeleniumHQ/docker-selenium 中的文档缺乏这些细节。

文档 on docker network说“一旦连接,容器只能使用另一个容器的IP地址或名称进行通信”,那么是否可以在python脚本中通过名称调用另一个容器,例如:driver = webdriver.Remote(command_executor='chrome', desired_capabilities=cap) 。我尝试了这个命令,但它给了我同样的错误:“连接被拒绝”。

最佳答案

将您的 selenium 容器连接到同一网络后端,并使用 selenium-hub:4444 作为主机名,而不是 localhost:4444

顺便问一下,你声明网络的目的是什么?它默认由 docker-compose 创建。

此外,无需显式声明 container_name - 容器默认获取其服务的名称。

我建议进行以下更改:

docker-compose.yml

version: '3'
services:
  selenium-hub:
    image: selenium/hub:3.141.59-dubnium
    ports:
    - "4444:4444"
  chrome:
    image: selenium/node-chrome:3.141.59-dubnium
    volumes:
      - /dev/shm:/dev/shm
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
  nbdatascience: 
    image: aabor/nbdatascience
    build: nbdatascience/.
    volumes:
      - /home/$USER/py:/home/jovyan/work/py
      - /home/$USER/.jupyter:/home/jovyan/.jupyter
    ports:
      - "10000:8888"
    environment:
      - TZ="Europe/Kiev"
    restart: always
    depends_on:
      - chrome

此外,如果您不从外部连接到容器,请删除暴露的端口。

关于docker容器中的python jupyter笔记本连接到selenium/standalone-chrome,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54217645/

相关文章:

Python 对被调用方法的错误处理

java - Selenium Java - 如何外包 @Config 并从外部类调用测试?

docker - Jenkins:dockerfile 代理命令不在容器中运行

python - Pandas 根据两个数据框计算百分比

python - 防止单元格或魔法函数保存到 python 脚本

javascript - Protractor:我应该如何从 browser.executeAsync 中传播错误?

javascript - Selenium:如何编写同步 Selenium 自动化?

postgresql - 我在本地计算机上收到 “docker: invalid reference format.”

docker - 链接的 docker-compose 容器发出 http 请求

Python FileCookieJar.save() 问题