Docker image for Selenium grid server 簡易介紹

前言: 

最近刷題刷的我豪崩潰, 所以沒有前言 

正文: 

要做e2e測試要找特定版本的瀏覽器們 
或是 
需要跑多個爬蟲任務 
這個 docker image 可能可以滿足你的需求 
先附上github 連結

repositories的結構大致如下: 
selenium/<execute mode>-<browser name>:<channel or browser version> 
更詳細的tag可以參考這裡
以下將一一介紹

execute mode

如果你沒有要幹大事的話  
較常用的execute mode為兩種 分別為: 
  1. standalone : 如果你只是要在本地跑個dev channel 的 remote web driver, 用這最省事, 直接run就可以了
  2. hub & node : 如果你的環境稍複雜一些(跑在不同機器/VM), 這個部屬方式比較適合
其實還有一個fully distributed modes, 把 selenium grid server 所有元件(Router, Queue, Distributor, EventBus, SessionMap and Nodes)拆分開來, 適合更複雜的情況

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
或者 你可以用docker compose
建立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
實際上根據使用情境不同還有更多的部屬方式 我就不冗談了(不然就不叫簡介: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 感謝各位

留言

這個網誌中的熱門文章

[android]QR code掃描