使用 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 堆栈外部还是内部?无论如何,希望这对某人有所帮助。
我是 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 堆栈外部还是内部?无论如何,希望这对某人有所帮助。