簡介
Selenium Grid 是 selenium 的三大組件之一,允許用戶同時在不同的機器和系統上測試不同的瀏覽器,可以分布式的來執行我們的自動化測試,也可以測試不同瀏覽器的兼容性。
Selenium Grid 的組成:
- hub節點(控制器)
- 中心節點,控制節點。
- 管理各個 node 節點的注冊信息和狀態。
- 接受並轉發客戶端(測試腳本)請求到合適的 node 節點。
- node 節點(執行器)
- 子節點,代理點。
- 負責注冊配置信息到 hub 節點(平台,瀏覽器,瀏覽器版本)
- 負責接收來自 hub 節點轉發的請求以執行具體用例。
- 也可單獨作為遠程節點執行測試用例。
環境准備
- 在需要執行腳本的機器上安裝 jdk 和配置環境變量。
- 然后下載 selenium-server-standalone-x.x.x.jar, 版本對應自己使用selenium 的版本。
Selenium Grid 運行
1.啟動 hub 節點
java -jar selenium-server-standalone-3.12.0.jar -role hub -port 18888 -maxSession 10
參數解釋:
- java -jar selenium-server-standalone-3.12.0.jar 運⾏jar包
- -role hub 以 hub 的⻆⾊運⾏
- -port 8888 指定hub運⾏的端⼝(默認為4444)
- -maxSession 10 最⼤的處理會話
啟動成功:
2.啟動 node 節點
啟動 chrome 瀏覽器:
java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-3.12.0.jar
-role node -hub " http://192.168.1.104:18888/grid/register/" -port 18881 -browser
"browserName=chrome,maxInstances=2,version=75,platform=WINDOWS"
參數解釋:
- -Dwebdriver.chrome.driver="chromedriver.exe" 指定 chromeDriver 驅動所在的路徑(本地)
- -jar selenium-server-standalone-3.12.0.jar 執行jar包
- -role node 以 node 角色執行。
- -hub " http://192.168.1.104:18888/grid/register/" 將node 節點信息,注冊到 對應的 hub 節點上。
- -port 18881 node節點使用的端口。
- -browser "browserName=chrome,maxInstances=2,version=75,platform=WINDOWS"
- browserName=chrome 運行的瀏覽器。
- maxInstances=2 最多支持兩個瀏覽器示例。
- version=75 瀏覽器版本號。
- platform=WINDOWS 運行的平台
啟動成功:
3.查看 hub 運行狀態
通過地址:http://localhost:18888/grid/console
從控制台看到已經注冊了一個 node 節點,使用的是 chrome 瀏覽器。
4.執行腳本
Selenium Grid 運行環境啟動之后,我們通過對應的腳本來進行使用。
package com.ggf.webauto;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.BrowserType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.net.URL;
/**
* @Description:
* @Author: ggf
* @Date: 2020/04/06
*/
public class RemoteDemo {
public static void main(String[] args) throws Exception {
// 期望能力對象
DesiredCapabilities capabilities = new DesiredCapabilities();
//配置測試的瀏覽器,使用chrome瀏覽器
capabilities.setBrowserName(BrowserType.CHROME);
// hub節點
String url = "http://192.168.1.104:18888/wd/hub";
//和hub建立通訊,把相應配置傳給hub,hub會根據配置選擇注冊的node節點,打開相應的瀏覽器進行測試
WebDriver driver = new RemoteWebDriver(new URL(url), capabilities);
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("selenium");
Thread.sleep(2000);
driver.quit();
}
}
運行腳本之后,Selenium Grid 的 hub節點就會調用對應的 node 節點來執行我們腳本中的內容。
5. Selenium Grid 啟動優化
為了方便我們快速的啟動 Selenium Grid , 我們可以將啟動 hub 節點和 node 節點的命令寫成一個 .bat 文件(windows系統) 或 shell 腳本(Linux系統)
以下是window系統的示例:
- 將 bat文件和瀏覽器驅動以及selenium-server的jar包放在同一個路徑下:
- hub.bat
java -jar selenium-server-standalone-3.12.0.jar -role hub -port 18888 -maxSession 10
- node.bat
set command=java
set chromeDriver=-Dwebdriver.chrome.driver="chromedriver.exe"
set jarParams=-jar selenium-server-standalone-3.12.0.jar
set type=-role node
set hub=-hub "http://192.168.1.104:18888/grid/register"
set port=-port 18881
set chrome=-browser "browserName=chrome,maxInstances=2,version=75,platform=WINDOWS"
%command% %chromeDriver% %jarParams% %type% %hub% %port% %chrome%
Selenium Grid + TestNG多線程執行
Selenium Grid能夠分布式在不同機器上運⾏不同瀏覽器,但是我們看到的串⾏的效果(也就是⼀個瀏覽器執⾏結束后,再運⾏另外⼀個瀏覽器)。要達到並發執⾏的效果,Selenium Grid是做不到的,我們需要通過TestNG單元測試框架所帶的並發執⾏機制。並發執⾏能夠帶來的好處:
- 減少了執⾏時間:並⾏測試也就意味着多個瀏覽器可以在同⼀時間被同時執⾏,從⽽減少了整體測試所花費的時間
- 允許多個線程並⾏同時執⾏⼀個測試腳本/不同的測試腳本
java運行腳本:
package com.ggf.webauto;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.BrowserType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.Test;
import java.net.URL;
/**
* @Description:
* @Author: ggf
* @Date: 2020/04/06
*/
public class SeleniumGridDemo {
@Test
public void testBaiduSearch() throws Exception{
// 期望能力對象
DesiredCapabilities capabilities = new DesiredCapabilities();
//配置測試的瀏覽器,使用chrome瀏覽器
capabilities.setBrowserName(BrowserType.CHROME);
// hub節點
String url = "http://192.168.1.104:18888/wd/hub";
//和hub建立通訊,把相應配置傳給hub,hub會根據配置選擇注冊的node節點,打開相應的瀏覽器進行測試
WebDriver driver = new RemoteWebDriver(new URL(url), capabilities);
driver.get("http://www.baidu.com");
driver.findElement(By.id("kw")).sendKeys("selenium");
Thread.sleep(2000);
driver.quit();
}
}
xml文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite" parallel="tests" thread-count="2">
<test name="Test1">
<classes>
<class name="com.ggf.webauto.SeleniumGridDemo" />
</classes>
</test>
<test name="Test2">
<classes>
<class name="com.ggf.webauto.SeleniumGridDemo" />
</classes>
</test>
</suite>
解釋:
parallel="tests"
tests級別:不同的test tag下的用例可以在不同的線程下執行。
相同的test tag下的用例只能在同一個線程中去執行。
thread-count=2:代表了最大並發線程數.
以上xml配置表示:啟動兩個線程同時執行 SeleniumGridDemo 類。
testng多線程更多內容可參考文章: testng使用詳解