Docker + Selenium Grid 搭建分布式 UI 自動化測試



Selenium Grid 介紹

Selenium Grid 是 selenium 提供的一個分布式測試工具,將自動化腳本發布到多個物理機或者虛擬機(跨平台、跨瀏覽器)上執行,通過一個中心節點來控制多個設備,也就是在中心節點(hub)上管理測試,在其它節點(node)上執行測試,以實現 Selenium 的並行執行。

除了可以在多個設備上運行測試腳本以外,Selenium Grid 也可以實現多瀏覽器兼容性測試。Node 本身不提供多線程並發執行,需要結合多進程技術實現並行執行用例。

使用場景

  • 並發執行測試用例,減少測試執行時間。
  • 瀏覽器兼容性測試。

Selenium Grid 架構

image

  1. Hub 作為管理節點,用來管理各個代理節點的注冊和狀態信息,並且接收遠程客戶端代碼請求調用,然后把請求的命令再轉發給代理代點來執行;
  2. 每個 Selenium Grid 僅包含一個 Hub,Hub 連接多個節點(Node);
  3. Node 就是瀏覽器所在的位置,注冊到 Hub,接收 Hub 的請求並執行測試。

Selenium Grid 執行原理參考


Docker 搭建 Selenium Grid

創建 Hub 容器

docker run -d --name grid_hub -p 5442-5444:4442-4444 selenium/hub
  • --name:給啟動的容器命名一個別名。
  • 5442-5443:hub 與 node 的通信服務。
  • 5444:提供 hub 的 web 圖形界面服務。
  • 5902:提供 node 的遠程訪問服務,以查看瀏覽器執行情況(需配合 VNC Viewer 使用)。

創建 Node 容器

// 若要啟動多個 Node,則修改端口號新建 Node 容器即可
docker run -d --name grid_node -p 5902:5900 -e SE_EVENT_BUS_HOST=k8s.testing-studio.com -e SE_NODE_MAX_SESSIONS=20 -e NODE_MAX_INSTANCES=20 -e SE_NODE_OVERRIDE_MAX_SESSIONS=true -e SE_EVENT_BUS_PUBLISH_PORT=5442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=5443 -v /dev/shm:/dev/shm selenium/node-chrome
  • -e:指定環境變量,用於傳參。
  • --link grid_hub:獲取 hub 容器的網絡信息。
  • MAX_SESSION:限制同時最多只能開啟 20 個瀏覽器(超過則排隊)。
  • NODE_MAX_INSTANCES:一般和 NODE_MAX_SESSION 設置一樣,表示最多同時啟動的瀏覽器實例數。
  • /dev/shm:用於優化內存。

--link 參數原理:把 hub 相關的網絡信息以環境變量的方式傳到容器中(即 -e 環境變量配置)。
因此如果不使用 --link 參數,也可以以環境變量的方式來處理容器間的網絡通信問題。如下:
-e HUB_PORT_4444_TCP_ADDR=XXX
-e HUB_PORT_4444_TCP_PORT=XXX


訪問“虛擬機IP:5444”驗證 Node 是否已經注冊到 Hub,如下:

image


安裝 VNC viewer

  • vnc viewer 是一款優秀的遠程控制工具軟件。
  • 官網下載地址:https://www.realvnc.com/en/connect/download/viewer/
  • 安裝好以后 File->New connection,在彈出的界面中輸入 node 的 IP 和端口號,保存后雙擊啟動。
  • 連接時要求輸入密碼,默認密碼是 secret 。

image

image

下圖代表連接成功:

image


測試腳本

Selenide 版

Maven 依賴

    <dependencies>
        <dependency>
            <groupId>com.codeborne</groupId>
            <artifactId>selenide</artifactId>
            <version>5.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

測試代碼

import com.codeborne.selenide.Condition;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.impl.WebDriverContainer;
import com.codeborne.selenide.impl.WebDriverThreadLocalContainer;
import org.junit.jupiter.api.Test;

import static com.codeborne.selenide.Selectors.byText;
import static com.codeborne.selenide.Selenide.$;
import static com.codeborne.selenide.Selenide.open;

public class SelenideTest {

    @Test
    public void test1() {
        WebDriverContainer webdriverContainer = new WebDriverThreadLocalContainer();
        // 關閉自動截圖
        Configuration.screenshots = false;
        // 清除瀏覽器緩存
        webdriverContainer.clearBrowserCache();
        // 設置瀏覽器為 chrome
        // 不同版本的selenide,默認支持瀏覽器的版本范圍有所不同。若發現不兼容則可以手動設置
        // String chromeDriverPath = "E:\\auto_test_driver\\chromedriver.exe";
        // System.setProperty("webdriver.chrome.driver", chromeDriverPath);
        Configuration.browser = "chrome";
        // 設置遠程 grid hub 地址和端口號,對應容器啟動時的參數
        Configuration.remote = "http://k8s.testing-studio.com:5444/";
        // 訪問指定網址
        String baseUrl = "https://www.baidu.com";
        open(baseUrl);
        $("#kw").setValue("docker").pressEnter();
        // 元素定位與斷言
        $(byText("貼吧")).should(Condition.exist);
    }
    
}

Selenium 版

若腳本需要添加 capabilities 參數,則可以參考 grid/console

image

DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName("chrome");
capability.setPlatform(Platform.WINDOWS);

try {
    WebDriver driver = new RemoteWebDriver(new URL("http://k8s.testing-studio.com:5444/wd/hub"), capability);
    driver.get("https://www.baidu.com");
    driver.quit();
} catch (MalformedURLException e) {
    e.printStackTrace();
}

運行效果

運行腳本后,可以在 VNC 中實時看到運行界面

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM