1. 程式人生 > 實用技巧 >Selenium系列教程 Docker + Selenium Grid 構建分散式web測試環境

Selenium系列教程 Docker + Selenium Grid 構建分散式web測試環境

docker 使用請參考 docker 教程

一、Selenium 相關映象

  • selenium/hub
  • selenium/node-chrome、selenium/node-chrome-debug
  • selenium/node-firefox、selenium/node-firefox-debug

二、環境搭建

2.1. 啟動 selenium 相關容器

# 執行主節點 hub
docker run -d -p 4444:4444 --name=hub selenium/hub 

# 執行 node 節點 chrome,註冊到 hub 節點上
docker run -d -p 5901:5900 --name=chrome --link=hub selenium/node-chrome 
docker run 
-d -p 5902:5900 --name=firefox --link=hub selenium/node-firefox # selenium/node-chrome 和 selenium/node-chrome-debug 的區別在於 debug 容器帶有 VNC 服務端,可方便觀看執行步驟 docker run -d -p 5901:5900 --name=chrome --link=hub selenium/node-chrome-debug docker run -d -p 5902:5900 --name=firefox --link=hub selenium/node-firefox-debug

啟動後使用 docker ps 檢視執行中的容器

node 節點註冊成功後,可以在 hub-console 檢視節點註冊情況,地址為 Docker 主機 IP + Hub 主節點對映的埠號組成,如:http://localhost:4444/grid/console

2.2 執行測試

啟動容器後,編寫一條簡單的測試用例在,可以看到使用 firefox 瀏覽器驅動的測試將會自動分配到 node-firefox-debug 節點上執行

from selenium import webdriver
from selenium.webdriver import DesiredCapabilities

def test_demo():
    driver 
= webdriver.Remote('http://localhost:4444/wd/hub', desired_capabilities=DesiredCapabilities.FIREFOX) driver.get("https://www.baidu.com") driver.find_element_by_id("kw").send_keys("test") time.sleep(2) driver.find_element_by_id("su").click() time.sleep(2) driver.quit()

2.3 使用 VNC 檢視執行過程

下載並安裝 VNC Viewer,連線 node-firefox-debug 例項來檢視實際執行效果,方便除錯,連線成功後直接執行測試即可看到實際執行效果。

注:VNC Viewer 預設登入密碼為 secret

下載地址:https://www.realvnc.com/en/connect/download/viewer/

三、使用 Docker Compose 快速建立 web 測試環境

使用 docker run 啟動容器相對來說也比較麻煩,我們可以使用 compose 來做進一步的優化,快速建立 web 測試環境。

Compose 是用於定義和執行多容器 Docker 應用程式的工具。通過 Compose,可以使用 YML 檔案來配置應用程式需要的所有服務。然後使用一個命令,就可以從 YML 檔案配置中建立並啟動所有服務。

3.1 編寫 docker-compose.yml 檔案

示例:

hub:
  image: selenium/hub
  ports:
    - 4444:4444
firefox:
  image: selenium/node-firefox-debug
  ports:
    - 5901:5900
  links:
    - hub
chrome:
  image: selenium/node-chrome-debug
  ports:
    - 5902:5900
  links:
    - hub

3.2 啟動並執行整個應用程式

執行 docker-compose <docker-compose.yml> up 命令來,也可以使用 docker-compose <docker-compose.yml> up -d 後臺啟動;

如果是在 docker-compose.yml 檔案目錄下執行命令則無需指定檔案

3.3 執行測試指令碼

from selenium import webdriver
from selenium.webdriver import DesiredCapabilities

driver = webdriver.Remote('http://localhost:4444/wd/hub', desired_capabilities=DesiredCapabilities.FIREFOX)
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("測試")
time.sleep(2)
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()

四、Selenium 搭配 python 多執行緒執行分散式測試

配合 docker 啟動的容器執行以下測試程式碼,可以看到將會同時在 firefox、chrome 執行測試

示例程式碼:

import time
from selenium.webdriver import DesiredCapabilities
from threading import Thread
from selenium import webdriver
from time import ctime

# 定義分散式執行環境
caps = [{"host":"http://localhost:4444/wd/hub", "browser": DesiredCapabilities.FIREFOX},
        {"host":"http://localhost:4444/wd/hub", "browser": DesiredCapabilities.CHROME}]

def test_baidu(host, browser):
    driver = webdriver.Remote(command_executor=host, desired_capabilities=browser)
    driver.get('http://www.baidu.com')
    driver.find_element_by_id('kw').send_keys("測試")
    driver.find_element_by_id('su').click()
    time.sleep(2)
    driver.quit()

if __name__ == '__main__':
    print(f'start: {ctime()}:')

    threads = []

    # 建立執行緒
    for cap in caps:
        t = Thread(target=test_baidu, args=(cap.get("host"), cap.get("browser")))
        threads.append(t)

    # 啟動執行緒
    for t in threads:
        t.start()

    for t in threads:
        t.join()

    print(f'end: {ctime()}:')