01、什么是Selenium Grid
Selenium Grid是Selenium套件的一部分,它專門用于并行運行多個測試用例在不同的瀏覽器、操作系統和機器上。
Selenium Grid有兩個版本——老版本Grid 1和新版本Grid 2。我們只對新版本做介紹,因為Selenium團隊已經逐漸遺棄老版本了。
Selenium Grid 主要使用 master-slaves (or hub-nodes) 理念 --一個 master/hub 和多個基于master/hub注冊的子節點 slaves/nodes。當我們在master上基于不同的瀏覽器/系統運行測試用例時,master將會分發給適當的node運行。
什么時候用Selenium Grid
同時在不同的瀏覽器、操作系統和機器上運行測試。最大程度用于兼容性測試
減少運行時間
02、怎樣啟動Selenium Grid
啟動Selenium Grid的三種方式,一種直接用命令行,另一種用JSON配置文件,最后一種docker啟動
1、命令行啟動
將會使用2臺機器,一臺運行hub另一臺運行node,為了方便描述,將運行hub的機器命名為“Machine H”(IP:192.168.1.100),運行node的機器命名為“Machine N”(IP:192.168.1.101)
Step 1
1、配置Java環境
2、已安裝需要運行的瀏覽器
3、下載瀏覽器driver,放到和selenium server相同的路徑下 ,否則在啟動node時要加參數,不然啟動不了瀏覽器(java -Dwebdriver.chrome.driver=“C:\your path\chromedriver.exe” -jar selenium-server-standalone-3.141.59.jar -role node -hubhttp://192.168.1.100:5566/grid/register/,可切換瀏覽器)
4、下載selenium server,將selenium-server-standalone-X.XX.jar分別放在“Machine H”和“Machine N”上(自定義路徑)
Step 2
在機器“Machine H”上打開命令行,到selenium server所在的路徑,運行:java -jar selenium-server-standalone-3.141.59.jar -role hub -port 5566,成功啟動你會看到:
或者直接在機器“Machine H”上的瀏覽器(“Machine N”則需要將IP修改為“Machine H”的)打開:http://localhost:5566/grid/console ,將會看到:
在機器“Machine N”上打開命令行,到selenium server所在的路徑,運行:java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.1.100:5566/grid/register/ -port 5577,成功啟動你會看到:
刷新:http://localhost:5566/grid/console ,將會看到:
刷新:http://localhost:5566/grid/console ,將會看到:
Step 3
運行測試腳本,將會看到在機器“Machine N”上打開了Chrome瀏覽器,并運行了測試用例:
from selenium import webdriverds = {'platform': 'ANY','browserName': "chrome",'version': '','javascriptEnabled': True}dr = webdriver.Remote('http://192.168.1.101:5577/wd/hub', desired_capabilities=ds)dr.get("https://www.baidu.com")print dr.name
2、Json配置文件啟動
Step 1
1、創建hub的Json配置文件
代碼如下:
{"port": 4444,"newSessionWaitTimeout": -1,"servlets" : [],"withoutServlets": [],"custom": {},"capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher","registry": "org.openqa.grid.internal.DefaultGridRegistry","throwOnCapabilityNotPresent": true,"cleanUpCycle": 5000,"role": "hub","debug": false,"browserTimeout": 0,"timeout": 1800}
將上述代碼保存為hub_config.json文件,放在“Machine H”上和selenium server相同的路徑下。
2、創建nodes的 Json配置文件
代碼如下:
{"capabilities":[{"browserName": "firefox","marionette": true,"maxInstances": 5,"seleniumProtocol": "WebDriver"},{"browserName": "chrome","maxInstances": 5,"seleniumProtocol": "WebDriver"},{"browserName": "internet explorer","platform": "WINDOWS","maxInstances": 1,"seleniumProtocol": "WebDriver"},{"browserName": "safari","technologyPreview": false,"platform": "MAC","maxInstances": 1,"seleniumProtocol": "WebDriver"}],"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy","maxSession": 5,"port": -1,"register": true,"registerCycle": 5000,"hub": "http://192.168.1.100:4444","nodeStatusCheckTimeout": 5000,"nodePolling": 5000,"role": "node","unregisterIfStillDownAfter": 60000,"downPollingLimit": 2,"debug": false,"servlets" : [],"withoutServlets": [],"custom": {}}
保存為文件(注意將hub對應的值改為機器“Machine H”的IP),放在“Machine N”上和selenium server相同的路徑下。(當多個node時需將該文件放在多個node機器上或者同一個機器上啟動多個node)
Step 2
hub機器上命令行運行:java -jar selenium-server-standalone-3.141.59.jar -role hub -hubConfig hub_config.json
node機器上命令行運行:java -jar selenium-server-standalone-3.141.59.jar -role node -nodeConfig node_config.json
運行之前的驗證方法和腳本查看是否正確
(1、2)方式啟動的挑戰(不易啟動和維護):
每個node需要下載和配置依賴
java 進程占內存
出現問題時需手動啟動
不易維護
擴展性差
3、docker啟動
docker上已經有selenium官方的Selenium Grid鏡像,只有你已經安裝了docker,即可使用。
啟動hub:
docker run -d -p 4444:4444 --name selenium-hub selenium/hub
啟動node(Chrome&&Firefox):
docker run -d --link selenium-hub:hub selenium/node-firefox
運行命令將會下載內置鏡像文件(包括java、Chrome、Firefox、selenium-server-standalone-XXX.jar 等運行selenium所需的環境);此時你可以訪問:http://localhost:4444/grid/console
如果需要多個Chrome node則繼續運行這個命令:docker run -d --link selenium-hub:hub selenium/node-chrome,刷新則看到多了一個Chrome實例。
通過運行命令:docker ps,顯示正在運行的容器
關閉docker-grid的命令:docker stop $(docker ps -a -q), docker rm $(docker ps -a -q)
docker已經簡化了selenium Grid的搭建流程,但是還是有很多的手動工作。需要一個一個的啟動/關閉hub/nodes.
1、docker 組件啟動Selenium Grid
selenium Grid通常需要啟動一個hub,多個nodes像Chrome、Firefox等。我們可以把他們定義到一個文件中叫做docker-compose.yml,通過一個命令來整體啟動,docker提供了一個這樣的工具 –Docker-Compose。
安裝docker-compose,一旦安裝成功,則創建一個新的文件夾,創建文件 docker-compose.yml, docker-compose.yml內容:
version: "3"services:selenium-hub:image: selenium/hubcontainer_name: selenium-hubports:- "4444:4444"chrome:image: selenium/node-chromedepends_on:- selenium-hubenvironment:- HUB_PORT_4444_TCP_ADDR=selenium-hub- HUB_PORT_4444_TCP_PORT=4444firefox:image: selenium/node-firefoxdepends_on:- selenium-hubenvironment:- HUB_PORT_4444_TCP_ADDR=selenium-hub- HUB_PORT_4444_TCP_PORT=4444
2、docker-compose命令:
運行命令啟動(到docker-compose.yml路徑下):docker-compose up -d
查看啟動是否成功:docker-compose ps
創建更多實例:docker-compose scale chrome=5
關閉命令:docker-compose down
瀏覽器打開http://localhost:4444/grid/console將會看到:運行腳本的話直接運行就好(IP:http://localhost:4444/wd/hub) ,和上邊兩種的方法不太一樣;不會有瀏覽器打開(容器內部運行),但是已經運行成功:
import unittestfrom selenium import webdriverclass MyTestCase(unittest.TestCase):def setUp(self):ds = {'platform': 'ANY','browserName': "chrome",'version': '','javascriptEnabled': True}self.dr = webdriver.Remote('http://localhost:4444/wd/hub', desired_capabilities=ds)def test_something(self):self.dr.get("https://www.baidu.com")self.assertEqual(self.dr.name, "chrome")def test_search_button(self):self.dr.get("https://www.baidu.com")self.assertTrue(self.dr.find_element_by_id("su").is_displayed())def tearDown(self):self.dr.quit()if __name__ == '__main__':unittest.main()
最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:【文末領取】
? ? ?【下面是我整理的2023年最全的軟件測試工程師學習知識架構體系圖+全套資料】
一、Python編程入門到精通

二、接口自動化項目實戰?
三、Web自動化項目實戰

四、App自動化項目實戰?
五、一線大廠簡歷

六、測試開發DevOps體系?
七、常用自動化測試工具

八、JMeter性能測試?
九、總結(文末尾部小驚喜)
生命不息,奮斗不止。每一份努力都不會被辜負,只要堅持不懈,終究會有回報。珍惜時間,追求夢想。不忘初心,砥礪前行。你的未來,由你掌握!
生命短暫,時間寶貴,我們無法預知未來會發生什么,但我們可以掌握當下。珍惜每一天,努力奮斗,讓自己變得更加強大和優秀。堅定信念,執著追求,成功終將屬于你!
只有不斷地挑戰自己,才能不斷地超越自己。堅持追求夢想,勇敢前行,你就會發現奮斗的過程是如此美好而值得。相信自己,你一定可以做到!