用docker搭建selenium grid分布式環(huán)境實(shí)踐之路
最近需要測(cè)試zoom視頻會(huì)議,同時(shí)模擬100個(gè)人加入會(huì)議。經(jīng)過(guò)了解,zoom提供了直接通過(guò)url鏈接加入會(huì)議的方式(只能通過(guò)chrome瀏覽器或者FireFox瀏覽器,因?yàn)橛玫膮f(xié)議是webrtc)。
順著這個(gè)思路考慮可以通過(guò)Selenium自動(dòng)化,同時(shí)啟動(dòng)多個(gè)瀏覽器進(jìn)程,每個(gè)進(jìn)程代表一個(gè)視頻會(huì)議用戶,達(dá)到模擬多方會(huì)議的效果。不過(guò)有以下兩個(gè)難點(diǎn):
- 需要多個(gè)chrome瀏覽器進(jìn)程同時(shí)存活,在電腦上啟動(dòng)一個(gè)chrome瀏覽器進(jìn)程差不多要消耗220M左右。
- 視頻會(huì)議的音頻和視頻源的問(wèn)題。
針對(duì)視頻會(huì)議的音頻和視頻源的問(wèn)題,chrome瀏覽器有比較好的支持,在Selenium腳本中初始化Chrome瀏覽器的參數(shù)中,只需要加入如下配置:
chrome_options.add_argument("--use-fake-ui-for-media-stream") chrome_options.add_argument("--use-fake-device-for-media-stream")
就能在加入視頻會(huì)議之后,使用虛擬的視頻和音頻。不過(guò)有個(gè)問(wèn)題需要考慮,這個(gè)虛擬視頻和真實(shí)的視頻會(huì)議中的視頻質(zhì)量看上去是有差距的,會(huì)不會(huì)對(duì)測(cè)試結(jié)果造成影響,我們這里暫時(shí)不討論這個(gè)話題。
現(xiàn)在唯一比較頭疼的是怎么實(shí)現(xiàn)100個(gè)chrome瀏覽器進(jìn)程,可能你會(huì)覺(jué)得,這不就是資源問(wèn)題嗎?加服務(wù)器不就搞定了?!但是假如有了服務(wù)器資源之后,怎么做任務(wù)調(diào)度呢?好在有Selenium Grid,它是Selenium的三大組件,專門用來(lái)執(zhí)行分布式測(cè)試。
于是基于Selenium Grid設(shè)計(jì)了個(gè)測(cè)試方案:
- 將某臺(tái)服務(wù)器作為Hub,也就是master
- 將剩下的機(jī)器作為node,注冊(cè)到hub機(jī)器。
- 本地采用多進(jìn)程執(zhí)行Selenium自動(dòng)化腳本(我使用python語(yǔ)言實(shí)現(xiàn)的)。
按照上面的設(shè)計(jì)思路,理論上是能夠模擬出100人同時(shí)加入會(huì)議的。接下來(lái)我們就正式開(kāi)始用docker搭建Selenium Grid分布式環(huán)境的探索之路。
selenium jar包直接啟動(dòng)節(jié)點(diǎn)
其實(shí),最開(kāi)始我是直接使用jar包啟動(dòng)節(jié)點(diǎn)的,起幾個(gè)節(jié)點(diǎn)還能接受,但是節(jié)點(diǎn)多了之后會(huì)特別麻煩,比如:想重啟下節(jié)點(diǎn),則需要手動(dòng)全部kill掉,然后再一個(gè)個(gè)啟動(dòng)。
只要是手動(dòng)重復(fù)的工作,就能腳本化。于是我寫(xiě)了兩個(gè)shell腳本,一個(gè)腳本是根據(jù)傳參啟動(dòng)對(duì)應(yīng)數(shù)量的節(jié)點(diǎn);另一個(gè)腳本是將所有的節(jié)點(diǎn)進(jìn)程全部kill掉。主要腳本如下圖所示:
雖然用腳本也能輕松的執(zhí)行,但還是不方便。首先啟動(dòng)節(jié)點(diǎn)后,會(huì)增加好多java進(jìn)程,并且沒(méi)辦法查看單個(gè)節(jié)點(diǎn)的日志,因?yàn)樗泄?jié)點(diǎn)的日志都同時(shí)在控制臺(tái)打印。于是考慮用docker來(lái)管理Selenium grid節(jié)點(diǎn)。
用docker命令直接啟動(dòng)
在github上有現(xiàn)成的鏡像: https://github.com/SeleniumHQ/docker-selenium 。然后說(shuō)明文檔中也列出了所有可用的鏡像名稱,因?yàn)槲抑饕褂胏hrome瀏覽器,所有安裝了: selenium/hub 、 selenium/node-chrome、 selenium/node-chrome-debug 三個(gè)鏡像,其中selenium/node-chrome-debug鏡像會(huì)啟動(dòng)一個(gè)VNC Server,在腳本執(zhí)行過(guò)程中,本地可以連上VNC Server,通過(guò)界面查看服務(wù)器的腳本執(zhí)行情況。 使用命令:
$ docker pull selenium/hub $ docker pull selenium/node-chrome $ docker pull selenium/node-chrome-debug
啟動(dòng)hub的命令如下:
$ docker run -d -p 4444:4444 -e GRID_MAX_SESSION=100 --name hub selenium/hub
啟動(dòng)本地節(jié)點(diǎn)(hub和node在一臺(tái)機(jī)器上)的命令如下:
$ docker run -d -p 5555:5555 -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 --shm-size=2g --link hub:hub --name node1 selenium/node-chrome
啟動(dòng)遠(yuǎn)端節(jié)點(diǎn)(hub和node不在一臺(tái)機(jī)器上)的命令如下:
$ docker run -d -p port:5555 -e HUB_HOST=remote_ip -e HUB_PORT=remote_port -e REMOTE_HOST=http://ip:port -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 --shm-size=2g --name node1 selenium/node-chrome
這里需要注意,網(wǎng)上很多教程提供的啟動(dòng)命令都是hub和node在一臺(tái)機(jī)器上,假如需要hub和node在不同的機(jī)器上,按照網(wǎng)上的教程,雖然啟動(dòng)不會(huì)報(bào)錯(cuò),但是節(jié)點(diǎn)和hub之間的網(wǎng)絡(luò)是不通的。
不過(guò)直接使用docker命令雖然可以單獨(dú)查看單個(gè)節(jié)點(diǎn)的日志,但是卻和使用jar包的方式面對(duì)一樣的問(wèn)題:?jiǎn)?dòng)多個(gè)節(jié)點(diǎn),非常不方便,需要手動(dòng)執(zhí)行多次命令。有沒(méi)有更好的方案呢?當(dāng)然有,可以使用docker-compose對(duì)docker容器進(jìn)行整合。
docker-compose 啟動(dòng)
docker compose是docker的一個(gè)命令行工具,用來(lái)定義和運(yùn)行多個(gè)容器組成的應(yīng)用。相當(dāng)于我們可以將多個(gè)docker命令放到一個(gè)文件里,然后由docker-compose一鍵執(zhí)行。
同樣的,也需要分兩種情況:
Hub和node在一臺(tái)機(jī)器上
可以使用如下的配置文件docker-compose.yml
version: "3" services: selenium-hub: image: selenium/hub container_name: selenium-hub ports: - "4444:4444" environment: - GRID_MAX_SESSION=50 - GRID_TIMEOUT=900 - START_XVFB=false chrome: image: selenium/node-chrome volumes: - /dev/shm:/dev/shm depends_on: - selenium-hub environment: - HUB_HOST=selenium-hub - HUB_PORT=4444 - NODE_MAX_INSTANCES=5 - NODE_MAX_SESSION=5
然后在控制臺(tái)執(zhí)行命令:
$ docker-compose up -d //-d表示在后臺(tái)運(yùn)行
如果想同時(shí)啟動(dòng)多個(gè)節(jié)點(diǎn)該怎么辦呢?非常簡(jiǎn)單:
$ docker-compose up -d --scale chrome=num //num是要啟動(dòng)節(jié)點(diǎn)的數(shù)量
如果想關(guān)閉節(jié)點(diǎn),可以執(zhí)行如下命令:
$ docker-compose down
Hub和node不在一臺(tái)機(jī)器上
可以使用如下配置文件docker-compose.yml
version: "3" services: # selenium-chrome-1 selenium-chrome-node-1: image: selenium/node-chrome volumes: - /dev/shm:/dev/shm ports: - "5556:5555" restart: always stdin_open: true environment: HUB_HOST: hub_ip HUB_PORT: 4444 NODE_MAX_INSTANCES: 5 NODE_MAX_SESSION: 5 REMOTE_HOST: http://節(jié)點(diǎn)ip:5556 GRID_TIMEOUT: 60000 shm_size: "2gb" # selenium-chrome-2 selenium-chrome-node-2: image: selenium/node-chrome volumes: - /dev/shm:/dev/shm ports: - "5555:5555" restart: always stdin_open: true container_name: node1 environment: HUB_HOST: hub_ip HUB_PORT: 4444 NODE_MAX_INSTANCES: 5 NODE_MAX_SESSION: 5 REMOTE_HOST: http://節(jié)點(diǎn)ip:5555 GRID_TIMEOUT: 60000 shm_size: "2gb" # selenium-chrome-3 selenium-chrome-node-3: image: selenium/node-chrome volumes: - /dev/shm:/dev/shm ports: - "5557:5555" restart: always stdin_open: true environment: HUB_HOST: hub_ip HUB_PORT: 4444 NODE_MAX_INSTANCES: 5 NODE_MAX_SESSION: 5 REMOTE_HOST: http://節(jié)點(diǎn)ip:5557 GRID_TIMEOUT: 60000 shm_size: "2gb" # selenium-chrome-4 selenium-chrome-node-4: image: selenium/node-chrome volumes: - /dev/shm:/dev/shm ports: - "5558:5555" restart: always stdin_open: true environment: HUB_HOST: hub_ip HUB_PORT: 4444 NODE_MAX_INSTANCES: 5 NODE_MAX_SESSION: 5 REMOTE_HOST: http://節(jié)點(diǎn)ip:5558 GRID_TIMEOUT: 60000 shm_size: "2gb" # selenium-chrome-5 selenium-chrome-node-5: image: selenium/node-chrome volumes: - /dev/shm:/dev/shm ports: - "5559:5555" restart: always stdin_open: true environment: HUB_HOST: hub_ip HUB_PORT: 4444 NODE_MAX_INSTANCES: 5 NODE_MAX_SESSION: 5 REMOTE_HOST: http://節(jié)點(diǎn)ip:5559 GRID_TIMEOUT: 60000 shm_size: "2gb"
啟動(dòng)節(jié)點(diǎn)的命令是(前提是hub需要提前啟動(dòng)):
$ docker-compose up -d
關(guān)閉節(jié)點(diǎn)的命令是:
$ docker-compose down
遺留問(wèn)題
按照我上面這種方式搭建Selenium Grid環(huán)境,本地節(jié)點(diǎn)可以正常執(zhí)行,但是遠(yuǎn)端的節(jié)點(diǎn)卻經(jīng)常超時(shí),不過(guò)從http://hub_ip:4444/grid/console界面上看到的節(jié)點(diǎn)網(wǎng)絡(luò)全部都是通的。
之前查過(guò)一些資料,貌似需要使用Docker Swarm,它是一個(gè)docker集群管理工具, 將若干臺(tái) Docker 主機(jī)抽象為一個(gè)整體,并且通過(guò)一個(gè)入口統(tǒng)一管理這些 Docker 主機(jī)上的各種 Docker 資源 。不過(guò)目前還沒(méi)研究它,后面如果用Docker Swarm有結(jié)論之后,我再寫(xiě)文章同步給大家。
總結(jié)
用docker搭建selenium grid分布式環(huán)境,非常方便,基本是一行命令就能啟動(dòng)或者關(guān)閉節(jié)點(diǎn)。希望我這篇文章能給大家提供一些思路,幫助大家在平時(shí)的工作中解決一些問(wèn)題。
到此這篇關(guān)于用docker搭建selenium grid分布式環(huán)境實(shí)踐之路的文章就介紹到這了,更多相關(guān)docker搭建selenium grid分布式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pycharm與ssh遠(yuǎn)程訪問(wèn)服務(wù)器docker的詳細(xì)教程
這篇文章主要介紹了pycharm與ssh遠(yuǎn)程訪問(wèn)服務(wù)器docker,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10CentOS7部署19版docker(簡(jiǎn)單,可跟做)
這篇文章主要介紹了CentOS7部署19版docker,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01Docker?Desktop常見(jiàn)的幾種啟動(dòng)失敗問(wèn)題解決方法
使用Docker Desktop 可以很方便的啟用 Kubernetes,下面這篇文章主要給大家介紹了關(guān)于Docker?Desktop常見(jiàn)的幾種啟動(dòng)失敗問(wèn)題解決方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Docker構(gòu)建文件Dockerfile簡(jiǎn)單入門
這篇文章主要介紹了Docker構(gòu)建文件Dockerfile簡(jiǎn)單入門,需要的朋友可以參考下2022-04-04