跳到主要内容

Selenium Grid(实验性)

简介

Playwright 可以连接运行 Selenium 4 的 Selenium Grid Hub,以启动 Google ChromeMicrosoft 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。

# 启动 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 pytest --browser chromium

你无需更改代码,只需像往常一样使用你的测试工具或 browser_type.launch()

传递额外的 capabilities

如果你的 grid 需要设置额外的 capabilities(例如,你使用了外部服务),可以设置 SELENIUM_REMOTE_CAPABILITIES 环境变量,提供 JSON 序列化的 capabilities。

SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_CAPABILITIES="{'mygrid:options':{os:'windows',username:'John',password:'secure'}}" pytest --browser chromium

传递额外的 headers

如果你的 grid 需要设置额外的 headers(例如,你需要提供授权 token 才能在云端使用浏览器),可以设置 SELENIUM_REMOTE_HEADERS 环境变量,提供 JSON 序列化的 headers。

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

如果你要提交 issue,请附上该日志。

使用 Selenium Docker

使用 Selenium Grid 的一种简单方式是运行官方 docker 容器。详细内容请参阅 selenium docker 镜像 文档。关于镜像标签命名规范,请阅读更多

独立模式

以下是运行 selenium 独立模式并连接 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 节点,并将 Playwright 连接到 hub 的示例。注意 hub 和 node 有不同的 IP,并且在启动 node 容器时传递了 SE_NODE_GRID_URL 环境变量指向 hub。

首先启动 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 的机器直接访问。