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()}:')