• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 用docker搭建selenium grid分布式環境實踐之路

    發表于:2020-03-26來源:cnblogs作者:軟件測試布道師點擊數: 標簽:
    最近需要測試zoom視頻會議,同時模擬100個人加入會議。經過了解,zoom提供了直接通過url鏈接加入會議的方式(只能通過chrome瀏覽器或者FireFox瀏覽器,因為用的協議是webrtc)。順著這

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

    順著這個思路考慮可以通過Selenium自動化,同時啟動多個瀏覽器進程,每個進程代表一個視頻會議用戶,達到模擬多方會議的效果。不過有以下兩個難點:

    • 需要多個chrome瀏覽器進程同時存活,在電腦上啟動一個chrome瀏覽器進程差不多要消耗220M左右。
    • 視頻會議的音頻和視頻源的問題。

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

    chrome_options.add_argument("--use-fake-ui-for-media-stream")
    chrome_options.add_argument("--use-fake-device-for-media-stream")
    

    就能在加入視頻會議之后,使用虛擬的視頻和音頻。不過有個問題需要考慮,這個虛擬視頻和真實的視頻會議中的視頻質量看上去是有差距的,會不會對測試結果造成影響,我們這里暫時不討論這個話題。

    現在唯一比較頭疼的是怎么實現100個chrome瀏覽器進程,可能你會覺得,這不就是資源問題嗎?加服務器不就搞定了?!但是假如有了服務器資源之后,怎么做任務調度呢?好在有Selenium Grid,它是Selenium的三大組件,專門用來執行分布式測試。

    于是基于Selenium Grid設計了個測試方案:

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

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

    selenium jar包直接啟動節點

    其實,最開始我是直接使用jar包啟動節點的,起幾個節點還能接受,但是節點多了之后會特別麻煩,比如:想重啟下節點,則需要手動全部kill掉,然后再一個個啟動。

    只要是手動重復的工作,就能腳本化。于是我寫了兩個shell腳本,一個腳本是根據傳參啟動對應數量的節點;另一個腳本是將所有的節點進程全部kill掉。主要腳本如下圖所示:

    微信截圖_20200322195257.png

    雖然用腳本也能輕松的執行,但還是不方便。首先啟動節點后,會增加好多java進程,并且沒辦法查看單個節點的日志,因為所有節點的日志都同時在控制臺打印。于是考慮用docker來管理Selenium grid節點。

    用docker命令直接啟動

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

    $ docker pull selenium/hub
    $ docker pull selenium/node-chrome
    $ docker pull selenium/node-chrome-debug
    

    啟動hub的命令如下:

    $ docker run -d -p 4444:4444 -e GRID_MAX_SESSION=100 --name hub selenium/hub
    

    啟動本地節點(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
    

    啟動遠端節點(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
    

    這里需要注意,網上很多教程提供的啟動命令都是hub和node在一臺機器上,假如需要hub和node在不同的機器上,按照網上的教程,雖然啟動不會報錯,但是節點和hub之間的網絡是不通的。

    不過直接使用docker命令雖然可以單獨查看單個節點的日志,但是卻和使用jar包的方式面對一樣的問題:啟動多個節點,非常不方便,需要手動執行多次命令。有沒有更好的方案呢?當然有,可以使用docker-compose對docker容器進行整合。

    docker-compose 啟動

    docker compose是docker的一個命令行工具,用來定義和運行多個容器組成的應用。相當于我們可以將多個docker命令放到一個文件里,然后由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表示在后臺運行
    

    如果想同時啟動多個節點該怎么辦呢?非常簡單:

    $ docker-compose up -d --scale chrome=num   //num是要啟動節點的數量
    

    如果想關閉節點,可以執行如下命令:

    $ 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://節點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://節點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://節點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://節點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://節點ip:5559
          GRID_TIMEOUT: 60000
        shm_size: "2gb"
    

    啟動節點的命令是(前提是hub需要提前啟動):

    $ docker-compose up -d
    

    關閉節點的命令是:

    $ docker-compose down
    

    遺留問題

    按照我上面這種方式搭建Selenium Grid環境,本地節點可以正常執行,但是遠端的節點卻經常超時,不過從http://hub_ip:4444/grid/console界面上看到的節點網絡全部都是通的。

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

    總結

    用docker搭建selenium grid分布式環境,非常方便,基本是一行命令就能啟動或者關閉節點。希望我這篇文章能給大家提供一些思路,幫助大家在平時的工作中解決一些問題。

    還是那句話,任何技術,只要能幫你解決實際的問題,就是好的技術!

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

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>