目錄
Selenium Grid 介紹
Selenium Grid 是 selenium 提供的一個分布式測試工具,將自動化腳本發布到多個物理機或者虛擬機(跨平台、跨瀏覽器)上執行,通過一個中心節點來控制多個設備,也就是在中心節點(hub)上管理測試,在其它節點(node)上執行測試,以實現 Selenium 的並行執行。
除了可以在多個設備上運行測試腳本以外,Selenium Grid 也可以實現多瀏覽器兼容性測試。Node 本身不提供多線程並發執行,需要結合多進程技術實現並行執行用例。
使用場景:
- 並發執行測試用例,減少測試執行時間。
- 瀏覽器兼容性測試。
Selenium Grid 架構:
- Hub 作為管理節點,用來管理各個代理節點的注冊和狀態信息,並且接收遠程客戶端代碼請求調用,然后把請求的命令再轉發給代理代點來執行;
- 每個 Selenium Grid 僅包含一個 Hub,Hub 連接多個節點(Node);
- Node 就是瀏覽器所在的位置,注冊到 Hub,接收 Hub 的請求並執行測試。
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,如下:
安裝 VNC viewer
- vnc viewer 是一款優秀的遠程控制工具軟件。
- 官網下載地址:https://www.realvnc.com/en/connect/download/viewer/
- 安裝好以后 File->New connection,在彈出的界面中輸入 node 的 IP 和端口號,保存后雙擊啟動。
- 連接時要求輸入密碼,默認密碼是 secret 。
下圖代表連接成功:
測試腳本
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 :
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 中實時看到運行界面: