Selenium Grid(实验性)
简介
Playwright 可以连接到 Selenium Grid 集线器,该集线器运行 Selenium 4 以启动 **Google Chrome** 或 **Microsoft Edge** 浏览器,而不是在本地机器上运行浏览器。请注意,此功能为 **实验性** 功能,并根据此优先级进行处理。
Playwright 与 Selenium Grid 集线器的集成在未来可能会出现故障的风险。在使用它之前,请确保权衡风险和收益。
更多详情
在内部,Playwright 使用 Chrome DevTools 协议 websocket 连接到浏览器。Selenium 4 目前公开了此功能。但是,这 在未来可能不再适用。如果 Selenium 取消此功能,Playwright 将停止与之配合使用。
在将 Playwright 连接到您的 Selenium Grid 之前,请确保网格与 Selenium WebDriver 配合使用。例如,运行 其中一个示例 并传递 SELENIUM_REMOTE_URL
环境变量。如果 webdriver 示例无法运行,请查看 Selenium 集线器/节点/独立输出中的任何错误,并在 Selenium 问题 中搜索可能的解决方案。
启动 Selenium Grid
如果您运行分布式 Selenium Grid,则 Playwright 需要将 Selenium 节点注册到可访问的地址,以便它可以连接到浏览器。为了确保其按预期工作,在运行 Selenium 节点时,设置指向集线器的 SE_NODE_GRID_URL
环境变量。
# 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 集线器的 SELENIUM_REMOTE_URL
环境变量。请注意,这仅适用于 Google Chrome 和 Microsoft Edge。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 dotnet test
您无需更改代码,只需像往常一样使用您的测试工具或 BrowserType.LaunchAsync() 即可。
传递其他功能
如果您的网格需要设置其他功能(例如,您使用外部服务),则可以设置 SELENIUM_REMOTE_CAPABILITIES
环境变量以提供 JSON 序列化功能。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_CAPABILITIES="{'mygrid:options':{os:'windows',username:'John',password:'secure'}}" dotnet test
传递其他标头
如果您的网格需要设置其他标头(例如,您应该提供授权令牌以在您的云中使用浏览器),则可以设置 SELENIUM_REMOTE_HEADERS
环境变量以提供 JSON 序列化标头。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_HEADERS="{'Authorization':'OAuth 12345'}" dotnet test
详细日志
使用 DEBUG=pw:browser*
环境变量运行以查看 Playwright 如何连接到 Selenium Grid。
DEBUG=pw:browser* SELENIUM_REMOTE_URL=http://internal.grid:4444 dotnet test
如果您提交问题,请包含此日志。
使用 Selenium Docker
使用 Selenium Grid 的一种简单方法是运行官方的 docker 容器。在 selenium docker 镜像 文档中了解更多信息。有关实验性 arm 镜像,请参阅 docker-seleniarm。
独立模式
以下是在运行 selenium 独立实例并将 Playwright 连接到它的示例。请注意,集线器和节点位于同一 localhost
上,并且我们传递了指向它的 SE_NODE_GRID_URL
环境变量。
首先启动 Selenium。
docker run -d -p 4444:4444 --shm-size="2g" -e SE_NODE_GRID_URL="https://127.0.0.1:4444" selenium/standalone-chrome:4.3.0-20220726
# Alternatively for arm architecture
docker run -d -p 4444:4444 --shm-size="2g" -e SE_NODE_GRID_URL="https://127.0.0.1:4444" seleniarm/standalone-chromium:103.0
然后运行 Playwright。
SELENIUM_REMOTE_URL=https://127.0.0.1:4444 dotnet test
集线器和节点模式
以下是在运行 selenium 集线器和单个 selenium 节点并将 Playwright 连接到集线器的示例。请注意,集线器和节点具有不同的 IP,并且在启动节点容器时,我们传递了指向集线器的 SE_NODE_GRID_URL
环境变量。
首先启动集线器容器和一个或多个节点容器。
docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.3.0-20220726
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-chrome:4.3.0-20220726
# Alternatively for arm architecture
docker run -d -p 4442-4444:4442-4444 --name selenium-hub seleniarm/hub:4.3.0-20220728
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"
seleniarm/node-chromium:103.0
然后运行 Playwright。
SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 dotnet test
Selenium 3
在内部,Playwright 使用 Chrome DevTools 协议 websocket 连接到浏览器。Selenium 4 公开了此功能,而 Selenium 3 则没有。
这意味着 Selenium 3 以尽力而为的方式得到支持,其中 Playwright 尝试直接连接到网格节点。网格节点必须可以从运行 Playwright 的机器直接访问。