該專案是由志願者貢獻者完成的,他們投入了數千小時的時間,並在 Apache License 2.0 下免費提供原始程式碼。
這些 Docker 映像帶有一些標籤來簡化其使用,請在我們的一個版本中查看它們。
若要取得新版本的通知,請將您自己新增為「僅發布」觀察者。
這些映像發佈到 Selenium Docker Hub 的 Docker Hub 註冊表中。
您需要協助使用這些 Docker 映像嗎?請透過 https://www.selenium.dev/support/ 與我們聯繫
--shm-size="2g"
docker run -d -p 4444:4444 -p 7900:7900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
將您的 WebDriver 測試指向 http://localhost:4444
就是這樣!
(可選)要查看容器內發生的情況,請造訪 http://localhost:7900/?autoconnect=1&resize=scale&password=secret。
有關可視化容器活動的更多詳細信息,請查看調試部分。
☝️ 當包含瀏覽器的映像執行docker run
時,請使用標誌--shm-size=2g
來使用主機的共用記憶體。
☝️ 始終使用帶有完整標籤的 Docker 映像來固定特定的瀏覽器和 Grid 版本。有關詳細信息,請參閱標記約定。
從基於image tag的4.21.0
開始,專案支援的架構如下:
建築學 | 可用的 |
---|---|
x86_64(又稱 amd64) | ✅ |
aarch64(又稱arm64/armv8) | ✅ |
armhf(又稱arm32/armv7l) | ❌ |
以下瀏覽器在多架構映像中可用:
建築學 | 鉻合金 | 鉻 | 火狐瀏覽器 | 邊緣 |
---|---|---|---|---|
x86_64(又稱 amd64) | ✅ | ✅ | ✅ | ✅ |
aarch64(又稱arm64/armv8) | ❌ | ✅ | ✅ | ❌ |
armhf(又稱arm32/armv7l) | ❌ | ❌ | ❌ | ❌ |
筆記:
Google 不會為 Linux/ARM 平台建立 Chrome ( google-chrome
)。因此,Chrome(節點和獨立)映像僅適用於 AMD64。同樣,微軟也沒有為 Linux/ARM 平台建置 Edge ( microsoft-edge
)。
由於效能和穩定性問題,不建議在 ARM64 平台上模擬運行 AMD64 映像。
對於 Linux/ARM,請使用開源 Chromium 瀏覽器。 Chromium(節點和獨立)映像可在多架構中使用。
$ docker run --rm -it -p 4444:4444 -p 5900:5900 -p 7900:7900 --shm-size 2g selenium/standalone-chromium:latest
多架構影像在 CircleCI 上使用資源類別 Linux/ARM64 進行測試。請參閱下面的狀態。
對於在 Apple M 系列或 Raspberry Pi 等平台上運行的實驗性 docker 容器映像,seleniumhq-community/docker-seleniarm 的儲存庫提供了在 Seleniarm Docker Hub 註冊表上發布的映像。
有關這些圖像的更多信息,請參閱問題 #1076。
現在,分叉 seleniumhq-community/docker-seleniarm 已合併。
我們建議在 Docker Engine 中啟用容器化映像儲存的實驗功能。 containerd
理解多平台鏡像,其中單一鏡像標籤可以引用涵蓋一系列作業系統和硬體架構的不同變體。它簡化了在不同平台上建置、儲存和分發圖像的過程。
在 Docker 引擎中啟用該功能的單一命令:
make set_containerd_image_store
若要建立多平台的所有映像,請執行以下命令:
PLATFORMS=linux/amd64,linux/arm64 make build
若要建立特定平台的映像,請執行以下命令:
PLATFORMS=linux/arm64 make build
預設情況下,在不指定PLATFORMS
變數的情況下,映像是為linux/amd64
平台建置的。
Nightly 鏡像建構在上游專案 Selenium 的 Nightly 建置之上,並包含此儲存庫中主分支的最新變更。圖片標籤是nightly
。不建議在生產中使用圖像。它僅用於測試目的。
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:nightly
查看 docker compose 以開始使用 Nightly 映像 docker-compose-v3-full-grid-nightly.yml
為了執行測試或以其他方式使用預發布的瀏覽器,Google、Mozilla 和 Microsoft 為需要查看即將向普通大眾發布的內容的人維護了一個開發和 Beta 發布管道。
以下是在獨立模式下運行它們的說明:
鉻測試版:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:beta
Chrome 開發人員:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:dev
火狐測試版:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:beta
火狐開發者:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:dev
邊緣測試版:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-edge:beta
邊緣開發:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-edge:dev
docker-compose-v3-beta-channel.yml:
# To execute this docker compose yml file use `docker compose -f docker-compose-v3-beta-channel.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-beta-channel.yml down`
version: " 3 "
services:
chrome:
image: selenium/node-chrome:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- " 4442:4442 "
- " 4443:4443 "
- " 4444:4444 "
docker-compose-v3-dev-channel.yml:
# To execute this docker compose yml file use `docker compose -f docker-compose-v3-dev-channel.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-dev-channel.yml down`
version: " 3 "
services:
chrome:
image: selenium/node-chrome:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- " 4442:4442 "
- " 4443:4443 "
- " 4444:4444 "
有關 Dev 和 Beta 通道容器映像的更多信息,請參閱有關透過 Docker Selenium 開發和 Beta 通道瀏覽器的部落格文章。
火狐瀏覽器
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
鉻合金
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
邊緣
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
注意: 4444
連接埠只能同時運作一個Standalone容器。
有不同的方法來運行影像並建立具有集線器和節點的網格,請檢查以下選項。
集線器和節點將在同一網路中創建,它們將透過容器名稱相互識別。第一步需要建立 Docker 網路。
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
$ docker network create grid
$ docker run - d - p 4442 - 4444 : 4442 - 4444 -- net grid -- name selenium - hub selenium / hub: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - chrome: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - edge: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - firefox: 4.26 . 0 - 20241101
當您使用完網格且容器已退出時,可以使用下列命令刪除網路:
# Removes the grid network
$ docker network rm grid
集線器和節點將創建在不同的機器/虛擬機器上,它們需要知道彼此的 IP 才能正確通訊。如果多個節點將在同一台機器/VM 上執行,則必須將它們配置為公開不同的連接埠。
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 2> selenium/node-chrome:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 2> ` selenium / node - chrome: 4.26 . 0 - 20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 3> selenium/node-edge:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 3> ` selenium / node - edge: 4.26 . 0 - 20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 4> selenium/node-firefox:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 4> ` selenium / node - firefox: 4.26 . 0 - 20241101
$ docker run -d -p 5556:5556 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 4> -e SE_NODE_PORT=5556 selenium/node-chrome:4.26.0-20241101
$ docker run - d - p 5556 : 5556 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 4> ` - e SE_NODE_PORT = 5556 ` selenium / node - chrome: 4.26 . 0 - 20241101
Docker Compose 是啟動網格的最簡單方法。使用下面的連結資源,將它們保存在本地並檢查每個文件頂部的執行指令。
docker-compose-v2.yml
docker-compose-v3.yml
若要停止網格並清理已建立的容器,請執行docker compose down
。
docker-compose-v3-swarm.yml
可以啟動一個 Selenium 網格,並將其所有組件分開。為了簡單起見,僅提供 docker compose 的範例。將檔案儲存到本地,然後查看上面的執行指令。
docker-compose-v3-full-grid.yml
環境變數 | 選項 | 類型 | 預設值 | 描述 |
---|---|---|---|---|
SE_REJECT_UNSUPPORTED_CAPS | --reject-unsupported-caps | 布林值 | false | 如果網格不支援所要求的功能,則允許分發者立即拒絕請求。 |
SE_HEALTHCHECK_INTERVAL | --healthcheck-interval | 整數 | 120 | 這可確保伺服器在一段時間後可以成功 ping 所有節點。 |
可以使用selenium/video:ffmpeg-7.1-20241101
Docker 映像來記錄測試執行情況。每個運行瀏覽器的容器都需要一個容器。這意味著如果您運行 5 個節點/獨立容器,則需要 5 個視訊容器,映射為 1-1。
目前,執行此映射的唯一方法是手動(手動啟動容器或透過docker compose
)。我們正在迭代這個過程,將來這個設定可能會更加簡單。
我們提供的視訊Docker映像是基於jrottenberg/ffmpeg專案提供的ffmpeg Ubuntu映像,感謝您提供這個映像並簡化了我們的工作?
從基於映像標籤的4.20.0
開始,視訊 Docker 映像基於 linuxserver/docker-ffmpeg 專案提供的 FFmpeg Ubuntu 映像,因為該映像可用於多平台。感謝您簡化我們的專案並幫助我們在多種架構支援方面取得進展。
注意事項:
/videos
目錄中。映射本地目錄以獲取視訊。FILE_NAME
環境變數覆寫視訊檔案名,以避免出現意外結果。此範例顯示如何手動啟動容器:
$ docker network create grid
$ docker run -d -p 4444:4444 -p 6900:5900 --net grid --name selenium --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d --net grid --name video -v /tmp/videos:/videos selenium/video:ffmpeg-7.1-20241101
# Run your tests
$ docker stop video && docker rm video
$ docker stop selenium && docker rm selenium
容器停止並刪除後,您應該在電腦的/tmp/videos
目錄中看到一個視訊檔案。
這是使用集線器和一些節點的範例:
docker-compose-v3-video.yml
基於元資料在測試中的支援。當錄影機與瀏覽器節點一起部署並啟用SE_VIDEO_FILE_NAME=auto
並將元資料新增至測試時,視訊檔案名稱會擷取功能se:name
的值並將其用作視訊檔案名稱。
例如在 Python 綁定中:
from selenium . webdriver . chrome . options import Options as ChromeOptions
from selenium import webdriver
options = ChromeOptions ()
options . set_capability ( 'se:name' , 'test_visit_basic_auth_secured_page (ChromeTests)' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444" )
driver . get ( "https://selenium.dev" )
driver . quit ()
輸出視訊檔案名稱將為test_visit_basic_auth_secured_page_ChromeTests_
。
如果您的測試名稱由測試框架處理,並且它是唯一的,您也可以透過設定SE_VIDEO_FILE_NAME_SUFFIX=false
來停用會話 ID 附加到視訊檔案名稱。
檔案名稱將被修剪為 255 個字元以避免長檔案名稱。此外, space
字元將被_
替換,且檔案名稱中僅保留字母、數字、 -
(連字元)、 _
(底線)字元。
可以透過設定SE_VIDEO_FILE_NAME_TRIM_REGEX
環境變數來自訂修剪正規表示式。預設值為[:alnum:]-_
。正規表示式應與 bash 中的tr
指令相容。
在部署級別,記錄器容器始終處於運作狀態。此外,您可以透過會話功能se:recordVideo
停用視訊錄製過程。例如在 Python 綁定中:
options . set_capability ( 'se:recordVideo' , False )
在錄影機容器中,會根據Node SessionId在Hub中執行查詢GraphQL,並提取capability中se:recordVideo
的值,然後決定是否啟動視訊錄製過程。
注意:要到達 GraphQL 端點,記錄器容器需要知道 Hub URL。 Hub URL 可以透過環境變數SE_NODE_GRID_URL
傳遞。例如SE_NODE_GRID_URL
是http://selenium-hub:4444
。
RCLONE 安裝在錄影機映像中。您可以使用它將影片上傳到雲端儲存服務。除了上述的錄影之外,您還可以透過設定以下環境變數來啟用上傳功能:
version : " 3 "
services :
chrome_video :
image : selenium/video:ffmpeg-7.1-20241101
depends_on :
- chrome
environment :
- DISPLAY_CONTAINER_NAME=chrome
- SE_VIDEO_FILE_NAME=auto
- SE_VIDEO_UPLOAD_ENABLED=true
- SE_UPLOAD_DESTINATION_PREFIX=s3://mybucket/path
- RCLONE_CONFIG_S3_TYPE=s3
- RCLONE_CONFIG_S3_PROVIDER=GCS
- RCLONE_CONFIG_S3_ENV_AUTH=true
- RCLONE_CONFIG_S3_REGION=asia-southeast1
- RCLONE_CONFIG_S3_LOCATION_CONSTRAINT=asia-southeast1
- RCLONE_CONFIG_S3_ACL=private
- RCLONE_CONFIG_S3_ACCESS_KEY_ID=xxx
- RCLONE_CONFIG_S3_SECRET_ACCESS_KEY=xxx
- RCLONE_CONFIG_S3_ENDPOINT=https://storage.googleapis.com
- RCLONE_CONFIG_S3_NO_CHECK_BUCKET=true
SE_VIDEO_FILE_NAME=auto
將使用會話 ID 作為視訊檔案名稱。這可確保上傳的視訊檔案名稱是唯一的。視訊檔案名稱建構根據節點端點/status
(和可選的 GraphQL 端點)自動工作,以取得會話 ID、功能。
SE_VIDEO_UPLOAD_ENABLED=true
將啟用視訊上傳功能。在後台,它將創建一個包含文件和目標的管道文件,供上傳者使用和繼續。
SE_VIDEO_INTERNAL_UPLOAD=true
將使用容器中安裝的 RCLONE 進行上傳。如果您想使用其他 sidecar 容器進行上傳,請將其設定為false
。
每個模式的 ENV 變數 | 集線器/節點 | 獨立角色 | 動態網格 |
---|---|---|---|
SE_VIDEO_RECORD_STANDALONE (強制) | false (預設) | true | true |
DISPLAY_CONTAINER_NAME (必填) | 使用者輸入 | 使用者輸入 | (非必需) |
SE_NODE_PORT (可選) | 5555 | 4444 | (非必需) |
SE_NODE_GRID_URL (可選) | 使用者輸入 | (非必需) | (非必需) |
對於帶有前綴RCLONE_
環境變量,用於將遠端配置傳遞給 RCLONE。您可以在此處找到有關 RCLONE 配置的更多資訊。在動態網格中使用時,這些變數應與前綴SE_
組合,例如SE_RCLONE_
。請參閱下面的參考資料以了解更多詳細資訊。
配置Hub和Node的影片錄製和上傳:docker-compose-v3-video-upload.yml
為獨立角色配置視訊錄製和上傳:docker-compose-v3-video-upload-standalone.yml
配置動態網格(node-docker)的視訊錄製和上傳:docker-compose-v3-video-upload-dynamic-grid.yml
設定 Dynamic Grid 獨立版 (standalone-docker) 的錄影與上傳:tests/docker-compose-v3-test-standalone-docker.yaml
環境變數 | 預設值 | 描述 |
---|---|---|
SE_UPLOAD_RETAIN_LOCAL_FILE | false | 上傳成功後保留本機文件 |
SE_UPLOAD_COMMAND | copy | RCLONE指令用於傳輸檔案。保留本地檔案為false 時強制move |
SE_UPLOAD_OPTS | -P --cutoff-mode SOFT --metadata --inplace | 可以設定屬於 RCLONE 指令的其他選項。 |
SE_UPLOAD_CONFIG_FILE_NAME | upload.conf | 遠端主機的設定文件,而不是透過環境變數前綴 SE_RCLONE_* 設定 |
SE_UPLOAD_CONFIG_DIRECTORY | /opt/bin | 設定檔目錄(掛載其他目錄下的conf檔時更改) |
Grid 4 能夠按需啟動 Docker 容器,這意味著它將在後台為每個新會話請求啟動一個 Docker 容器,在那裡執行測試,當測試完成時,容器將被丟棄。
此執行模式可以在獨立角色或節點角色中使用。 「動態」執行模式需要被告知容器啟動時要使用哪些 Docker 映像。此外,Grid 需要知道 Docker 守護程式的 URI。此配置可以放置在本機toml
檔案中。
您可以將此檔案儲存在本機並命名,例如config.toml
。
[ docker ] # Configs have a mapping between the Docker image to use and the capabilities that need to be matched to # start a container with the given image. configs = [ " selenium/standalone-firefox:4.26.0-20241101 " , ' {"browserName": "firefox"} ' , " selenium/standalone-chrome:4.26.0-20241101 " , ' {"browserName": "chrome"} ' , " selenium/standalone-edge:4.26.0-20241101 " , ' {"browserName": "MicrosoftEdge"} ' ] host-config-keys = [ " Dns " , " DnsOptions " , " DnsSearch " , " ExtraHosts " , " Binds " ] # URL for connecting to the docker daemon # Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock. # 127.0.0.1 is used because internally the container uses socat when /var/run/docker.sock is mounted # If var/run/docker.sock is not mounted: # Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375. # macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock, # then use http://host.docker.internal:2375. # Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue. url = " http://127.0.0.1:2375 " # Docker image used for video recording video-image = " selenium/video:ffmpeg-7.1-20241101 " # Uncomment the following section if you are running the node on a separate VM # Fill out the placeholders with appropriate values # [server] # host =# port =
使用 config.toml 檔案中 [docker] 部分下的選用設定金鑰host-config-keys
(或 CLI 選項 --docker-host-config-keys)。使用者可以指定應傳遞給瀏覽器容器的 docker 主機配置金鑰清單。
Docker 主機配置的有效鍵名稱可以在 Docker API 文件中找到,也可以透過指令docker inspect
node-docker 容器找到。
如果您想要透過動態網格容器的磁碟區組態存取節點瀏覽器容器中的下載目錄(例如/home/seluser/Downloads
),您可以將下列設定新增至config.toml
文件
[ docker ]
host-config-keys = [ " Binds " ]
docker compose 檔案中的磁碟區配置
services :
node-docker :
image : selenium/node-docker:latest
volumes :
- ./assets:/opt/selenium/assets
- ./config.toml:/opt/selenium/docker.toml
- ./downloads:/home/seluser/Downloads
- /var/run/docker.sock:/var/run/docker.sock
environment :
- SE_NODE_DOCKER_CONFIG_FILENAME=docker.toml
/opt/selenium/config.toml
是所有映像中設定檔的預設路徑。一旦磁碟區配置共用到節點瀏覽器容器,其config.toml
可能會被節點 docker 容器設定檔覆蓋。
在這種情況下,將config.toml
檔案掛載到 node-docker 容器中的/opt/selenium/docker.toml
中。並設定環境變數SE_NODE_DOCKER_CONFIG_FILENAME=docker.toml
來指定啟動腳本的設定檔名稱。
請參閱範例 docker-compose-v3-test-node-docker.yaml
這可以擴展到完整的網格部署,所有元件都單獨部署。整體想法是將集線器放在一個虛擬機器中,將每個節點放在單獨的、更強大的虛擬機器中。
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/node-docker:4.26.0-20241101
$ docker network create grid
$ docker run - d - p 4442 - 4444 : 4442 - 4444 -- net grid -- name selenium - hub selenium / hub: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
- v ${PWD} / config.toml: / opt / selenium / config.toml `
- v ${PWD} / assets: / opt / selenium / assets `
- v / var / run / docker.sock: / var / run / docker.sock `
selenium / node - docker: 4.26 . 0 - 20241101
若要將資產保存在您的主機上,請將您的主機路徑安裝到/opt/selenium/assets
。
當您使用完網格且容器已退出時,可以使用下列命令刪除網路:
# Removes the grid network
$ docker network rm grid
docker run --rm --name selenium-docker -p 4444:4444
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/standalone-docker:4.26.0-20241101
docker run --rm --name selenium-docker -p 4444:4444 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/standalone-docker:4.26.0-20241101
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d -p 5555:5555
-e SE_EVENT_BUS_HOST= < ip-from-machine- 1>
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/node-docker:4.26.0-20241101
$ docker run -d -p 5555:5555 `
-e SE_EVENT_BUS_HOST= < ip-from-machine- 1> `
-e SE_EVENT_BUS_PUBLISH_PORT=4442 `
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/node-docker:4.26.0-20241101
完成config.toml
檔案中的[server]
部分。
[ docker ] # Configs have a mapping between the Docker image to use and the capabilities that need to be matched to # start a container with the given image. configs = [ " selenium/standalone-firefox:4.26.0-20241101 " , " { " browserName " : " firefox " } " , " selenium/standalone-chrome:4.26.0-20241101 " , " { " browserName " : " chrome " } " , " selenium/standalone-edge:4.26.0-20241101 " , " { " browserName " : " MicrosoftEdge " } " ] # URL for connecting to the docker daemon # Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock. # 127.0.0.1 is used because interally the container uses socat when /var/run/docker.sock is mounted # If var/run/docker.sock is not mounted: # Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375. # macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock, # then use http://host.docker.internal:2375. # Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue. url = " http://127.0.0.1:2375 " # Docker image used for video recording video-image = " selenium/video:ffmpeg-7.1-20241101 " # Uncomment the following section if you are running the node on a separate VM # Fill out the placeholders with appropriate values [ server ] host = < ip-from-node-machine> port = < port-from-node-machine>
若要將資產保存在您的主機上,請將您的主機路徑安裝到/opt/selenium/assets
。
這是使用集線器和節點的範例:
docker-compose-v3-dynamic-grid.yml
容器可以透過環境變數進一步配置,例如SE_NODE_SESSION_TIMEOUT
和SE_OPTS
。當建立子容器時,所有以SE_
為前綴的環境變數都會被轉送並設定在容器中。您可以在standalone-docker
或node-docker
容器中設定所需的環境變數。以下範例將所有會話的會話逾時設定為 700 秒:
docker run --rm --name selenium-docker -p 4444:4444
-e SE_NODE_SESSION_TIMEOUT=700
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/standalone-docker:4.26.0-20241101
docker run --rm --name selenium-docker -p 4444:4444 `
-e SE_NODE_SESSION_TIMEOUT=700 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/standalone-docker:4.26.0-20241101
要記錄您的 WebDriver 會話,您需要新增一個設定為true
se:recordVideo
欄位。您還可以設定時區和螢幕分辨率,例如:
{
"browserName" : " firefox " ,
"platformName" : " linux " ,
"se:recordVideo" : " true " ,
"se:timeZone" : " US/Pacific " ,
"se:screenResolution" : " 1920x1080 "
}
執行測試後,檢查安裝到 Docker 容器的路徑 ( ${PWD}/assets
),您應該會看到視訊和會話資訊。
從語言綁定中,您可以設定se:name
功能來動態變更輸出視訊檔案名稱。例如,在 Python 綁定中:
from selenium . webdriver . chrome . options import Options as ChromeOptions
from selenium import webdriver
options = ChromeOptions ()
options . set_capability ( 'se:recordVideo' , True )
options . set_capability ( 'se:screenResolution' , '1920x1080' )
options . set_capability ( 'se:name' , 'test_visit_basic_auth_secured_page (ChromeTests)' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444" )
driver . get ( "https://selenium.dev" )
driver . quit ()
測試執行後,在( ${PWD}/assets
)下,您可以在路徑/
中看到視訊檔案名
檔案名稱將被修剪為 255 個字符,以避免長檔案名稱。此外, space
字元將被_
替換,且檔案名稱中僅保留字母、數字、 -
(連字元)和_
(底線)字元。 (此 PR 合併後即可使用此功能)
tzdata
安裝在基礎鏡像中,您可以使用環境變數TZ
來設定容器中的時區。預設情況下,時區設定為UTC
。可以在此處找到支援的時區列表。例如:
$ docker run --rm --entrypoint= " " -e TZ=Asia/Ho_Chi_Minh selenium/node-chromium:latest date +%FT%T%Z
2024-08-28T18:19:26+07
我們提供了一個 Helm 圖表來將這些 Docker 映像部署到 Kubernetes。請參閱 Helm 自述文件以了解更多詳細資訊。
您可以傳遞SE_OPTS
變數和附加命令列參數來啟動集線器或節點。
$ docker run -d -p 4444:4444 -e SE_OPTS= " --log-level FINE " --name selenium-hub selenium/hub:4.26.0-20241101
您可以將SE_JAVA_OPTS
環境變數傳遞給 Java 進程。
$ docker run -d -p 4444:4444 -e SE_JAVA_OPTS=-Xmx512m --name selenium-hub selenium/hub:4.26.0-20241101
不要透過語言綁定中的瀏覽器選項來新增參數,例如:
options = ChromeOptions ()
options . add_argument ( '--incognito' )
options . add_argument ( '--disable-dev-shm-usage' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444/wd/hub" )
您也可以主動強制直接從(節點、獨立或節點 Docker)容器環境變數套用參數。定義環境變量,其名稱以SE_BROWSER_ARGS_
開頭,後面的配置鍵由您決定(確保在定義多個參數時這些變數是唯一的)。例如:
docker run -d -p 4444:4444
-e SE_BROWSER_ARGS_INCOGNITO=--incognito
-e SE_BROWSER_ARGS_DISABLE_DSHM=--disable-dev-shm-usage
selenium/standalone-chrome:latest
列出 chromium 命令列參數供您參考。
注意:目前,這適用於節點瀏覽器 Chrome/Chromium、Edge。
節點透過事件總線註冊自己。當網格以其典型的集線器/節點設定啟動時,集線器將充當事件總線,而當網格以其所有五個元素分開啟動時,事件總線將獨立運作。
在這兩種情況下,都需要告訴節點事件匯流排在哪裡,以便它可以註冊自己。這就是SE_EVENT_BUS_HOST
、 SE_EVENT_BUS_PUBLISH_PORT
和SE_EVENT_BUS_SUBSCRIBE_PORT
環境變數的用途。
在某些情況下,例如,如果您想要標記節點,則可能需要向節點配置提供自訂構造型。環境變數SE_NODE_STEREOTYPE
設定節點的config.toml
中的建構型條目。可以在此處找到範例 config.toml 檔案:設定匹配特定節點的自訂功能。
以下是這些環境變數的預設值的範例:
$ docker run -d
-e SE_EVENT_BUS_HOST= < event_bus_ip | event_bus_name >
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_STEREOTYPE= " { " browserName " : " ${SE_NODE_BROWSER_NAME} " , " browserVersion " : " ${SE_NODE_BROWSER_VERSION} " , " platformName " : " Linux " } "
--shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
將命令中繼到支援 WebDriver 的服務端點。將支援 WebDriver 的外部服務連接到 Selenium Grid 非常有用。此類服務的範例可以是雲端提供者或 Appium 伺服器。透過這種方式,Grid 可以更涵蓋本地不存在的平台和版本。
以下是配置中繼命令的範例。
docker-compose-v3-test-node-relay.yml
如果您只想中繼指令, selenium/node-base
適合此用途且輕量級。如果您想使用瀏覽器和中繼命令來配置節點,則可以使用對應的節點影像。
若要使用環境變數產生中繼配置,請設定SE_NODE_RELAY_URL
和其他變量,如下所示
[ relay ]
url = " ${SE_NODE_RELAY_URL} "
status-endpoint = " ${SE_NODE_RELAY_STATUS_ENDPOINT} "
protocol-version = " ${SE_NODE_RELAY_PROTOCOL_VERSION} "
configs = [ ' ${SE_NODE_RELAY_MAX_SESSIONS} ' , ' {"browserName": "${SE_NODE_RELAY_BROWSER_NAME}", "platformName": "${SE_NODE_RELAY_PLATFORM_NAME}", "appium:platformVersion": "${SE_NODE_RELAY_PLATFORM_VERSION}"} ' ]
要使用中繼節點執行範例測試,您可以複製該專案並嘗試以下命令:
make test_node_relay
預設情況下,可以透過http://127.0.0.1:4444/
存取 Selenium。可以透過指定SE_SUB_PATH
環境變數將 Selenium 配置為使用自訂子路徑。在下面的範例中,可以透過http://127.0.0.1:4444/selenium-grid/
造訪 Selenium
$ docker run -d -p 4444:4444 -e SE_SUB_PATH=/selenium-grid/ --name selenium-hub selenium/hub:4.26.0-20241101
預設情況SE_SCREEN_HEIGHT
, SE_SCREEN_DEPTH
以 1920 x 1080 的螢幕解析度開始,顏色深度為SE_SCREEN_DPI
位,dpi 為 96 SE_SCREEN_WIDTH
docker run -d -e SE_SCREEN_WIDTH=1366 -e SE_SCREEN_HEIGHT=768 -e SE_SCREEN_DEPTH=24 -e SE_SCREEN_DPI=74 selenium/standalone-firefox:4.26.0-20241101
在某些用例中,您可能需要將網格 URL 設定為節點,例如,如果您想存取 BiDi/CDP 端點。當您想要使用 Selenium 4 中存在的新RemoteWebDriver.builder()
或Augmenter()
時,這也是需要的(因為它們隱含地設定 BiDi/CDP 連線)。您可以透過SE_NODE_GRID_URL
環境變數來完成此操作,例如-e SE_NODE_GRID_URL=http://
。如果您想在會話執行時查看即時視圖,則需要設定此環境變數。
Grid 的預設會話逾時為 300 秒,其中會話可以處於陳舊狀態,直到被終止。您可以使用SE_NODE_SESSION_TIMEOUT
以秒為單位覆寫該值。
新的會話請求在處理之前會放入會話佇列中,並且該請求會保留在佇列中,直到在註冊的節點中找到符合的插槽。但是,如果未找到插槽,新會話請求可能會逾時。預設情況下,請求在達到逾時之前將在佇列中保留最多 300 秒。此外,每 5 秒嘗試處理一次請求(預設)。
可以透過 Hub 和 SessionQueue 中的環境變數( SE_SESSION_REQUEST_TIMEOUT
和SE_SESSION_RETRY_INTERVAL
)來覆寫這些值。例如,500 秒的逾時將為SE_SESSION_REQUEST_TIMEOUT=500
,2 秒的重試間隔將為SE_SESSION_RETRY_INTERVAL=2
。
預設情況下,透過SE_NODE_MAX_SESSIONS
環境變數將每個容器僅配置一個會話運行。可以將該數量增加到最大可用處理器數,這是因為當一個容器/瀏覽器有 1 個 CPU 運作時,可以實現更高的穩定性。
但是,如果您測量了效能並基於此,您認為每個容器中可以執行更多會話,則可以透過將SE_NODE_MAX_SESSIONS
設為所需的數字並將SE_NODE_OVERRIDE_MAX_SESSIONS
設為true
來覆蓋最大限制。不過,不建議執行比可用處理器更多的瀏覽器會話,因為這會導致資源超載。
當啟用視訊錄製時,覆蓋此設定會產生不良副作用,因為同一影片中可能會擷取多個瀏覽器工作階段。
Firefox、Chrome,使用無頭模式時,無需啟動 Xvfb 伺服器。
為了避免啟動伺服器,您可以將SE_START_XVFB
環境變數設為false
(或除true
之外的任何其他值),例如:
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub -e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_START_XVFB=false --shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
有關更多信息,請參閱此 GitHub 問題。
著名的:
SE_START_XVFB
需要設定為true
才能在--headless=new
模式下運作。在某些環境中,例如 Docker Swarm 或 Kubernetes,在執行 N 個測試後關閉 Node 或 Standalone 容器很有用。例如,這可以在 Kubernetes 中用於終止 pod,然後在 N 個會話後擴展一個新的 pod。將環境變數SE_DRAIN_AFTER_SESSION_COUNT
設定為大於零的值以啟用此行為。
$ docker run -e SE_DRAIN_AFTER_SESSION_COUNT=5 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
使用前面的命令,獨立容器將在執行 5 個會話後關閉。
在長時間運行的容器中,瀏覽器可能會留下一些殘留物。這些可能是已完成但未能完全停止瀏覽器的作業的瀏覽器進程被卡住,或寫入/tmp
檔案系統的臨時檔案(尤其是在基於 Chrome 的瀏覽器上)。為了避免這些資源填滿容器中的進程 ID 和檔案系統使用情況,節點容器中每小時都會執行一個自動清理腳本。這將清理舊進程和舊臨時檔案。預設情況下,此功能處於停用狀態。啟用後,這將清理運行時間超過 2 小時的瀏覽器以及超過 1 天的檔案。可以使用以下環境變數啟用和調整這些:
SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
:預設值false
,設定為true
以啟用清理。SE_BROWSER_LEFTOVERS_INTERVAL_SECS
:預設值3600
(1 小時),清理間隔以秒為單位。SE_BROWSER_LEFTOVERS_PROCESSES_SECS
:預設值7200
(2小時),運行時間超過此時間的瀏覽器將被殺死。SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS
:預設值1
(1 天),基於 Chrome 的瀏覽器在/tmp
中產生的檔案將在這些天數後被刪除(使用 Firefox 時將被忽略)。如果您使用 Selenium 進行長時間運行的會話,並且預計瀏覽器運行時間超過 2 小時,請不要將SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
設定為true
(保留預設值false
),或調整SE_BROWSER_LEFTOVERS_PROCESSES_SECS
以設定高於預期瀏覽的值。器進程。
$ docker run -e SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP=true --shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
使用前面的命令,將按照預設時間啟用清理。
$ docker run -e SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP=true
-e SE_BROWSER_LEFTOVERS_INTERVAL_SECS=7200
-e SE_BROWSER_LEFTOVERS_PROCESSES_SECS=3600
-e SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS=2
--shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
使用前面的命令,清理將啟用,但將每2 小時運行一次(而不是1 小時),將終止運行時間超過1 小時(而不是2 小時)的瀏覽器,並將刪除超過2 天的臨時檔案(而不是1)。
控制台日誌中很少有輸出變數(例如密碼、秘密等)被隱藏。出於偵錯目的,您可以透過將SE_MASK_SECRETS
設定為false
來停用它
建立 bash 腳本時,您可以使用語法echo "Current value is $(mask ${YOUR_VARIABLE})
來屏蔽輸出
SE_MASK_SECRETS_MIN_LENGTH
預設為3
。這意味著長字串將被屏蔽為***
以避免暴露長度以進行暴力攻擊。
預設情況下,位置/opt/selenium/secrets
中的映像中包含預設的自簽名證書
server.jks
:啟動伺服器時透過系統屬性javax.net.ssl.trustStore
為 JVM 設定的信任庫檔案。server.pass
:檔案透過系統屬性javax.net.ssl.trustStorePassword
包含 JVM 的信任庫密碼。tls.crt
:https 連接的伺服器憑證設定為 Selenium 選項--https-certificate
。tls.key
:https 連接的伺服器私鑰(PKCS8 格式)設定為 Selenium 選項--https-private-key
。有環境變數來配置安全連線:
環境變數 | 預設 | 選項 | 描述 |
---|---|---|---|
SE_ENABLE_TLS | false | 使用預設配置啟用安全連接 | |
SE_JAVA_SSL_TRUST_STORE | /opt/selenium/secrets/server.jks | 虛擬機 | |
SE_JAVA_SSL_TRUST_STORE_PASSWORD | /opt/selenium/secrets/server.pass | 虛擬機 | |
SE_JAVA_DISABLE_HOSTNAME_VERIFICATION | true | 虛擬機 | 停用主機內部元件檢查 |
SE_HTTPS_證書 | /opt/selenium/secrets/tls.crt | 碳粉匣 | 設定為 CLI 選項--https-certificate |
SE_HTTPS_PRIVATE_KEY | /opt/selenium/secrets/tls.key | 碳粉匣 | 設定為 CLI 選項--https-private-key |
透過磁碟區掛載,您可以將預設憑證替換為您自己的憑證。
自簽章憑證也需要受到客戶端的信任(新增至系統廣泛捆綁受信任的 CA),以避免在建立 RemoteWebDriver 時出現與 SSL 握手相關的錯誤訊息。
請參閱範例: docker-compose-v3-full-grid-secure.yml
不同的瀏覽器有不同的方式來設定綁定的語言和區域設定。
透過綁定建立 WebDriver 時設定設定檔首選項,可以將 Firefox 配置為使用特定語言和區域設定。此外,需要安裝語言包作為附加元件,瀏覽器 UI 語言才能生效。例如,要將瀏覽器語言和區域設定設為vi-VN
,您可以使用下列步驟:
取得所需語言的最新 Firefox 語言包,例如 https://download.mozilla.org/?product=firefox-langpack-latest-SSL&lang=vi。然後,您可以在建立 RemoteWebDriver 實例時將語言套件作為附加元件安裝。
profile = webdriver . FirefoxProfile ()
profile . set_preference ( 'intl.accept_languages' , 'vi-VN,vi' )
profile . set_preference ( 'intl.locale.requested' , 'vi-VN,vi' )
options = FirefoxOptions ()
options . profile = profile
driver = webdriver . Remote ( options = options , command_executor = "http://selenium-hub:4444/wd/hub" )
webdriver . Firefox . install_addon ( driver , "/local/path/to/vi.xpi" )
driver . get ( 'https://google.com' )
有一個腳本可以取得給定 Firefox 版本的所有可用語言包。您可以運行該腳本以將語言包獲取到您的來源。例如:
FIREFOX_VERSION= $( docker run --rm --entrypoint= " " selenium/node-firefox:latest firefox --version | awk ' {print $3} ' )
&& ./NodeFirefox/get_lang_package.sh ${FIREFOX_VERSION} /local/path/to/download
或者,您可以將容器目錄/home/seluser/firefox/distribution/extensions
掛載到主機目錄,以存取容器中預先建立的套件,以便在測試腳本中使用。
Supervisor用於管理容器中的流程和日誌。 supervisord
的一些配置可以透過環境變數設置,如下所示:
環境變數 | 預設 | supervisord 配置 |
---|---|---|
SE_SUPERVISORD_LOG_LEVEL | info | Supervisord.loglevel |
SE_SUPERVISORD_CHILD_LOG_DIR | /tmp | Supervisord.childlogdir |
SE_SUPERVISORD_LOG_FILE | /tmp/supervisord.log | 主管日誌文件 |
SE_SUPERVISORD_PID_FILE | /tmp/supervisord.pid | Supervisord.pid文件 |
克隆儲存庫,並從專案目錄根目錄中執行以下命令來建立所有內容:
$ VERSION=local make build
如果您需要配置環境變數來建立映像(例如 http 代理),只需設定一個環境變數BUILD_ARGS
,其中包含要傳遞到 docker 上下文的其他變數(這只適用於 docker >= 1.9)
$ BUILD_ARGS= " --build-arg http_proxy=http://acme:3128 --build-arg https_proxy=http://acme:3128 " make build
注意:省略VERSION=local
將使用已發布版本建立映像,但替換目前版本的日期。
如果你想使用主機 UID/GID 建立鏡像,只要設定一個環境變數BUILD_ARGS
$ BUILD_ARGS= " --build-arg UID= $( id -u ) --build-arg GID= $( id -g ) " make build
如果您想使用不同的預設使用者/密碼建立映像,只需設定環境變數BUILD_ARGS
$ BUILD_ARGS= " --build-arg SEL_USER=yourseluser --build-arg SEL_PASSWD=welcome " make build
基於最新的 Dockerfile(透過複製儲存庫並從專案目錄根目錄),您可以使用 Selenium Grid 和瀏覽器版本的特定組合來建立映像。
例如,您希望分別使用基於 Grid 的版本4.17.0
和 Chrome 瀏覽器版本119
、 120
、 123
建立node-chrome
和standalone-chrome
映像。
$ ./tests/build-backward-compatible/bootstrap.sh 4.17.0 119,120,123 chrome
一般來說,該腳本採用以下參數:
$1
(強制):Selenium Grid 版本。詳細資訊從矩陣檔案中獲取$2
(必填):瀏覽器主要版本,多個數值以逗號分隔。詳細資訊從矩陣檔案中獲取$3
(可選):瀏覽器名稱。如果未提供,它將迭代所有瀏覽器( chrome
、 edge
、 firefox
)$4
(可選):將映像推送到註冊表。預設情況下,它是false
。如果要將映像推送到註冊表,請將其設為true
(在執行腳本之前需要 Docker 登入您的命名空間)。若要設定映像的命名空間,您可以在執行腳本之前設定環境變數NAME
。例如:
$ export NAME=artifactory.yourcompany.com/selenium
$ ./tests/build-backward-compatible/bootstrap.sh 4.17.0 119,120,123 chrome
運行腳本後,您將看到帶有完整標籤的清單圖像,以按照標記約定固定特定網格和瀏覽器版本
鏡像中預先安裝了 Selenium 伺服器、瀏覽器和驅動程式。如果您想保留相同的 Selenium 版本,只需將瀏覽器及其驅動程式升級到最新版本。您可以按照以下步驟操作
克隆儲存庫,並從專案目錄根目錄執行以下命令進行升級:
$ VERSION= $EXPECTED_SELENIUM_VERSION make chrome_upgrade_version
例如: VERSION=4.16.1 make chrome_upgrade_version
新影像具有標籤$VERSION_YYYYMMDD
,其中YYYYMMDD
是目前日期。
$ VERSION= $SELENIUM_VERSION make firefox_upgrade_version
$ VERSION= $SELENIUM_VERSION make edge_upgrade_version
詳細指令可以參考Makefile檔案中的指令。
最好先檢查網格是否已啟動並準備好接收請求,這可以透過檢查/wd/hub/status
端點來完成。
準備好的網格由一個中心和兩個節點組成,可能如下所示:
{
"value" : {
"ready" : true ,
"message" : " Selenium Grid ready. " ,
"nodes" : [
{
"id" : " 6c0a2c59-7e99-469d-bbfc-313dc638797c " ,
"uri" : " http: u002fu002f 172.19.0.3:5555 " ,
"maxSessions" : 4 ,
"stereotypes" : [
{
"capabilities" : {
"browserName" : " firefox "
},
"count" : 4
}
],
"sessions" : [
]
},
{
"id" : " 26af3363-a0d8-4bd6-a854-2c7497ed64a4 " ,
"uri" : " http: u002fu002f 172.19.0.4:5555 " ,
"maxSessions" : 4 ,
"stereotypes" : [
{
"capabilities" : {
"browserName" : " chrome "
},
"count" : 4
}
],
"sessions" : [
]
}
]
}
}
"ready": true
值表示 Grid 已準備好接收請求。可以在執行任何測試之前透過腳本輪詢此狀態,也可以在啟動 docker 容器時將其新增為 HEALTHCHECK。
映像中包含的腳本 check-grid.sh 可用於輪詢網格狀態。
此範例每 15 秒檢查一次 Grid 的狀態,檢查完成後逾時為 30 秒,最多重試 5 次,直到容器被標記為不健康。請使用調整後的值來滿足您的需求,(如果需要)將--host
和--port
參數替換為您環境中使用的參數。
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub
--health-cmd= ' /opt/bin/check-grid.sh --host 0.0.0.0 --port 4444 '
--health-interval=15s --health-timeout=30s --health-retries=5
selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
注意: 行分隔符號在基於 Windows 的終端機上不起作用,請嘗試
^
或反引號。
可以透過執行docker ps
並驗證(healthy)|(unhealthy)
狀態或透過以下方式檢查來檢查容器的健康狀態:
$ docker inspect --format= ' {{json .State.Health.Status}} ' selenium-hub
" healthy "
Docker 中已知的一個常見問題是,正在運行的容器並不總是意味著其中的應用程式已準備就緒。解決此問題的簡單方法是使用“等待”腳本,可以在此處查看更多資訊。
以下腳本是如何使用 bash 完成此操作的範例,但如果您想使用用於編寫測試的程式語言來完成此操作,則相同的原則也適用。在下面的範例中,腳本將每秒輪詢狀態端點。如果網格在 30 秒內未準備好,腳本將退出並顯示錯誤代碼。
#! /bin/bash
# wait-for-grid.sh
set -e
url= " http://localhost:4444/wd/hub/status "
wait_interval_in_seconds=1
max_wait_time_in_seconds=30
end_time= $(( SECONDS + max_wait_time_in_seconds ))
time_left= $max_wait_time_in_seconds
while [ $SECONDS -lt $end_time ] ; do
response= $( curl -sL " $url " | jq -r ' .value.ready ' )
if [ -n " $response " ] && [ " $response " ] ; then
echo " Selenium Grid is up - executing tests "
break
else
echo " Waiting for the Grid. Sleeping for $wait_interval_in_seconds second(s). $time_left seconds left until timeout. "
sleep $wait_interval_in_seconds
time_left= $(( time_left - wait_interval_in_seconds ))
fi
done
if [ $SECONDS -ge $end_time ] ; then
echo " Timeout: The Grid was not started within $max_wait_time_in_seconds seconds. "
exit 1
fi
需要透過
apt-get
安裝jq
,否則腳本將繼續列印Waiting
而沒有完成執行。
注意:如果需要,請將localhost
和4444
替換為您環境中的正確值。另外,該腳本無限期地輪詢,您可能需要調整它並建立逾時。
假設執行測試的常規指令是mvn clean test
。以下是使用上述腳本並執行測試的方法:
$ ./wait-for-grid.sh && mvn clean test
像這樣,腳本將輪詢直到網格準備就緒,然後您的測試將開始。
預設情況下,基礎映像安裝libnss3-tools
並初始化/home/seluser/.pki/nssdb
,因此您可以使用無根新增憑證。如果您需要安裝自訂憑證、CA、中間 CA 或用戶端憑證(例如企業內部 CA),您可以從 selenium 節點映像建立您自己的 docker 映像。基於 Chromium 的瀏覽器使用nssdb
作為憑證儲存。然後,您可以在 Dockerfile 中安裝所有必要的內部證書,如下所示:
映像中打包了一個實用程式腳本,可用於將憑證新增至nssdb
儲存和捆綁 CA。腳本是/opt/bin/add-cert-helper.sh
。
建立一個使用 selenium 節點映像作為基礎的 Dockerfile,並將腳本複製到容器中並執行。例如,Dockerfile
如果您必須建立一組不同的憑證和節點映像。您可以建立一個引導腳本來一次完成此操作。例如,bootstrap.sh
可以使用以下命令測試上面的範例:
make test_custom_ca_cert
# ./tests/customCACert/bootstrap.sh
您可以在這裡找到更多信息
這樣,證書將被安裝,並且節點將像以前一樣自動啟動。
作為替代方案,您可以將憑證檔案新增至現有的 Selenium 映像。這個實際範例假設您有一個已知的映像用作建置映像,並且有辦法將新映像發佈到本機 docker 註冊表。
此範例使用基於 RedHat 的發行版作為建置映像 (Rocky Linux),但它可以是您選擇的任何Linux 映像。請注意,建置指令因發行版而異。您可以查看前面範例中針對 Ubuntu 的說明。
這個範例還假設您的內部 CA 已位於/etc/pki/ca-trust/source/anchors/YOUR_CA.pem中,這是 Rocky Linux 的預設位置。或者,您也可以從主機提供這些檔案並將它們複製到建置映像中。
對於 Chrome 和 Edge 瀏覽器,方法是相同的,只需調整圖片名稱(node-chrome 或 node-edge):
# Get a standard image for creating nssdb file
FROM rockylinux:8.6 as build
RUN yum install -y nss-tools
RUN mkdir -p -m755 /seluser/.pki/nssdb
&& certutil -d sql:/seluser/.pki/nssdb -N --empty-password
&& certutil -d sql:/seluser/.pki/nssdb -A -t "C,," -n YOUR_CA -i /etc/pki/ca-trust/source/anchors/YOUR_CA.pem
&& chown -R 1200:1201 /seluser
# Start from Selenium image and add relevant files from build image
FROM selenium/node-chrome:4.26.0-20241101
USER root
COPY --from=build /seluser/ /home/seluser/
USER seluser
火狐瀏覽器範例:
# Get a standard image for working on
FROM rockylinux:8.6 as build
RUN mkdir -p "/distribution" "/certs" &&
cp /etc/pki/ca-trust/source/anchors/YOUR_CA*.pem /certs/ &&
echo '{ "policies": { "Certificates": { "Install": ["/opt/firefox-latest/YOUR_CA.pem"] }} }' >"/distribution/policies.json"
# Start from Selenium image and add relevant files from build image
FROM selenium/node-firefox:4.26.0-20241101
USER root
COPY --from=build /certs /opt/firefox-latest
COPY --from=build /distribution /opt/firefox-latest/distribution
USER seluser
此專案使用 x11vnc 作為 VNC 伺服器,允許使用者檢查容器內發生的情況。用戶可以透過兩種方式連接到該伺服器:
VNC 伺服器正在偵聽連接埠 5900,您可以使用 VNC 用戶端並連接到它。請隨意將連接埠 5900 對應到您想要的任何空閒外部連接埠。
內部 5900 連接埠保持不變,因為這是為容器內運行的 VNC 伺服器配置的連接埠。如果您想使用--net=host
可以使用SE_VNC_PORT
環境變數覆寫它。
這是獨立影像的範例,相同的概念適用於節點影像。
$ docker run -d -p 4444:4444 -p 5900:5900 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d -p 4445:4444 -p 5901:5900 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
$ docker run -d -p 4446:4444 -p 5902:5900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
然後,您將在 VNC 用戶端中使用:
如果您收到要求輸入密碼的提示,密碼為: secret
。如果您想要變更此設置,可以設定環境變數SE_VNC_PASSWORD
。
如果您想在沒有密碼驗證的情況下執行 VNC,可以設定環境變數SE_VNC_NO_PASSWORD=1
。
如果要在僅查看模式下執行 VNC,可以設定環境變數SE_VNC_VIEW_ONLY=1
。
如果要修改 VNC 伺服器程序的開啟檔案描述符限制,可以設定環境變數SE_VNC_ULIMIT=4096
。
該專案使用 noVNC 來允許使用者使用瀏覽器直觀地檢查容器活動。如果您無法在電腦上安裝 VNC 用戶端,這可能會派上用場。連接埠 7900 用於啟動 noVNC,因此您需要使用瀏覽器連接到該連接埠。
與上一節類似,您可以隨意將連接埠 7900 對應到您想要的任何空閒外部連接埠。如果您想使用--net=host
您也可以使用SE_NO_VNC_PORT
環境變數覆寫它。
這是獨立影像的範例,相同的概念適用於節點影像。
$ docker run -d -p 4444:4444 -p 7900:7900 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d -p 4445:4444 -p 7901:7900 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
$ docker run -d -p 4446:4444 -p 7902:7900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
然後,您將在瀏覽器中使用:
如果您收到要求輸入密碼的提示,密碼為: secret
。
如果您的資源不足,或者只是不需要檢查正在執行的會話,則可能根本不執行 VNC。只需在網格啟動時設定SE_START_VNC=false
環境變數即可。
為了在 Selenium Grid 容器中啟用跟踪,可以執行以下命令:
docker network create grid
docker run -d -p 16686:16686 -p 4317:4317 --net grid --name jaeger jaegertracing/all-in-one:1.54
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
您也可以參考下面的 docker compose yaml 檔案來啟動一個簡單的網格(或)動態網格。
您可以查看 Jaeger UI 並追蹤您的請求。
預設情況下,網格組件中啟用追蹤。如果沒有追蹤導出器端點,它將尋找本機實例,例如localhost/[0:0:0:0:0:0:0:1]:4117
。在容器日誌中,您可以看到以下幾行:
ERROR (ThrottlingLogger.dolog) Failed to export spans.
The request could not be executed. Error message: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4117
java.net.ConnectException: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4317
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:297)
at okhttp3.internal.connection. ExchangeFinder.findConnection (Exchangefinder.kt: 226)
at okhttp3.internal.connection.okhttps.internal.connection.RealConnection.connect(RealConnection.kt:207)
在這種情況下,只需將SE_ENABLE_TRACING=false
設定為所有元件容器即可停用追蹤(每個元件匯出自己的追蹤)。
所有輸出都會發送到 stdout,因此可以透過運行進行檢查:
$ docker logs -f < container-id | container-name >
您可以透過將環境變數傳遞給容器來增加日誌輸出:
SE_OPTS="--log-level FINE"
--shm-size="2g"
為什麼需要--shm-size 2g
?
這是一種已知的解決方法,可以避免瀏覽器在 docker 容器內崩潰,以下是 Chrome 和 Firefox 的已記錄問題。 2GB 的 shm 大小是任意的,但已知效果良好,您的特定用例可能需要不同的值,建議根據您的需求調整此值。
如果您看到以下硒異常:
Message: invalid argument: can't kill an exited process
或者
Message: unknown error: Chrome failed to start: exited abnormally
或者
[DriverServiceSessionFactory.apply] - Error while creating session with the driver service. Stopping driver service: java.util.concurrent.TimeoutException
原因可能是您已將SE_START_XVFB
環境變數設為false
,但忘記在無頭模式下實際執行 Firefox、Chrome 或 Edge。
常見的情況是將磁碟區安裝到瀏覽器容器以檢索下載的檔案。這在 Windows 和 macOS 中運作良好,但在 Linux 中則並非沒有解決方法。有關更多詳細信息,請查看這個有據可查的問題。
例如,在使用 Linux 時,您可能會透過以下方式啟動容器:
docker run -d -p 4444:4444 --shm-size= " 2g "
-v /home/ubuntu/files:/home/seluser/Downloads
selenium/standalone-chrome:4.26.0-20241101
這會將主機/home/ubuntu/files
目錄掛載到容器內的/home/seluser/Downloads
(預設瀏覽器的下載目錄)。出現此問題的原因是該磁碟區將以root
掛載;因此,瀏覽器無法將檔案寫入該目錄,因為它在使用者seluser
下運行。發生這種情況是因為 Docker 在 Linux 中掛載磁碟區的方式,更多詳細資訊請參閱本期。
解決此問題的方法是在主機上建立目錄並在安裝磁碟區之前更改其權限。根據您的使用者權限,您可能需要使用sudo
來執行以下某些命令:
mkdir /home/ubuntu/files
chown 1200:1201 /home/ubuntu/files
執行此操作後,您應該能夠將檔案下載到安裝的目錄中。如果您有更好的解決方法,請向我們發送拉取請求!
類似於掛載磁碟區來檢索下載的檔案。對於視訊文件,您可能需要執行相同的操作
mkdir /tmp/videos
chown 1200:1201 /tmp/videos