Selenium Grid分散式測試環境搭建
Selenium Grid簡介
Selenium Grid實際上是基於Selenium RC的,而所謂的分散式結構就是由一個hub節點和若干個node代理節點組成。Hub用來管理各個代理節點的註冊資訊和狀態資訊,並且接受遠端客戶端程式碼的請求呼叫,然後把請求的命令轉發給代理節點來執行(官方說明)
簡單來說通過selenium grid可以實現一臺伺服器控制多臺node節點機器遠端執行selenium自動化測試指令碼。比如自動化測試指令碼存放在一臺hub主機上,那麼通過grid就可以控制多臺node客戶端來執行hub主機上的自動化測試指令碼,下面我們就開始配置一下分散式測試執行環境
環境準備
其實hub主機和node節點可以同時配置在一臺物理機上,但是為了模擬真實的測試環境,我準備了2臺真實的物理機,當然你也可以使用一臺物理機+虛擬機器的方式練習
1. 準備2臺處於同一個區域網下的物理機,保證2臺物理機能夠相互ping通
2.下載selenium-server-standalone包
3.作為node節點的物理機需要配置好瀏覽器和對應驅動,並把驅動程式加入環境變數
4.hub主機和node主機均需要配置java jdk 1.8 (切記本版,否則可能配置不成功)
問題
如果你的兩臺機器處於同一個網路,但是無法相互ping通,你可以嘗試下面的辦法解決
開啟控制面板-開啟防火牆設定-點選【高階設定】-點選【入站規則】找到下面兩個規則並開啟
下載selenium-server-standalone
訪問官網 https://www.seleniumhq.org/download/ 下載 selenium-server-standalone
下載好selenium-server-standalone-3.141.59.jar包後,分別放到兩臺電腦的任意位置
配置瀏覽器驅動
瀏覽器驅動如何配置,請自行百度(谷歌的驅動可以從這裡下載https://npm.taobao.org/mirrors/chromedriver),我後面主要使用的是firefox瀏覽器
安裝JDk
https://www.cnblogs.com/linuxchao/p/linuxchao-jenkins-setup.html 我的這篇文章裡面有安裝jdk的教程,但是請注意jdk的版本
搭建環境
配置hub主機
我選擇作為hub主機的地址為:192.168.1.103
開啟cmd終端,並切換到selenium-server-standalone-3.141.59.jar所在的目錄下,執行命令:java -jar selenium-server-standalone-3.141.59.jar -role hub
執行命令後,會初始化本機為hub伺服器,自動分配一個ip地址(如圖,這個地址是個虛擬地址,作為hub的主機地址,因為同一臺機器可以同時作為hub和note,所以會自動生成一個虛擬地址),埠號預設為4444,當然你在初始化hub主機的時候也可以修改預設埠,新增-port=指定埠號即可
初始化完成後,我們可以訪問http://192.168.24.1:4444:/grid/console來檢視初始化的hub狀態如圖
配置node節點
我選擇的node節點機器的地址為:192.168.1.102
同樣開啟cmd終端,並切換到selenium-server-standalone-3.141.59.jar所在的目錄下,執行命令:
java -jar selenium-server-standalone-3.141.59.jar -role webdriver -browser "browserName=firefox,platform=WINDOWS" -hubHost 192.168.1.103(hub所在的主機地址)
如果你使用的瀏覽器是chrome,可能你需要執行這個命令(別問我為什麼,我使用chrome瀏覽器的時候,使用上面的命令,只是修改了browserName=chrome,沒有成功)
java -jar -Dwedriver.chrome.driver=driver所在的目錄\chromedriver.exe selenium-server-standalone-3.141.59.jar -browser "browserName=chrome, version=75" -role node -hubHost 192.168.1.103
命令執行完畢後你會看到下面的輸出資訊
ok,現在我們再次訪問一下hub主機的地址看下狀態
右邊就是我初始化成功後的遠端node節點機器的配置,左邊我也配置了一個,是在hub所在的主機配置的一個note節點
到這裡,我們的分散式自動化測試環境就配置完成了,接下來開始編寫我們的測試程式碼,看下是否能夠在遠端note機器上執行測試
測試指令碼
測試指令碼放在hub所在的機器(我們的目的就是控制遠端note機器執行測試(開啟瀏覽器執行測試),並不是hub所在機器執行(要不然還有啥意義呢?))
""" ------------------------------------ @Time : 2019/7/6 16:55 @Auth : linux超 @File : testCaseNodeB.py @IDE : PyCharm @Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error! @QQ : [email protected] @GROUP: 878565760 ------------------------------------ """ import time import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class TestSeleniumGrid(unittest.TestCase): def setUp(self): self.driver = webdriver.Remote(command_executor="http://192.168.1.102:16891/wd/hub", desired_capabilities={"browserName": "firefox", # 瀏覽器名稱 "platform": "WINDOWS" }) def test_grid(self): self.driver.get("https://www.baidu.com") self.driver.find_element_by_id('kw').send_keys('linux超') self.driver.find_element_by_id('su').click() WebDriverWait(self.driver, 10). \ until(EC.visibility_of_element_located((By.XPATH, '//a[text()="https://www.cnblogs.com/"]'))) page_source = self.driver.page_source self.assertIn('linux', page_source) def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
執行過程
我們執行hub主機上的程式碼然後看一下note節點機器上執行的過程, 並注意看hub主機和note點選機器cmd終端的輸出結果
執行過程中有一些警告資訊,也不知道什麼原因,我還沒找到解決的辦法,但是並不影響測試的執行,到此為止整個測試環境搭建就完成了
最後
搭建過程需要注意
1.瀏覽器和瀏覽器驅動版本要匹配,且新增到系統環境變數
2.初始化hub和node時的命令不要敲錯,算這次我一共搭過2次環境, 之前2次折騰命令引數就折騰了好久(對一個引數選項不太理解)
3.不要被hub和node機器的ip搞暈,指令碼中的要在哪裡執行測試就要配置哪個node節點機器的地址 (command_executor="http://192.168.1.102:16891/wd/hub",而且要主要後面接的/wd/hub是固定的不要寫錯)
需要注意的差不多就這麼多吧, 自己不手動配置一遍你也不會知道究竟會遇到什麼問題
TODO
配置這個測試環境之後,我一直有個疑問,我的程式碼只能在一個node上的一個瀏覽器上執行,分散式分散式,這樣的話還有啥意義呢?我的理解是應該能同時在不同的node機器上不同的瀏覽器上執行才符合這個概念,所以呢我試著使用python執行緒併發修改了幾次程式碼也沒有成功,試著找資料也沒有解決我這個疑惑,也可能我理解的有問題,不管怎麼樣了,以後有了思路再更新這篇文章