Skip to main content

Selenium Grid (實驗性)

簡介

Playwright 可以連接到 Selenium Grid Hub 執行 Selenium 4 來啟動 Google ChromeMicrosoft Edge 瀏覽器,而不是在本地機器上執行瀏覽器。請注意,此功能是實驗性的,並且會相應地優先處理。

warning

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()

傳遞額外的功能

如果你的網格需要設定額外的功能(例如,你使用外部服務),你可以設定 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

傳遞額外的標頭

如果你的網格需要設置額外的標頭(例如,你應該提供授權 token 以在你的雲中使用瀏覽器),你可以設置 SELENIUM_REMOTE_HEADERS 環境變數來提供 JSON 序列化的標頭。

SELENIUM_REMOTE_URL=http://<selenium-hub-ip>:4444 SELENIUM_REMOTE_HEADERS="{'Authorization':'OAuth 12345'}" 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 images 文件。對於實驗性的 arm 映像,請參見 docker-seleniarm

獨立模式

這裡是一個執行 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-chrome:4.3.0-20220726

# Alternatively for arm architecture
docker run -d -p 4444:4444 --shm-size="2g" -e SE_NODE_GRID_URL="http://localhost:4444" seleniarm/standalone-chromium:103.0

然後執行 Playwright。

SELENIUM_REMOTE_URL=http://localhost:4444 pytest --browser chromium

Hub and nodes 模式

這裡是一個執行 selenium hub 和單個 selenium 節點的範例,並將 Playwright 連接到 hub。請注意,hub 和節點有不同的 IP,並且在啟動節點容器時,我們傳遞指向 hub 的 SE_NODE_GRID_URL 環境變數。

首先啟動 hub 容器和一個或多個 node 容器。

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 pytest --browser chromium

Selenium 3

內部,Playwright 使用 Chrome DevTools Protocol websocket 連接到瀏覽器。Selenium 4 暴露了這種能力,而 Selenium 3 則沒有。

這意味著 Selenium 3 以最佳努力方式支援,Playwright 嘗試直接連接到網格節點。網格節點必須能夠從執行 Playwright 的機器直接訪問。