跳到主要内容

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 的地址。

# 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 Grid Hub 的 SELENIUM_REMOTE_URL 环境变量。请注意,这仅适用于 Google Chrome 和 Microsoft Edge。

SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 dotnet test

您无需更改代码,只需像往常一样使用您的测试框架或 BrowserType.LaunchAsync()

传递额外的 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'}}" dotnet test

传递额外的 headers

如果您的 Grid 需要设置额外的 headers(例如,您应该提供授权令牌才能使用云中的浏览器),您可以设置 SELENIUM_REMOTE_HEADERS 环境变量来提供 JSON 序列化的 headers。

SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_HEADERS="{'Authorization':'Basic b64enc'}" dotnet test

详细日志

运行并设置 DEBUG=pw:browser* 环境变量,以查看 Playwright 如何连接到 Selenium Grid。

DEBUG=pw:browser* SELENIUM_REMOTE_URL=http://internal.grid:4444 dotnet test

如果您提交 issue,请包含此日志。

使用 Selenium Docker

使用 Selenium Grid 的一种简单方法是运行官方 Docker 容器。请参阅 selenium docker images 文档以获取更多信息。有关镜像标签约定,请阅读更多

独立模式

以下是运行 Selenium 独立模式并连接 Playwright 到它的示例。请注意,Hub 和节点都在同一个 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 dotnet test

Hub 和节点模式

以下是运行 Selenium Hub 和单个 Selenium 节点,并将 Playwright 连接到 Hub 的示例。请注意,Hub 和节点具有不同的 IP,并且我们在启动节点容器时传递了指向 Hub 的 SE_NODE_GRID_URL 环境变量。

首先启动 Hub 容器和一个或多个节点容器。

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 dotnet test

Selenium 3

在内部,Playwright 使用 Chrome DevTools Protocol websocket 连接到浏览器。Selenium 4 公开了此能力,而 Selenium 3 则没有。

这意味着对 Selenium 3 的支持尽力而为,Playwright 尝试直接连接到 Grid 节点。Grid 节点必须可以直接从运行 Playwright 的机器访问。