測(cè)開必備:Selenium Grid分布式并發(fā)執(zhí)行自動(dòng)化測(cè)試!

01
什么是Selenium Grid
Selenium Grid?是?Selenium套件的一部分,它專門用于并行運(yùn)行多個(gè)測(cè)試用例在不同的瀏覽器、操作系統(tǒng)和機(jī)器上
Selenium Grid有兩個(gè)版本——老版本Grid 1和新版本Grid 2。我們只對(duì)新版本做介紹,因?yàn)镾elenium團(tuán)隊(duì)已經(jīng)逐漸遺棄老版本了
Selenium Grid主要使用 master-slaves (or hub-nodes) 理念 --一個(gè) master/hub 和多個(gè) 基于master/hub注冊(cè)的子節(jié)點(diǎn) slaves/nodes。當(dāng)我們?cè)趍aster上基于不同的瀏覽器/系統(tǒng)運(yùn)行測(cè)試用例時(shí),master將會(huì)分發(fā)給適當(dāng)?shù)膎ode運(yùn)行

02
使用時(shí)間及如何啟動(dòng)
什么時(shí)候使用Selenium Grid
同時(shí)在不同的瀏覽器、操作系統(tǒng)和機(jī)器上運(yùn)行測(cè)試。最大程度用于兼容性測(cè)試
減少運(yùn)行時(shí)間
怎樣啟動(dòng)Selenium Grid?
啟動(dòng)Selenium Grid的三種方式,一種直接用命令行,另一種用JSON配置文件,最后一種docker啟動(dòng)。
01
命令行啟動(dòng)
將會(huì)使用2臺(tái)機(jī)器,一臺(tái)運(yùn)行hub另一臺(tái)運(yùn)行node,為了方便描述,將運(yùn)行hub的機(jī)器命名為“Machine H”(IP:192.168.1.100),運(yùn)行node的機(jī)器命名為“Machine N”(IP:192.168.1.101)
第一步:
配置Java環(huán)境
已安裝需要運(yùn)行的瀏覽器
下載瀏覽器driver,放到和selenium server相同的路徑下(查看) ,否則在啟動(dòng)node時(shí)要加參數(shù),不然啟動(dòng)不了瀏覽器(java -Dwebdriver.chrome.driver="C:\your path\chromedriver.exe" -jar selenium-server-standalone-3.141.59.jar -role node -hub?http://192.168.1.100:5566/grid/register/,可切換瀏覽器)
driver? | link | comments |
Firefox | 下載?? ? | 安裝的瀏覽器要和下載的driver版本一致 |
Chrome?? ? | 下載?? ? | 安裝的瀏覽器要和下載的driver版本一致 |
IE?? ? | 下載?? ? | 安裝的瀏覽器要和下載的driver版本一致 |
Edge?? ? | 下載?? ? | 安裝的瀏覽器要和下載的driver版本一致 |
下載selenium server,將selenium-server-standalone-X.XX.jar分別放在“Machine H”和“Machine N”上(自定義路徑)

第二步:
在機(jī)器“Machine H”上打開命令行,到selenium server所在的路徑,運(yùn)行:java -jar selenium-server-standalone-3.141.59.jar -role hub -port 5566,成功啟動(dòng)你會(huì)看到:

或者直接在機(jī)器“Machine H”上的瀏覽器(“Machine N”則需要將IP修改為“Machine H”的)打開:http://localhost:5566/grid/console ,將會(huì)看到:

在機(jī)器“Machine N”上打開命令行,到selenium server所在的路徑,運(yùn)行:java -jar selenium-server-standalone-3.141.59.jar -role node -hub http://192.168.1.100:5566/grid/register/ -port 5577,成功啟動(dòng)你會(huì)看到:

刷新:http://localhost:5566/grid/console ,將會(huì)看到:

第三步:
運(yùn)行測(cè)試腳本,將會(huì)看到在機(jī)器“Machine N”上打開了Chrome瀏覽器,并運(yùn)行了測(cè)試用例:

from selenium import webdriver
ds = {'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
第一步:
創(chuàng)建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相同的路徑下。
創(chuàng)建nodes的 Json配置文件(如果selenium版本是3.0或更高則查看,否則查看)
代碼如下:
{
????? "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": {}
??? }
保存為node_config.json文件(注意將hub對(duì)應(yīng)的值改為機(jī)器“Machine H”的IP),放在“Machine N”上和selenium server相同的路徑下。(當(dāng)多個(gè)node時(shí)需將該文件放在多個(gè)node機(jī)器上或者同一個(gè)機(jī)器上啟動(dòng)多個(gè)node)
第二步:
hub機(jī)器上命令行運(yùn)行:java -jar selenium-server-standalone-3.141.59.jar -role hub -hubConfig hub_config.json
node機(jī)器上命令行運(yùn)行:java -jar selenium-server-standalone-3.141.59.jar -role node -nodeConfig node_config.json
運(yùn)行之前的驗(yàn)證方法和腳本查看是否正確
(1、2)方式啟動(dòng)的挑戰(zhàn)? 不易啟動(dòng)和維護(hù):
每個(gè)node需要下載和配置依賴
java 進(jìn)程占內(nèi)存
出現(xiàn)問題時(shí)需手動(dòng)啟動(dòng)
不易維護(hù)
擴(kuò)展性差
1、docker啟動(dòng)Selenium Grid
docker上已經(jīng)有selenium官方的Selenium Grid鏡像,只有你已經(jīng)安裝了docker,即可使用。
啟動(dòng)hub:
docker run -d -p 4444:4444 --name selenium-hub selenium/hub
啟動(dòng)node(Chrome&&Firefox):
docker run -d --link selenium-hub:hub selenium/node-chrome
docker run -d --link selenium-hub:hub selenium/node-firefo
運(yùn)行命令將會(huì)下載內(nèi)置鏡像文件(包括java、Chrome、Firefox、selenium-server-standalone-XXX.jar 等運(yùn)行selenium所需的環(huán)境);此時(shí)你可以訪問:http://localhost:4444/grid/console

如果需要多個(gè)Chrome node則繼續(xù)運(yùn)行這個(gè)命令:docker run -d --link selenium-hub:hub selenium/node-chrome,刷新則看到多了一個(gè)Chrome實(shí)例。通過運(yùn)行命令:docker ps,顯示正在運(yùn)行的容器

關(guān)閉docker-grid的命令:docker stop $(docker ps -a -q), docker rm $(docker ps -a -q)
docker已經(jīng)簡(jiǎn)化了selenium Grid的搭建流程,但是還是有很多的手動(dòng)工作。需要一個(gè)一個(gè)的啟動(dòng)/關(guān)閉hub/nodes.
2、docker 組件啟動(dòng)Selenium Grid
selenium Grid通常需要啟動(dòng)一個(gè)hub,多個(gè)nodes像Chrome、Firefox等。我們可以把他們定義到一個(gè)文件中叫做docker-compose.yml,通過一個(gè)命令來整體啟動(dòng),docker提供了一個(gè)這樣的工具 –Docker-Compose。
安裝docker-compose查看,一旦安裝成功,則創(chuàng)建一個(gè)新的文件夾,創(chuàng)建文件?docker-compose.yml, docker-compose.yml內(nèi)容:
version: "3"
services:
? selenium-hub:
??? image: selenium/hub
??? container_name: selenium-hub
??? ports:
????? - "4444:4444"
? chrome:
??? image: selenium/node-chrome
??? depends_on:
????? - selenium-hub
??? environment:
????? - HUB_PORT_4444_TCP_ADDR=selenium-hub
????? - HUB_PORT_4444_TCP_PORT=4444
? firefox:
??? image: selenium/node-firefox
??? depends_on:
????? - selenium-hub
??? environment:
????? - HUB_PORT_4444_TCP_ADDR=selenium-hub
????? - HUB_PORT_4444_TCP_PORT=4444
3、docker-compose命令:
運(yùn)行命令啟動(dòng)(到docker-compose.yml路徑下):docker-compose up -d
查看啟動(dòng)是否成功:docker-compose ps
創(chuàng)建更多實(shí)例:docker-compose scale chrome=5
關(guān)閉命令:docker-compose down

瀏覽器打開http://localhost:4444/grid/console將會(huì)看到:

運(yùn)行腳本的話直接運(yùn)行就好(IP:http://localhost:4444/wd/hub) ,和上邊兩種的方法不太一樣;不會(huì)有瀏覽器打開(容器內(nèi)部運(yùn)行),但是已經(jīng)運(yùn)行成功:
import unittest
from selenium import webdriver
class 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()
文章主要對(duì)啟動(dòng)Selenium Grid的三種方式做了整理,方便使用者選出最佳的方式。
來源于:https://blog.csdn.net/lb245557472/article/details/91966770
(點(diǎn)擊直達(dá)小程序)
推薦閱讀:
END

長(zhǎng)按二維碼/微信掃碼? 添加作者
閱讀原文

