SELENIUM Bài 13: Selenium Grid

I. Giới thiệu về Selenium Grid

1. Selenium Grid là gì ?

Selenium Grid là một tool của selenium, nó giúp chúng ta chạy test ở trên nhiều môi trường khác nhau, nhiều hệ điều hành khác nhau nhiều máy tính khác nhau, quá trình này gọi là distributed test(Kiểm thử phân tán)

2. Cơ chế quản lý của Selenium Grid

Selenium sử dụng cơ chế HUB and NODE, cơ này sẽ cài cái HUB trên máy điều khiển trung tâm của chúng ta, và sau đó trên các môi trường mà chúng ta cần test ví dụ như môi trường Window sử dụng Chrome, hoặc môi trường FireFox sử dụng Linux, những môi trường này được cài đặt trên những máy tính khác nhau cũng có thể là các máy ảo, sau đó chúng ta sẽ cài đặt các NODE kết nối vào cái HUB này

Thông qua cơ chế HUB và NODE chúng ta không cần phải cài đặt các code trên các máy NODE mà chỉ cần cài các NODE của Selenium trên các máy này, HUB sẽ kết nối đến các NODE và điểu khiển chạy các test.

Hình 1: Selenium Grid 

3. Cách cài đặt Selenium Grid

Để sử dụng được Selenium Grid, chúng ta phải cài HUB trên máy server và cài đặt NODE trên các máy client chúng ta cần test, và đây là link của thư viện selenium grid, các bạn có thể download về TẠI ĐÂY

Bước 1: TẠO HUB Chúng ta vào thư mục có chứa file selenium-server-standalone-3.141.59.jar vừa down về vào cmd tại thư mục này, sau đó gõ dòng lệnh: java -jar selenium-server-standalone-3.141.59.jar -role hub để tạo HUB

Trong câu lệnh trên:
java -jar selenium-server-standalone-3.141.59.jar là câu lệnh để chạy file jar này
-role hub là câu lệnh để cho Selenium biết được chúng ta muốn tạo ra 1 cái HUB
Port chúng ta sử dụng mặc định sẽ là 4444 nếu port này đã bị chiếm mất chúng ta có thể thêm tham số -port 4445 chẳng hạn để chỉ định port cho HUB

Sau khi nhấn enter để chạy thì Selenium Grid sẽ tạo cho chúng ta một cái HUB trên cái máy điều khiển trung tâm của chúng ta, đồng thời lúc đó nó cũng sẽ cho ta 2 cái link như hình dưới đây: 

Hình 2: Các link được tạo ra sau khi tạo HUB

http://10.0.241.234:4444/grid/register/ Link này để đăng ký NODE vào cho HUB giúp các NODE trỏ cà cái HUB
http://10.0.241.234:4444/wd/hub Link này để client connect vào cái HUB giúp lấy driver

Bước 2: Chúng ta sẽ mở trình duyệt ra và truy cập vào đường link: http://localhost:4444/grid/console
Đây là cái link mà cho chúng ta biết cái HUB của chúng ta đang chứa những NODE gì, tuy nhiên ở hình dưới hiện tại cái HUB này chưa chứa cái NODE nảo cả.


Hình 3: Giao diện HUB sau khi được tạo


Bước 3:  Đăng ký NODE, để đăng ký node thì chúng ta phải đến các máy client tạo NODE để nó connect vào cái HUB của chúng ta, tuy nhiên trong phạm vi bài học chúng ta sẽ chạy chung trên 1 máy, tuy nhiên chúng ta phải hiểu rằng HUB sẽ chạy trên máy điều khiển trung tâm còn NODE sẽ chạy trên các máy client chứa các môi trường test

Do Selenium Grid sử dụng cơ chế điều khiển của java nên chúng ta phải tắt tường lửa của máy tính đi thì nó mới hoạt động được.

Chúng ta tiếp tục vào thư mục chứa file selenium-server-standalone-3.141.59.jar  vào cmd tuy nhiên lần này chúng ta sẽ không chạy câu lệnh như tạo HUB nữa mà chúng ta sẽ chạy: 

java -Dwebdriver.chrome.driver=chromedriver.exe -Dwebdriver.id.driver=IEDriverServer.exe -Dwebdriver.gecko.driver=geckodriver.exe -jar selenium-server-standalone-3.141.59.jar -role webdriver -hub http://10.0.240.234:4444/grid/register/

Trong đó -Dwebdriver.chrome.driver=chromedriver.exe cũng giống như System.setProperty() trong code java, nó có tác dụng trỏ đến đường dẫn chứa file chrome driver, tuy nhiên file chrome driver nó đã ở trong cùng thư mục với file selenium-server-standalone-3.141.59.jar khi chúng ta cd đến rồi nên không cần đường dẫn mà chỉ cần điền tên file.exe vào là được.

Tương tự đối với IE driver và Firefox Driver

-jar selenium-server-standalone-3.141.59.jar để chạy file Selenium Grid này.

-role webdriver: Thì nó chỉ tạo NODE cho selenium WebDriver
Bên cạnh cái -role webdriver chúng ta có thể biết thêm sẽ có thể một option nữa đó là -role node
-role node: Thì nó sẽ tạo ra cả NODE cho selenium RC và selenium WebDriver

-hub http://10.0.241.234:4444/grid/register/: Chúng ta gõ -hub vào copy cái link mà đăng ký NODE đã tạo ở bước 2 vào đây và nhấn enter. Kết quả như hình dưới đây là bạn đã đăng ký node thành công



Hình 3: Tạo NODE thành công

Sau khi tạo NODE thành công chúng ta sẽ vào lại http://localhost:4444/grid/console và refresh lại trình duyệt, lúc này mặc định selenium grid nó đã tạo ra cho chúng ta 1 Session IE, 5 Session FireFox và 5 Session chrome, chúng ta cũng có thể vào tab Configuration để xem các thông tin cụ thể về các Session.



Hình 4: Các NODE đã được tạo

Tuy nhiên chúng ta không bao giờ dùng cái mặc của nó tạo ra mà chúng ta phải tự định nghĩa mới trường của chúng ta

Để tạo ra các session theo ý muốn chúng ta thêm câu lệnh này vào đuôi link register bên trên(nhớ thêm dấu cách sau link nếu không sẽ bị lỗi ) -browser "browserName=chrome, version =93, platform=WINDOWS, maxInstances = 1" để tạo browser theo ý muốn
Trong dấu nháy sẽ chứa các tham số tên của browser, version, platform, và maxInstances, giá trị của version và platform không nhất thiết phải đúng với version thực tế hiện có của chrome, mà nó chỉ có tác dụng giúp chúng ta tìm kiếm đến đúng cái browser trong môi trường test của chúng ta sau này

Nếu chúng ta không muốn chạy test song song thì chỉ để cái  maxInstances = 1 còn không có thể thay đổi giá trị 1,2,3... tùy ý.

Sau đó nhấn enter, và đây là kết quả


Hình 5: Tạo NODE theo ý muốn 

Sau đó chúng ta sẽ vào lại http://localhost:4444/grid/console và refresh lại trình duyệt thì được kết quả như hình dưới


Hình 6: NODE theo ý muốn được tạo thành công

Chúng ta cũng có thể có nhiều option -browser khác nhau trong cùng 1 lệnh, ví dụ chúng ta muốn tạo nhiều browser trong cùng môi trường test thì chúng ta có thể có thêm 1 option -browser tiếp
ví dụ kiểu -browser "browserName=firefox, version =68, platform=WINDOWS, maxInstances = 1" -browser "browserName=internet explorer, version =11, platform=WINDOWS, maxInstances = 1"

Sau đó nhấn enter và đây là kết quả


Hình 7: NODE theo ý muốn được tạo thành công với nhiều loại browser khác nhau

Câu lệnh tổng hợp cuối cùng để tạo NODE với nhiều loại browser khác nhau cho mấy bạn lười gõ lại sẽ là 

java -Dwebdriver.chrome.driver=chromedriver.exe -Dwebdriver.id.driver=IEDriverServer.exe -Dwebdriver.gecko.driver=geckodriver.exe -jar selenium-server-standalone-3.141.59.jar -role webdriver -hub http://10.0.240.234:4444/grid/register/ -browser "browserName=chrome, version =93, platform=WINDOWS, maxInstances = 1" -browser "browserName=firefox, version =68, platform=WINDOWS, maxInstances = 1" -browser "browserName=internet explorer, version =11, platform=WINDOWS, maxInstances = 1"

Như vậy là ta đã tạo ra được NODE để connect vào HUB

Bước 4:  Sử dụng HUB và các NODE chúng ta đã tạo ra 
Để làm được điều này chúng ta phải thêm vào dòng code sau trong code selenium của chúng ta

DesiredCapabilities cap = new DesiredCapabilities();
cap.setBrowserName("firefox");
cap.setVersion("9.0.1");
cap.setPlatform(org.openqa.selenium.Platform.WINDOWS);

Sau đó chúng ta sẽ khởi tạo driver, bây giờ chúng ta không dùng class webdriver nữa mà chuyển sang dùng class RemoteWebDriver

driver = new RemoteWebDriver(new URL("http://192.168.1.100:4444/wd/hub"),cap);

Cái link url này chính là cái link thứ 2 mà khi tạo HUB selenium grid đã tạo ra cho chúng ta

Khi khởi tạo driver này thì nó sẽ tìm trong cái link của HUB xem có NODE nào thảo mãn thông tin của DesiredCapabilities đã khai báo hay không, nếu thỏa mãn thì nó sẽ mở 1 tab ở browser trên môi trường client chúng ta cần test, còn code thì nằm ở trên máy chạy HUB, còn browser thì nằm trên cái máy NODE môi trường chúng ta cần test.

II. Ví dụ về Selenium Grid

Đề bài: Sử dụng Selenium Grid mở trang https://demoqa.com/droppable, sau đó kéo thành phần "Drag me" vào thành phần "Drop here"
Cách làm: 
Bước 1: Tạo môi trường
Đầu tiên chúng ta sẽ tạo ra Hub bằng câu lệnh: java -jar selenium-server-standalone-3.141.59.jar -role hub

Tiếp theo sẽ tạo các NODE kết nối đến HUB bằng câu lệnh: java -Dwebdriver.chrome.driver=chromedriver.exe -Dwebdriver.id.driver=IEDriverServer.exe -Dwebdriver.gecko.driver=geckodriver.exe -jar selenium-server-standalone-3.141.59.jar -role webdriver -hub http://10.0.240.234:4444/grid/register/  -browser "browserName=chrome, version =93, platform=WINDOWS, maxInstances = 1"

Vậy là chúng ta đã có 1 HUB và 1 NODE chứa trình duyệt chrome với version là 93

Bước 2: Code
Chúng ta sẽ tạo một project mới tên là: SeleniumGridTest và import toàn bộ thư viện cần dùng của Selenium vào và tạo một package tên là test trong package tests sẽ tạo ra file SeleniumGridTest.java và đây là nội dung của file code vào giải thích code:

  • Vì trong script trên bước 1 đã có phần -Dwebdriver nên trong code chúng ta không phải System.setProperty()
  • Bên cạnh đó vì truyền vào URL nên chúng ta phải throws MalformedURLException để tránh exception

package tests;

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.By;
import org.openqa.selenium.Platform;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

public class SeleniumGridTest {
public static void main(String[] args) throws MalformedURLException {
// Chúng ta khai báo một đối tượng môi trường chúng ta mong muốn thông qua DesiredCapabilities
DesiredCapabilities cap = new DesiredCapabilities();
//Browser name này phải trùng với browser name trong cái NODE chúng ta đã tạo
cap.setBrowserName("chrome");
//Browser version này phải trùng với browser version trong cái NODE chúng ta đã tạo
cap.setVersion("93");
//Platform này phải trùng với Platform trong cái NODE chúng ta đã tạo
cap.setPlatform(Platform.WINDOWS);
//Khởi tạo 1 RemoteWebDriver,  truyền vào URL của HUB và đối tượng cap
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://192.168.1.31:4444/wd/hub"), cap);

//Đây là phần code để kéo thành phần "Drag me" vào thành phần "Drop here", để hiểu phần code này, các bạn có thể tham khảo các bài trước, mình sẽ không giải thích thêm nữa.
driver.manage().window().maximize();
driver.get("https://demoqa.com/droppable");

Actions action = new Actions(driver);
action.dragAndDrop(driver.findElement(By.id("draggable")), driver.findElement(By.id("droppable")));
action.build().perform();
//driver.quit();

}
}
Lưu ý: Trong quá trình test phải luôn mở 2 cửa sổ cmd HUB và NODE, hai máy HUB and NODE phải cùng trong 1 mạng thì mới có để chạy được.
Kết quả của ví dụ này là trên máy NODE sẽ mở một trình duyệt vào kéo kéo thành phần "Drag me" vào thành phần "Drop here" là thành công.

III. Ví dụ về Selenium Grid sử dụng testNG

Đề bài: Sử dụng Selenium Grid và testNG mở trang https://demoqa.com/droppable, sau đó kéo thành phần "Drag me" vào thành phần "Drop here"
Cách làm: 
Bước 1: Tạo môi trường
Đầu tiên chúng ta sẽ tạo ra Hub bằng câu lệnh: java -jar selenium-server-standalone-3.141.59.jar -role hub

Tiếp theo sẽ tạo các NODE kết nối đến HUB bằng câu lệnh: java -Dwebdriver.chrome.driver=chromedriver.exe -Dwebdriver.id.driver=IEDriverServer.exe -Dwebdriver.gecko.driver=geckodriver.exe -jar selenium-server-standalone-3.141.59.jar -role webdriver -hub http://10.0.240.234:4444/grid/register/  -browser "browserName=chrome, version =93, platform=WINDOWS, maxInstances = 1"

Vậy là chúng ta đã có 1 HUB và 1 NODE chứa trình duyệt chrome với version là 93
Bước 2: Code
Chúng ta sẽ tạo một testNG class mới tên là SeleniumGridTestNGTest.java trong package tests của Project SeleniumGridTest bên trên ví dụ trong II.
  • Class name: SeleniumGridTestNGTest
  • Tích chọn: @BeforeMethod, @AfterMethod
  • XML suite file: SeleniumGridTestNGTest.xml
  • Ví dụ Selenium Grid sử dụng testNG chỉ khác ví dụ trên ở chỗ là các giá bị của biến môi trường sẽ được truyền thông qua file test suite SeleniumGridTestNGTest.xml

File: SeleniumGridTestNGTest.java

package tests;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters;

import java.net.MalformedURLException;
import java.net.URL;

import org.openqa.selenium.By;
import org.openqa.selenium.Platform;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterMethod;

public class SeleniumGridTestNGTest {

//Phương thức này chứa test case
@Test
public void DragTest() {
Actions action = new Actions(driver);
action.dragAndDrop(driver.findElement(By.id("draggable")), driver.findElement(By.id("droppable")));
action.build().perform();
}

RemoteWebDriver driver;

//Phương thức này chứa phần khởi tạo driver và môi trường
//Trong phương thức này chúng ta không truyền trực tiếp giá trị của biến môi trường và mà chúng ta sẽ khai báo như trong đoạn code phần dưới, riêng Platform là đối tượng nên chúng ta sẽ không thể truyền trực tiếp String vào mà phải làm như dưới đây.
@Parameters({ "browserName", "version", "platform" })
@BeforeMethod
public void setUp(String browserName, String version, String platform) throws MalformedURLException {
DesiredCapabilities cap = new DesiredCapabilities();
cap.setBrowserName(browserName);
cap.setVersion(version);
if (platform.contentEquals("win8")) {
cap.setPlatform(Platform.WIN8);
} else {
cap.setPlatform(Platform.WINDOWS);
}

driver = new RemoteWebDriver(new URL("http://192.168.1.31:4444/wd/hub"), cap);
driver.manage().window().maximize();
driver.get("https://demoqa.com/droppable");

}
// Hàm này chức phương thức giải phóng driver
@AfterMethod
public void afterMethod() {
// driver.quit();
}

}

File: SeleniumGridTestNGTest.xml
//File test suite này sẽ chứa giá trị của các biến như bên dưới
//Khi chạy code thì sẽ chạy file test suite này chứ không chạy trực tiếp file SeleniumGridTestNGTest.java

<?xml version="1.0" encoding="UTF-8"?>
<suite parallel="false" name="Suite">
<test name="Test">
<parameter name="browserName" value="chrome" />
<parameter name="version" value="93" />
<parameter name="platform" value="WINDOWS" />

<classes>
<class name="tests.SeleniumGridTestNGTest" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->

// Kết quả sẽ tương tự trong ví dụ II bên trên.

IV. Một số lưu ý

  • Như các bạn có thể thấy việc tạo NODE có dòng script cmd khá dài gây rối mắt khi sử dụng. Vậy để rút gọn script này chúng ta có thể sử dụng file json để chứa các thông số về NODE
  • File này sẽ chứa các mảng, nội dung của các mạng sẽ theo dạng key value.
  • Mỗi lần sử dụng chúng ta có thể edit file này cho phù hợp.
  • Các bạn có thẻ tải file mẫu TẠI ĐÂY và bỏ vào cùng thư mục với Selenium Grid, sau đó edit lại thông tin cho phù hợp với hệ thống của mình.
  • Thay vì chạy full câu lệnh như phía trên chúng ta sẽ rút gọn lại như sau:
java -Dwebdriver.chrome.driver=chromedriver.exe -Dwebdriver.id.driver=IEDriverServer.exe -Dwebdriver.gecko.driver=geckodriver.exe -jar selenium-server-standalone-3.141.59.jar -role  node -nodeConfig nodeConfig.json

  • Kết quả cũng tương tự như phần tạo các NODE trong mục I.             

Giới thiệu về HIENDV94

Mình là Hiển. Đây là blog ghi chép lại những thứ mình trải qua và học được hàng ngày, mình luôn luôn muốn học hỏi để trau dồi kinh nghiệm, hoàn thiện bản thân. Rất mong được làm quen mọi người. Hãy kết bạn với mình qua Facebook các bạn nhé.

0 Bình luận:

Đăng nhận xét