iT邦幫忙

3

鼠年全馬鐵人挑戰 WEEK 10:Selenium Grid


Photo on selenium


前言

從幾個禮拜前的 "鼠年全馬鐵人挑戰 WEEK 06:Selenium 自動化測試工具" 文章開始,已經介紹了 Selenium、Selenium IDE、Selenium WebDriver,而到了這週也即將進入尾聲了,也就是最後的 Selenium Grid。那就廢話不多說,開始這禮拜的介紹吧~


Selenium Grid 主要功能

  • Hub
    • 所有測試的中央入口點
  • Nodes
    • 管理和控制瀏覽器所執行的環境
    • 並行執行測試
    • 跨平台測試
    • 負載均衡

Grid 的組成


Monitor, Network Drive, Windows Client, Mac Client, Cell Phone, iPhone by Icons8

  • Hub

    Hub 是一個所有測試發送的中心點。
    每一個 Selenium Grid 僅由一個 hub 組成。
    該 hub 需要可以從相對應的客戶端(Client)啟動。
    該 hub 將連接一個或是多個 nodes 進行委託測試。

    太難理解了嗎? 不然小弟舉個例子好了~

    可以把 Client 想像成使用客戶。
    Hub 就是接收客戶請求的專案經理。
    Nodes 則是完成該專案的專案工程師們。

    • 專案經理(hub)需要做的事情就是,把客戶端(client)提出的請求(test),進行適當的分配,給每個專案工程師(nodes)進行處理。
  • Nodes

    Nodes 將在各個系統上執行測試。
    作為 node 的機器不必與 hub 或其他 node 具有相同的平台或瀏覽器。

    這邊也舉個情境案例來做說明好了~

    今天測試員在 Mac 的系統上,啟動了 hub。
    此時測試員可以在 Windows 的系統上啟動 瀏覽器為 IE 的 node。
    因為這在 Linux 或 Mac 上是不可能達成的。


為何使用 Selenium Grid

  • Grid 利用多台機器設備並行測試來分散測試的執行時間。
    就像是把 100 個測試分給 4 台機器設備來執行
    測試時間就可以縮短為四分之一

  • Grid 還可以支援多個環境執行測試。
    也就是說每個機器設備都有所支援的瀏覽器。
    機器設備1 使用 Internet Explorer 8
    機器設備2 使用 Internet Explorer 9
    機器設備3 使用 最新版的 Chrome
    機器設備4 使用 最新版的 Firefox
    而執行測試時 Selenium Grid 會分配每個測試以其所需的瀏覽器執行。

  • Grid 可以包含相同瀏覽器,類型和版本。
    像是有 4 台機器設備使用了 Grid
    每台機器設備都執行了 3 個 firefox 70
    這樣一來就有如同時執行了 12 個測試
    大大減少了完成測試所需的時間


如何使用 Selenium Grid

初始作業

步驟 1: 啟動 hub

  • 建立新資料夾

    建立一個新資料夾吧~ (可做可不做,看個人)
    如果想要手動操作就忽略下面這一行,懶得操作的就來複製貼上吧 XD
    $ mkdir selenium_grid

  • 搬移檔案

    初始作業 安裝的 selenium-server-standalone
    拉進剛剛建立的 selenium_grid 資料夾吧~

    然後就是 ...

  • 啟動 hub

    執行下面的指令,來啟動 hub
    $ java -jar selenium-server-standalone-<version>.jar -role hub

  • 查看狀態

    Hub 預設的監聽 port 號是 4444
    可以點這個連結 http://localhost:4444/grid/console 看看 hub 的狀態 。

  • 額外補充

    有沒有跟我一樣的大哥大姐覺得 4444 的 port 號,看起來不太順眼。
    沒關係~ 可以再啟動 hub 的時候多一個指令來設定監聽的 port 號。
    $ java -jar selenium-server-standalone-<version>.jar -role hub -port <port>

步驟 2: 啟動 nodes

  • 啟動 node

    $ java -jar selenium-server-standalone-<version>.jar -role node -hub http://localhost:4444

    把程式碼貼到 cmd 中,沒錯 生活就是這麼的乾脆 (沒事 不要理我~)。

  • 查看狀態

    重新整理 步驟 1 中開啟的連結 http://localhost:4444/grid/console。
    整理完頁面之後 就會發現多了一些東西。

    為什麼會多出這些瀏覽器呢?指令中並沒有指定啊~
    其實是啟動 nodes 的預設瀏覽器。
    如果是用 Mac 的話預設瀏覽器為 5個 Firefox、5個 Chrome、1個 Safari。
    如果是用 Windows 的話預設瀏覽器為 5個 Firefox、5個 Chrome、1個 IE。

    啟動成功後,不只有本機可以查看,其他機器設備也可以查看此狀態。
    進入 grid console 的頁面後,點擊 "View Config" 紀錄 host 的 IP 位址。
    就可以在其他電腦上查看該 IP 的 grid console 相關資訊了。

  • 自行定義

    如果想要自行設定各個瀏覽器的分配數量。
    可以寫一份 json 檔,並在啟動 nodes 的時候呼叫它。
    就可以依照自行定義的配置啟動 nodes。

    首先先建立一份 nodeConfig.json 檔,可以參考以下範例。
    也可以參考 selenium 給的原始檔範例 - github.com/SeleniumHQ/selenium
    注意: 這份 json 檔要與 selenium 的 jar 檔案放在同一層。

    {
        "capabilities": [
            {
                "browserName": "firefox",
                "marionette": true,
                "maxInstances": 1,
                "seleniumProtocol": "WebDriver"
            },
            {
                "browserName": "chrome",
                "maxInstances": 2,
                "seleniumProtocol": "WebDriver"
            },
            {
                "browserName": "safari",
                "technologyPreview": false,
                "platform": "MAC",
                "maxInstances": 3,
                "seleniumProtocol": "WebDriver"
            }
        ],
        "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
        "maxSession": 5,
        "port": -1,
        "register": true,
        "registerCycle": 5000,
        "hub": "http://localhost:4444",
        "nodeStatusCheckTimeout": 5000,
        "nodePolling": 5000,
        "role": "node",
        "unregisterIfStillDownAfter": 60000,
        "downPollingLimit": 2,
        "debug": false,
        "servlets": [],
        "withoutServlets": [],
        "custom": {}
    }
    

    存檔後就可以執行下面的指令來啟動 nodes 了。
    $ java -jar selenium-server-standalone-<version>.jar -role node -nodeConfig nodeConfig.json

    如果按照上面的範例將執行會開啟 1個 Firefox、2個 Chrome、3個 Safari。

小節整理

上面已經簡單的介紹了 hub 與 nodes。
啟動 hub 後會拿到一組 host IP。

所以如果在 Windows 10 的系統上啟動 hub 並獲取 IP。
這個時候是可以透過其他設備來建立 nodes 的。
因此可以透過 Mac 的設備 在 Windows 10 的 hub 中啟動 Safari 的 node。
$ java -jar selenium-server-standalone-<version>.jar -role node -hub http://<host IP>:4444

步驟 3: 執行程式

確定步驟 1 與 步驟 2 的 hub 與 node 已經成功啟動。
確定都沒問題後,就可以進行這禮拜內容的最後一個步驟,執行測試。

首先,我們先拿 鼠年全馬鐵人挑戰 WEEK 06:Selenium 自動化測試工具 文章中寫過的測試來進行修改,一樣都是以 python 語言為範例。

原本的程式是長這個樣子。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://ithelp.ithome.com.tw/users/20124633/articles')
driver.close()

為了執行測試並且回傳測試結果,所以加了一些判斷條件。

from selenium import webdriver
import unittest

driver = webdriver.Chrome()

class selenium_grid (unittest.TestCase):
     def test(self):
          driver.get('https://google.com')
          self.assertEquals('Google', driver.title, 'webpage title are not same')
          driver.close()

if __name__ == "__main__":
     unittest.main()

再來就是把 driver 的來源,設定為 Selenium Grid 的 Browser。

from selenium import webdriver
import unittest

driver = webdriver.Remote(
   # 下面會說明從哪邊拿到這一串
   command_executor="http://。<host>:<port>/wd/hub",
   desired_capabilities={
        "browserName": "chrome",
        "browserVersion": "latest",
        "platform": "MAC",
        "platformName": "MAC",
    }
)

class selenium_grid (unittest.TestCase):
     def test(self):
          driver.get('https://google.com')
          self.assertEquals('Google', driver.title, 'webpage title are not same')
          driver.close()

if __name__ == "__main__":
     unittest.main()

最後再來一次~

執行此份 python 就可以在 node 相對應的 hub 機器上跑測試了~

另外透過 id 後面那一串 host 就可以查看目前 node 使用情況。
http://192.168.xxx.xxx:xxxx/wd/hub/

尚無測試使用時

測試正在執行時


結尾

這邊小弟先跟有在關注我文章的大哥大姐們說聲抱歉~
上禮拜沒有如期的發布文章 。゚(゚´ω`゚)゚。

延遲了一週,終於把 Selenium Grid 的東西都整理完了~
感覺內容有點多,希望不會講得太複雜。
到了這週,就已經把所有的 Selenium 的工具都簡單的介紹了一遍了。

如果有疑問或是有錯誤,還請各位大哥大姐提點。
小弟將繼續往下週邁進。 ─=≡Σ((( つ•̀ω•́)つ


參考文件:

Selenium 官方網站
Guru99 - Selenium Grid Tutorial: Hub & Node
Java SE-下載|Oracle技術網|甲骨文
unittest — Unit testing framework
使用 Selenium Grid 的 Python 代碼示例


尚未有邦友留言

立即登入留言