天天看點

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 Grid分布式測試環境搭建

下載下傳selenium-server-standalone

通路官網 https://www.seleniumhq.org/download/ 下載下傳 selenium-server-standalone

Selenium Grid分布式測試環境搭建

下載下傳好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

Selenium Grid分布式測試環境搭建

執行指令後,會初始化本機為hub伺服器,自動配置設定一個ip位址(如圖,這個位址是個虛拟位址,作為hub的主機位址,因為同一台機器可以同時作為hub和note,是以會自動生成一個虛拟位址),端口号預設為4444,當然你在初始化hub主機的時候也可以修改預設端口,添加-port=指定端口号即可

初始化完成後,我們可以通路http://192.168.24.1:4444:/grid/console來檢視初始化的hub狀态如圖

Selenium Grid分布式測試環境搭建

配置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

指令執行完畢後你會看到下面的輸出資訊

Selenium Grid分布式測試環境搭建

ok,現在我們再次通路一下hub主機的位址看下狀态

Selenium Grid分布式測試環境搭建

右邊就是我初始化成功後的遠端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終端的輸出結果

Selenium Grid分布式測試環境搭建

執行過程中有一些警告資訊,也不知道什麼原因,我還沒找到解決的辦法,但是并不影響測試的執行,到此為止整個測試環境搭建就完成了

最後

搭建過程需要注意

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線程并發修改了幾次代碼也沒有成功,試着找資料也沒有解決我這個疑惑,也可能我了解的有問題,不管怎麼樣了,以後有了思路再更新這篇文章吧!