Grid2官方文檔:https://github.com/SeleniumHQ/selenium/wiki/Grid2
本文采用selenium-server-standalone-3.X.X以上版本搭建,若采用2.53.0及以下版本,請僅作參考
一、環境準備
1、準備兩台計算機(可win、可linux),一台作為hub機,另外作為node機,電腦上均安裝并配置好java環境,建議1.8版本以上。
2、hub機和node機之間的網絡要通暢,可以ping通,可以telnet到hub服務啟動的端口。
2、作為node節點的電腦上安裝好IE、Chrome、Firefox三種浏覽器。具體浏覽器及webdriver版本關系可參考:selenium webdriver 啟動三大浏覽器Firefox,Chrome,IE
3、下載下傳selenium-server-standalone,儲存到兩台計算機中,位置随意。(建議下載下傳3.x.x 以上版本,本文按照此版本進行配置)
下載下傳位址:http://selenium-release.storage.googleapis.com/index.html
二、建立連接配接
1、在hub機上,selenium-server-standalone檔案目錄下,打開cmd視窗,執行語句
①預設執行:C:\>java -jar selenium-server-standalone-3.X.X.jar -role hub
參數的含義,可參考下文:https://blog.csdn.net/xiaomin1991222/article/details/50980117
②修改配置執行:C:\>java -jarselenium-server-standalone-2.37.0.jar -role hub -hubConfig hubconfig.json
hubconfig.json内容:
{
"port": 4444,
"newSessionWaitTimeout": -1,
"servlets" : [],
"withoutServlets": [],
"custom": {},
"capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
"registry": "org.openqa.grid.internal.DefaultGridRegistry",
"throwOnCapabilityNotPresent": true,
"cleanUpCycle": 5000,
"role": "hub",
"debug": false,
"browserTimeout": 0,
"timeout": 1800
}
啟動成功後,通路網址 http://localhost:4444/grid/console,驗證網址是否出現“view config”連結,即可判斷hub啟動成功。預設情況下selenium使用4444作為端口。

2、在node機上執行selenium-server-standalone檔案目錄下,打開cmd視窗,執行語句
①預設執行:java -jar selenium-server-standalone-3.7.1.jar -role node -hub http://192.168.XX.XXX:4444/grid/register (url位址更換為hub機的位址)
參數的含義,可參考下文:https://blog.csdn.net/xiaomin1991222/article/details/50980117
②修改配置執行:java -jar selenium-server-standalone-3.7.1.jar -role node -hub http://192.168.XX.XXX:4444/grid/register -nodeConfig node.json(url位址更換為hub機的位址)
node.json内容:
{
"capabilities":
[
{
"browserName": "firefox",
"marionette": true,
"maxInstances": 3,
"seleniumProtocol": "WebDriver"
},
{
"browserName": "chrome",
"maxInstances": 2,
"seleniumProtocol": "WebDriver"
},
{
"browserName": "internet explorer",
"maxInstances": 1,
"seleniumProtocol": "Selenium"
}
],
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"maxSession": 5,
"port": 5555,
"register": true,
"registerCycle": 5000,
"hub": "http://192.168.42.133:4444",
"nodeStatusCheckTimeout": 5000,
"nodePolling": 5000,
"role": "node",
"unregisterIfStillDownAfter": 60000,
"downPollingLimit": 2,
"debug": false,
"servlets" : [],
"withoutServlets": [],
"custom": {}
}
(備注:此為3.X.X以上版本,2.53.0以下版本可參考https://github.com/SeleniumHQ/selenium/blob/selenium-2.53.0/java/server/src/org/openqa/grid/common/defaults/DefaultNode.json)
再次通路網址 http://localhost:4444/grid/console,驗證Node節點是否在Hub注冊成功。
注意:①、3.X.X官方文檔中"port": -1,,應改為自定義端口号,2.X.X版本預設為5555
②、3.X.X版本中,采用在指令行後面添加-Dwebdriver.XXX.driver的方式已經不能使用,可在執行啟動程式中System.setProperty("webdriver.XXX.driver", "XXXDriver.exe")配置
③、安裝浏覽器時候,盡量選擇預設安裝位置,3.X.X版本不需要配置浏覽器位置,若改變安裝位置,不知是否有影響
三、執行腳本
注意:①、使用node節點遠端執行時,需在node機上安裝各浏覽器的XXXdriver,需配置在環境變量path下可執行檔案夾中(如:XXXdriver下載下傳到D:\selenium中,将蓋位址配置到環境變量path中),且名稱不能改變,必須為chromedriver、geckodriver、IEDriverServer等;②、本機執行時,需先聲明浏覽器路徑、XXXdriver路徑。
以IE為例:
1、建立RemoteDriverUtil:
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
public class RemoteDriverUtil {
static WebDriver driver;
static String nodeUrl = "http://192.168.42.90:5555/wd/hub";
// 啟用遠端調用ie浏覽器
public static WebDriver createRemoteIEDriver() {
// 指定調用IE進行測試
DesiredCapabilities capability = DesiredCapabilities.internetExplorer();
// 避免IE安全設定裡,各個域的安全級别不一緻導緻的錯誤
capability.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
// 連接配接到selenium hub,遠端啟動浏覽器
capability.setPlatform(Platform.WINDOWS);
try {
driver = new RemoteWebDriver(new URL(nodeUrl), capability);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return driver;
}
// 啟用遠端調用chrome
public static WebDriver createRemoteChromeDriver() {
DesiredCapabilities capability = DesiredCapabilities.chrome();
capability.setBrowserName("chrome");
capability.setVersion("67");
capability.setPlatform(Platform.WINDOWS);
try {
driver = new RemoteWebDriver(new URL(nodeUrl), capability);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return driver;
}
// 啟用遠端調用firefox
public static WebDriver createRemoteFirefoxDriver() {
DesiredCapabilities capability = DesiredCapabilities.firefox();
capability.setBrowserName("firefox");
capability.setVersion("");
capability.setPlatform(Platform.WINDOWS);
try {
driver = new RemoteWebDriver(new URL(nodeUrl), capability);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return driver;
}
}
2、建立IETest,并執行
System.out.println("start selenium IE");
//代碼關閉IE一些配置
DesiredCapabilities dc = DesiredCapabilities.internetExplorer();
dc.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
dc.setCapability("ignoreProtectedModeSettings", true);
// 初始化firefox浏覽器執行個體
WebDriver driver = RemoteDriverUtil.createRemoteIEDriver();
// 最大化視窗
driver.manage().window().maximize();
// 設定隐性等待時間
driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
// 打開一個站點
driver.get("http://www.baidu.com/");
// 擷取目前頁面的标題
System.out.println("目前打開頁面的标題是:" + driver.getTitle());
// 關閉浏覽器
driver.close();
System.out.println("end selenium IE");