上一篇文章講了如何通過Selenium Grid做分布式自動化測驗,不清楚的可以點擊手把手教你使用Selenium Grid實作分布式自動化測驗進行閱讀,
上次我們遇到一個問題,就是我們在執行腳本的時候,發現每次只能在一個Node上面執行瀏覽器操作,我們在執行腳本的時候,如何在多個Node上同時執行瀏覽器操作呢?
一、ThreadLocal簡介
ThreadLocal是JDK包提供的,它提供執行緒本地變數,如果創建一個ThreadLocal變數,那么訪問這個變數的每個執行緒都會有這個變數的一個副本,在實際多執行緒操作的時候,操作的是自己本地記憶體中的變數,從而規避了執行緒安全問題,(文末有作者的筆記分享)

1import org.openqa.selenium.WebDriver;
2
3/**
4 * @author 作者:測驗工程師成長之路
5 * @version 創建時間:2021/7/31
6 * 類說明:
7 */
8public class BrowserUtils {
9 private static ThreadLocal<WebDriver> threadLocal = new ThreadLocal<>();
10
11 /**
12 * 從執行緒ThreadLocal獲取存放的驅動
13 * @return
14 */
15 public static WebDriver getDriver(){
16 return threadLocal.get();
17 }
18
19 /**
20 * 將驅動設定給執行緒ThreadLocal
21 * @param driver
22 */
23 public static void setDriver(WebDriver driver){
24 threadLocal.set(driver);
25 }
26}
二、啟動Hub和Node
1#啟動hub
2java -jar selenium-server-standalone-3.5.3.jar -role hub
3
4#啟動Node1和Node2
5#分別在兩臺機器上執行命令
6java -jar selenium-server-standalone-3.5.3.jar -role node -port 5555 -hub http://hub ip:4444/grid/register -maxSession 5 -browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5

三、測驗腳本修改
1import org.openqa.selenium.By;
2import org.openqa.selenium.Keys;
3import org.openqa.selenium.Platform;
4import org.openqa.selenium.WebDriver;
5import org.openqa.selenium.remote.DesiredCapabilities;
6import org.openqa.selenium.remote.RemoteWebDriver;
7import org.testng.annotations.Test;
8
9import java.net.MalformedURLException;
10import java.net.URL;
11
12/**
13 * @author 作者:測驗工程師成長之路
14 * @version 創建時間:2021/7/19
15 * 類說明:Selenium Grid
16 */
17public class SeleniumGridTest {
18 public static final String browserName = "chrome";
19
20 @Test
21 public void testGrid() throws InterruptedException {
22 try {
23 // System.setProperty("webdriver.chrome.driver","D:\\software\\selenium\\chromedriver.exe");
24
25 DesiredCapabilities capability = new DesiredCapabilities();
26 capability.setBrowserName(browserName);
27 capability.setPlatform(Platform.WINDOWS);
28
29 WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
30 BrowserUtils.setDriver(driver);
31 BrowserUtils.getDriver().get("http://www.baidu.com");
32 BrowserUtils.getDriver().manage().window().maximize();
33 Thread.sleep(3000);
34 //輸入 hadoop查詢
35 BrowserUtils.getDriver().findElement(By.id("kw")).sendKeys("mrjade" + Keys.ENTER);
36 Thread.sleep(3000);
37 BrowserUtils.getDriver().findElement(By.xpath("//*[@id=\"1\"]/h3/a")).click();
38 Thread.sleep(5000);
39
40 BrowserUtils.getDriver().close();
41 BrowserUtils.getDriver().quit();
42
43 } catch (MalformedURLException e) {
45 e.printStackTrace();
46 }
47 }
48}
四、testng.xml配置
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
3<suite name="Suite" parallel="tests" thread-count="2">
4 <test name="Test1">
5 <classes>
6 <class name="SeleniumGridTest">
7 <methods>
8 <include name="testGrid"></include>
9 </methods>
10 </class>
11 </classes>
12 </test>
13 <test name="Test2">
14 <classes>
15 <class name="SeleniumGridTest">
16 <methods>
17 <include name="testGrid"></include>
18 </methods>
19 </class>
20 </classes>
21 </test>
22</suite>
說明:parallel
該引數的值false,methods,tests,classes,instances,默認false,必須和thread-count配套使用,否則相當于無效引數,thread-count決定了并行測驗時開啟的執行緒數量,
1.parallel="mehods":TestNG將并行執行所有的測驗方法在不同的執行緒里,
2.parallel="tests":TestNG將并行執行在同一個<test>標簽下的所有方法在不同執行緒里,
3.parallel="classes":TestNG將并行執行在相同<class>下的方法在不同執行緒里,
4.parallel="instances":TestNG將并行執行相同實體下的所有方法在不同的執行緒里,
五、遺留問題
上述代碼可以實作在不同Node上同時啟動chrome瀏覽器,那么如何分別啟動chrome和firefox呢,在嘗試程序中發現無法啟動firefox,可能是版本方面不兼容導致,但是嘗試了好幾個版本依然沒有解決,以下是嘗試過的版本資訊
1firefox version:56,60
2geckodriver version:0.18.0,0.19.0,0.20.0
3selenium version:3.5.3
附:selenium與firefox,geckodriver版本映射表

selenium與firefox,geckodriver版本映射表
因為考慮到chrome版本與selenium版本兼容性的問題,所以就沒有嘗試不同selenium版本去啟動firefox,有興趣的小伙伴可以去嘗試嘗試,
最后感謝每一個認真閱讀我文章的人,看著粉絲一路的上漲和關注,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:
這些資料,對于【軟體測驗】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴上萬個測驗工程師們走過最艱難的路程,希望也能幫助到你!
在我的QQ技術交流群里(技術交流和資源共享,廣告勿擾)
可以自助拿走,群號:175317069 群里的免費資料都是筆者十多年測驗生涯的精華,還有同行大神一起交流技術哦

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291798.html
標籤:其他
