使用 Docker 将 Flask 应用程序远程连接到 Selenium Grid 时出现问题

Trouble Remotely Connecting Flask App to Selenium Grid using Docker

我是 Docker 和 Selenium 网格的新手,在让我的网络应用程序连接到 selenium hub 时遇到问题。

docker-compose.yml

version: '3.8'
services:
  db:
    image: postgres
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    ports:
      - "${POSTGRES_PORT}:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
  web:
    build:
      context: ..
      dockerfile: docker/Dockerfile
    environment:
      FLASK_ENV: ${FLASK_ENV}
      FLASK_CONFIG: ${FLASK_CONFIG}
      APPLICATION_DB: ${APPLICATION_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_HOSTNAME: "db"
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_PORT: ${POSTGRES_PORT}
    command: flask run --host 0.0.0.0
    volumes:
      - ..:/opt/code
    ports:
      - "5000:5000"
  chrome: 
    image: selenium/node-chrome:4.0.0-20211013
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_GRID_URL=http://localhost:4444
    ports:
      - "6900:5900"

  edge:
    image: selenium/node-edge:4.0.0-20211013
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_GRID_URL=http://localhost:4444
    ports:
      - "6901:5900"

  firefox:
    image: selenium/node-firefox:4.0.0-20211013
    shm_size: 2gb
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_GRID_URL=http://localhost:4444
    ports:
      - "6902:5900"

  selenium-hub:
    image: selenium/hub:4.0.0-20211013
    container_name: selenium-hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"


volumes:
  pgdata:

当 运行 连接容器堆栈并检查 netstat -a 时,我可以看到我的桌面正在侦听端口 4444,而当我终止容器时,它没有。

我还可以通过访问 https//:localhost/4444 来验证集线器是 运行ning 并且我的所有节点都连接正常,但是当我从我的 运行 driver = webdriver.Remote(command_executor="http://localhost:4444") python flask 应用程序(在上面指定为 web 的容器中 运行ning)我得到 error:

urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=4444): Max retries
exceeded with url: /session (Caused by NewConnectionError('<urllib3.connection.HTTPConnection
object at 0x7fd4855b7730>: Failed to establish a new connection: [Errno 111] Connection refused'))

我已经尝试指定所需的功能来匹配特定节点的驱动程序,但是无论如何我都会收到同样的错误。

我正在使用 Selenium 的最新版本“4.0.0”,您可以看到网格部分的 4.0.0 图像,所以我认为这不是兼容性问题。

docker ps


       Name                       Command              State                            Ports                          
------------------------------------------------------------------------------------------------------------------------
development_chrome_1    /opt/bin/entry_point.sh         Up      0.0.0.0:6900->5900/tcp,:::6900->5900/tcp                
development_db_1        docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp,:::5432->5432/tcp                
development_edge_1      /opt/bin/entry_point.sh         Up      0.0.0.0:6901->5900/tcp,:::6901->5900/tcp                
development_firefox_1   /opt/bin/entry_point.sh         Up      0.0.0.0:6902->5900/tcp,:::6902->5900/tcp                
development_web_1       flask run --host 0.0.0.0        Up      0.0.0.0:5000->5000/tcp,:::5000->5000/tcp                
selenium-hub            /opt/bin/entry_point.sh         Up      0.0.0.0:4442->4442/tcp,:::4442->4442/tcp,               
                                                                0.0.0.0:4443->4443/tcp,:::4443->4443/tcp,               
                                                                0.0.0.0:4444->4444/tcp,:::4444->4444/tcp                

我觉得我在这里从根本上遗漏了一些东西,有什么想法吗?

我现在明白错误了。当我需要指定由 selenium grid 部署的网络名称时,我错误地尝试与我的客户端连接到 http://localhost:4444。

修复

flask_app.py

中更改此行
driver = webdriver.Remote(command_executor="http://localhost:4444")

收件人:

driver = webdriver.Remote(command_executor="http://container-name:4444")

其中container-name是docker-compose.yml

中设置的selenium hub名称
  selenium-hub:
    image: selenium/hub:4.0.0-20211013
    container_name: selenium-hub
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"

在我的例子中:“selenium-hub”

使用的 docker 网络上的资源:https://docs.docker.com/compose/networking/

最后的想法

我想我仍然使用 http://localhost:port 连接到网格集线器和 Web 容器这一事实让我感到困惑。我想区别在于客户请求来自哪里?从 docker 堆栈外部还是内部?无论如何,希望这对某人有所帮助。