<ruby id="h6500"><table id="h6500"></table></ruby>
    1. <ruby id="h6500"><video id="h6500"></video></ruby>
          1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>

            用docker搭建selenium grid分布式環(huán)境實(shí)踐之路

            發(fā)表于:2020-03-26來(lái)源:cnblogs作者:軟件測試布道師點(diǎn)擊數: 標簽:
            最近需要測試zoom視頻會(huì )議,同時(shí)模擬100個(gè)人加入會(huì )議。經(jīng)過(guò)了解,zoom提供了直接通過(guò)url鏈接加入會(huì )議的方式(只能通過(guò)chrome瀏覽器或者FireFox瀏覽器,因為用的協(xié)議是webrtc)。順著(zhù)這

            最近需要測試zoom視頻會(huì )議,同時(shí)模擬100個(gè)人加入會(huì )議。經(jīng)過(guò)了解,zoom提供了直接通過(guò)url鏈接加入會(huì )議的方式(只能通過(guò)chrome瀏覽器或者FireFox瀏覽器,因為用的協(xié)議是webrtc)。

            順著(zhù)這個(gè)思路考慮可以通過(guò)Selenium自動(dòng)化,同時(shí)啟動(dòng)多個(gè)瀏覽器進(jìn)程,每個(gè)進(jìn)程代表一個(gè)視頻會(huì )議用戶(hù),達到模擬多方會(huì )議的效果。不過(guò)有以下兩個(gè)難點(diǎn):

            • 需要多個(gè)chrome瀏覽器進(jìn)程同時(shí)存活,在電腦上啟動(dòng)一個(gè)chrome瀏覽器進(jìn)程差不多要消耗220M左右。
            • 視頻會(huì )議的音頻和視頻源的問(wèn)題。

            針對視頻會(huì )議的音頻和視頻源的問(wèn)題,chrome瀏覽器有比較好的支持,在Selenium腳本中初始化Chrome瀏覽器的參數中,只需要加入如下配置:

            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ì )對測試結果造成影響,我們這里暫時(shí)不討論這個(gè)話(huà)題。

            現在唯一比較頭疼的是怎么實(shí)現100個(gè)chrome瀏覽器進(jìn)程,可能你會(huì )覺(jué)得,這不就是資源問(wèn)題嗎?加服務(wù)器不就搞定了?!但是假如有了服務(wù)器資源之后,怎么做任務(wù)調度呢?好在有Selenium Grid,它是Selenium的三大組件,專(zhuān)門(mén)用來(lái)執行分布式測試。

            于是基于Selenium Grid設計了個(gè)測試方案:

            • 將某臺服務(wù)器作為Hub,也就是master
            • 將剩下的機器作為node,注冊到hub機器。
            • 本地采用多進(jìn)程執行Selenium自動(dòng)化腳本(我使用python語(yǔ)言實(shí)現的)。

            按照上面的設計思路,理論上是能夠模擬出100人同時(shí)加入會(huì )議的。接下來(lái)我們就正式開(kāi)始用docker搭建Selenium Grid分布式環(huán)境的探索之路。

            selenium jar包直接啟動(dòng)節點(diǎn)

            其實(shí),最開(kāi)始我是直接使用jar包啟動(dòng)節點(diǎn)的,起幾個(gè)節點(diǎn)還能接受,但是節點(diǎn)多了之后會(huì )特別麻煩,比如:想重啟下節點(diǎn),則需要手動(dòng)全部kill掉,然后再一個(gè)個(gè)啟動(dòng)。

            只要是手動(dòng)重復的工作,就能腳本化。于是我寫(xiě)了兩個(gè)shell腳本,一個(gè)腳本是根據傳參啟動(dòng)對應數量的節點(diǎn);另一個(gè)腳本是將所有的節點(diǎn)進(jìn)程全部kill掉。主要腳本如下圖所示:

            微信截圖_20200322195257.png

            雖然用腳本也能輕松的執行,但還是不方便。首先啟動(dòng)節點(diǎn)后,會(huì )增加好多java進(jìn)程,并且沒(méi)辦法查看單個(gè)節點(diǎn)的日志,因為所有節點(diǎn)的日志都同時(shí)在控制臺打印。于是考慮用docker來(lái)管理Selenium grid節點(diǎn)。

            用docker命令直接啟動(dòng)

            在github上有現成的鏡像: https://github.com/SeleniumHQ/docker-selenium 。然后說(shuō)明文檔中也列出了所有可用的鏡像名稱(chēng),因為我主要使用chrome瀏覽器,所有安裝了: selenium/hub 、 selenium/node-chrome、 selenium/node-chrome-debug 三個(gè)鏡像,其中selenium/node-chrome-debug鏡像會(huì )啟動(dòng)一個(gè)VNC Server,在腳本執行過(guò)程中,本地可以連上VNC Server,通過(guò)界面查看服務(wù)器的腳本執行情況。 使用命令:

            $ 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)本地節點(diǎn)(hub和node在一臺機器上)的命令如下:

            $ 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)遠端節點(diǎn)(hub和node不在一臺機器上)的命令如下:

            $ 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在一臺機器上,假如需要hub和node在不同的機器上,按照網(wǎng)上的教程,雖然啟動(dòng)不會(huì )報錯,但是節點(diǎn)和hub之間的網(wǎng)絡(luò )是不通的。

            不過(guò)直接使用docker命令雖然可以單獨查看單個(gè)節點(diǎn)的日志,但是卻和使用jar包的方式面對一樣的問(wèn)題:?jiǎn)?dòng)多個(gè)節點(diǎn),非常不方便,需要手動(dòng)執行多次命令。有沒(méi)有更好的方案呢?當然有,可以使用docker-compose對docker容器進(jìn)行整合。

            docker-compose 啟動(dòng)

            docker compose是docker的一個(gè)命令行工具,用來(lái)定義和運行多個(gè)容器組成的應用。相當于我們可以將多個(gè)docker命令放到一個(gè)文件里,然后由docker-compose一鍵執行。

            同樣的,也需要分兩種情況:

            Hub和node在一臺機器上

            可以使用如下的配置文件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
            

            然后在控制臺執行命令:

            $ docker-compose up -d  //-d表示在后臺運行
            

            如果想同時(shí)啟動(dòng)多個(gè)節點(diǎn)該怎么辦呢?非常簡(jiǎn)單:

            $ docker-compose up -d --scale chrome=num   //num是要啟動(dòng)節點(diǎn)的數量
            

            如果想關(guān)閉節點(diǎn),可以執行如下命令:

            $ docker-compose down
            

            Hub和node不在一臺機器上

            可以使用如下配置文件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://節點(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://節點(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://節點(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://節點(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://節點(diǎn)ip:5559
                  GRID_TIMEOUT: 60000
                shm_size: "2gb"
            

            啟動(dòng)節點(diǎn)的命令是(前提是hub需要提前啟動(dòng)):

            $ docker-compose up -d
            

            關(guān)閉節點(diǎn)的命令是:

            $ docker-compose down
            

            遺留問(wèn)題

            按照我上面這種方式搭建Selenium Grid環(huán)境,本地節點(diǎn)可以正常執行,但是遠端的節點(diǎn)卻經(jīng)常超時(shí),不過(guò)從http://hub_ip:4444/grid/console界面上看到的節點(diǎn)網(wǎng)絡(luò )全部都是通的。

            之前查過(guò)一些資料,貌似需要使用Docker Swarm,它是一個(gè)docker集群管理工具, 將若干臺 Docker 主機抽象為一個(gè)整體,并且通過(guò)一個(gè)入口統一管理這些 Docker 主機上的各種 Docker 資源 。不過(guò)目前還沒(méi)研究它,后面如果用Docker Swarm有結論之后,我再寫(xiě)文章同步給大家。

            總結

            用docker搭建selenium grid分布式環(huán)境,非常方便,基本是一行命令就能啟動(dòng)或者關(guān)閉節點(diǎn)。希望我這篇文章能給大家提供一些思路,幫助大家在平時(shí)的工作中解決一些問(wèn)題。

            還是那句話(huà),任何技術(shù),只要能幫你解決實(shí)際的問(wèn)題,就是好的技術(shù)!

            原文轉自:https://www.cnblogs.com/zhouliweiblog/p/12572047.html

            老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月
              <ruby id="h6500"><table id="h6500"></table></ruby>
              1. <ruby id="h6500"><video id="h6500"></video></ruby>
                    1. <progress id="h6500"><u id="h6500"><form id="h6500"></form></u></progress>