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 之前,请确保该网格能与 Selenium WebDriver 正常工作。例如,运行其中一个示例并传递 SELENIUM_REMOTE_URL
环境变量。如果 WebDriver 示例无法工作,请检查 Selenium hub/node/standalone 的输出错误,并在 Selenium 问题库 中搜索可能的解决方案。
启动 Selenium Grid
如果您运行分布式 Selenium Grid,Playwright 需要 selenium 节点注册为可访问的地址,以便能够连接到浏览器。为确保其按预期工作,在运行 selenium 节点时设置 SE_NODE_GRID_URL
环境变量指向 hub。
# 启动 selenium 节点
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 npx playwright test
您无需更改代码,只需照常使用测试工具或 browserType.launch() 即可。
传递额外能力参数
如果您的网格需要设置额外能力参数(例如使用外部服务),可以通过设置 SELENIUM_REMOTE_CAPABILITIES
环境变量来提供 JSON 序列化的能力参数。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_CAPABILITIES="{'mygrid:options':{os:'windows',username:'John',password:'secure'}}" npx playwright test
传递额外请求头
如果您的网格需要设置额外请求头(例如需要提供授权令牌以使用云中的浏览器),可以通过设置 SELENIUM_REMOTE_HEADERS
环境变量来提供 JSON 序列化的请求头。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_HEADERS="{'Authorization':'Basic b64enc'}" npx playwright test
详细日志
通过设置 DEBUG=pw:browser*
环境变量来运行,可以查看 Playwright 如何连接到 Selenium Grid。
DEBUG=pw:browser* SELENIUM_REMOTE_URL=http://internal.grid:4444 npx playwright test
如果提交问题,请包含此日志。
使用 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 npx playwright test
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 npx playwright test
Selenium 3
在内部实现上,Playwright 通过 Chrome DevTools Protocol 的 WebSocket 协议与浏览器建立连接。Selenium 4 支持这一能力,而 Selenium 3 则不支持。
这意味着对 Selenium 3 的支持是以最佳努力方式提供的,Playwright 会尝试直接连接到网格节点。网格节点必须能够从运行 Playwright 的机器直接访问。