Selenium Grid(实验性)
介绍
Playwright 可以连接到运行 Selenium 4 的 Selenium Grid Hub,以启动 Google Chrome 或 Microsoft Edge 浏览器,而不是在本地机器上运行浏览器。请注意,此功能为实验性,并据此确定优先级。
未来 Playwright 与 Selenium Grid Hub 的集成存在中断的风险。在使用前请务必权衡风险与收益。
更多细节
在内部,Playwright 使用 Chrome DevTools Protocol websocket 连接到浏览器。Selenium 4 目前公开了此功能。然而,未来可能并非如此。如果 Selenium 放弃此功能,Playwright 将无法与其一起工作。
在将 Playwright 连接到您的 Selenium Grid 之前,请确保 Grid 可以与 Selenium WebDriver 一起工作。例如,运行其中一个示例,并传递 SELENIUM_REMOTE_URL
环境变量。如果 webdriver 示例不起作用,请查看您的 Selenium hub/node/standalone 输出中的任何错误,并搜索 Selenium issues 查找可能的解决方案。
启动 Selenium Grid
如果您运行分布式 Selenium Grid,Playwright 需要 Selenium 节点注册一个可访问的地址,以便它可以连接到浏览器。为了确保其按预期工作,在运行 Selenium 节点时,设置 SE_NODE_GRID_URL
环境变量,指向 hub。
# Start selenium node
SE_NODE_GRID_URL="http://<selenium-hub-ip>:4444" java -jar selenium-server-<version>.jar node
将 Playwright 连接到 Selenium Grid
要将 Playwright 连接到 Selenium Grid 4,设置 SELENIUM_REMOTE_URL
环境变量,指向您的 Selenium Grid Hub。请注意,这仅适用于 Google Chrome 和 Microsoft Edge。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 pytest --browser chromium
您无需更改代码,只需像往常一样使用您的测试框架或 browser_type.launch()。
传递附加能力
如果您的 Grid 需要设置附加能力(例如,您使用外部服务),您可以设置 SELENIUM_REMOTE_CAPABILITIES
环境变量,以提供 JSON 序列化的能力。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_CAPABILITIES="{'mygrid:options':{os:'windows',username:'John',password:'secure'}}" pytest --browser chromium
传递附加头
如果您的 Grid 需要设置附加头(例如,您应提供授权令牌才能在云中使用浏览器),您可以设置 SELENIUM_REMOTE_HEADERS
环境变量,以提供 JSON 序列化的头。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_HEADERS="{'Authorization':'Basic b64enc'}" pytest --browser chromium
详细日志
使用 DEBUG=pw:browser*
环境变量运行,以查看 Playwright 如何连接到 Selenium Grid。
DEBUG=pw:browser* SELENIUM_REMOTE_URL=http://internal.grid:4444 pytest --browser chromium
如果您提交问题,请包含此日志。
使用 Selenium Docker
使用 Selenium Grid 的一个简单方法是运行官方 docker 容器。在Selenium docker 镜像文档中了解更多信息。有关镜像标签约定,请阅读更多。
独立模式
这里是运行 Selenium standalone 并将 Playwright 连接到它的一个示例。请注意,hub 和 node 在同一个 localhost
上,并且我们传递了指向它的 SE_NODE_GRID_URL
环境变量。
首先启动 Selenium。
docker run -d -p 4444:4444 --shm-size="2g" -e SE_NODE_GRID_URL="http://localhost:4444" selenium/standalone-chromium:latest
然后运行 Playwright。
SELENIUM_REMOTE_URL=http://localhost:4444 pytest --browser chromium
Hub 和节点模式
这里是运行 Selenium hub 和单个 Selenium node,并将 Playwright 连接到 hub 的一个示例。请注意,hub 和 node 的 IP 不同,并且我们在启动 node 容器时传递了指向 hub 的 SE_NODE_GRID_URL
环境变量。
首先启动 hub 容器以及一个或多个 node 容器。
docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.25.0
docker run -d -p 5555:5555 \
--shm-size="2g" \
-e SE_EVENT_BUS_HOST=<selenium-hub-ip> \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
-e SE_NODE_GRID_URL="http://<selenium-hub-ip>:4444"
selenium/node-chromium:4.25.0
然后运行 Playwright。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 pytest --browser chromium
Selenium 3
在内部,Playwright 使用 Chrome DevTools Protocol websocket 连接到浏览器。Selenium 4 公开了此功能,而 Selenium 3 没有。
这意味着对 Selenium 3 的支持是尽力而为的,Playwright 尝试直接连接到 Grid 节点。Grid 节点必须可以直接从运行 Playwright 的机器访问。