Docker image for Selenium grid server 簡易介紹
前言:
最近刷題刷的我豪崩潰, 所以沒有前言
正文:
要做e2e測試要找特定版本的瀏覽器們
或是
需要跑多個爬蟲任務
先附上github 連結
repositories的結構大致如下:
selenium/<execute mode>-<browser name>:<channel or browser version>
更詳細的tag可以參考這裡
以下將一一介紹
execute mode
standalone : 如果你只是要在本地跑個dev channel 的 remote web driver, 用這最省事, 直接run就可以了 - hub & node : 如果你的環境稍複雜一些(跑在不同機器/VM), 這個部屬方式比較適合
browser name
就是字面上的意思, 值可以是各主流瀏覽器的名稱, 像是firefox, chrome, edge, opera
channel or browser version
可以指定特定或像是dev, beta 等測試的瀏覽器版本, 不過實際還是要看該維護團隊發布的最新版本資訊為主
使用範例
- 使用standalone 最新版本的 chrome
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:latest
port 4444 為 selenium hub 接收 client訊息所使用
port 7900 為 selenium node 內建提供vnc server使用(7900 for novnc & 5900 for other vnc client) , 可以從自帶的vnc client 連線來debug, 網址為http://<container_ip>:7900, 若有提示需要密碼, 預設為 secret
*註: 文件有特別說道
When executing docker run for an image that contains a browser please use the flag --shm-size=2g to use the host's shared memory.
所以如果不是用headless 記得加上 --shm-size-2g 使用 host shared memory 確保正確執行
- 使用standalone beta版本的 firefox
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:beta
- hub & node 跑 最新版的 firefox & chrome & edge
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:latest
$ 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:latest
$ 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:latest
$ 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:latest
在同一個機器跑可先建立docker network
port 4444 跟standalone mode一樣, 為selenium hub接收訊息用
port 4442 為 event bus public 用途, 若要改成其他port 記得 各個selenium node 的環境變數 SE_EVENT_BUS_PUBLISH_PORT也須更改
port 4443 為 event bus subscribe 用途, 同上 要更改需一同更改 SE_EVENT_BUS_SUBSCRIBE_PORT
各個selenium node的SE_EVENT_BUS_HOST 須設定為 selenium hub的ip or name
port 4444 跟standalone mode一樣, 為selenium hub接收訊息用
port 4442 為 event bus public 用途, 若要改成其他port 記得 各個selenium node 的環境變數 SE_EVENT_BUS_PUBLISH_PORT也須更改
port 4443 為 event bus subscribe 用途, 同上 要更改需一同更改 SE_EVENT_BUS_SUBSCRIBE_PORT
各個selenium node的SE_EVENT_BUS_HOST 須設定為 selenium hub的ip or name
或者 你可以用docker compose
建立docker-compose.yml檔案 並輸入:
建立docker-compose.yml檔案 並輸入:
version: '3.8'
services:
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- "4442:4442"
- "4443:4443"
- "4444:4444"
chrome:
image: selenium/node-chrome:latest
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:latest
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:latest
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
接著在該檔案同目錄下輸入 docker-compose up 即可達到跟上面一樣的效果
若node & hub 各在不同的 machine/VM上
則須在設定node時 指定SE_NODE_HOST為自己的IP
則須在設定node時 指定SE_NODE_HOST為自己的IP
實際上根據使用情境不同還有更多的部屬方式 我就不冗談了(不然就不叫簡介:P) 請自行翻閱文件
如何連到remote driver(以python為例)
from selenium import webdriver
url = "http://localhost:4444"
driver = webdriver.Remote(command_executor=url)
基本上就把 url 指向 selenium hub的ip, port 為 4444 就ok了
以上為個人淺見 若有錯誤或疑問 還請各位留言指教
若有幫助到你 可以點擊廣告 支援筆者的咖啡錢OUOb 感謝各位
若有幫助到你 可以點擊廣告 支援筆者的咖啡錢OUOb 感謝各位
留言
張貼留言