Hướng Dẫn Tự Học Selenium WebDriver Với Java & TestNG (Từ A-Z Cho Người Mới)

Lời mở đầu

Chào mừng các bạn đến với khóa học Selenium WebDriver kết hợp TestNG dành cho người mới bắt đầu. Nếu bạn đang tìm kiếm một công cụ để bước chân vào thế giới Automation Testing, thì Selenium chính là “vũ khí” lợi hại nhất mà bạn cần trang bị.

Trong bài viết này, tôi sẽ không chỉ dạy lý thuyết suông. Với tư cách là một người làm nghề lâu năm, tôi sẽ hướng dẫn các bạn từng bước thiết lập môi trường trên Eclipse, viết những dòng code Java đầu tiên và chạy kiểm thử tự động trên các trang web thực tế.

Mục tiêu của bài học hôm nay:

  1. Hiểu rõ cách cài đặt môi trường Java + Eclipse + Selenium.
  2. Nắm vững các thao tác cơ bản với WebDriver.
  3. Làm quen với TestNG Framework để quản lý Test Case.
  4. Thực hành trên các dự án Demo thực tế.


Chuẩn bị môi trường lập trình

Để bắt đầu, chúng ta cần xây dựng một “nền móng” vững chắc. Automation Testing với Selenium yêu cầu các thành phần sau hoạt động trơn tru.

1. Hướng dẫn cài đặt JDK (Java Development Kit)

Selenium WebDriver viết bằng Java cần có JDK để biên dịch và chạy code.

  • Bước 1: Truy cập trang chủ Oracle hoặc tải OpenJDK (khuyên dùng Java 11 hoặc 17 trở lên để ổn định).
  • Bước 2: Cài đặt và cấu hình biến môi trường JAVA_HOME.
  • Kiểm tra: Mở CMD và gõ java -version. Nếu hiện phiên bản Java là bạn đã thành công.
install_jdk

2. Hướng dẫn cài đặt Eclipse IDE

Eclipse là IDE phổ biến nhất cho Java Developer và Tester.

3. Tạo Maven Project và thêm thư viện

Chúng ta sẽ không add file .jar thủ công mà sẽ dùng Maven để quản lý thư viện. Đây là chuẩn mực của các dự án thực tế. Do đó tiền điều kiện là phải cài đặt và cấu hình biến môi trường Maven cho thiết bị thiết kế testscript trước (đảm bảo sau khi làm xong các bước này dùng lệnh “mvn -v” phải có thông tin phiên bản Maven). Khi đã đầy đủ công cụ cần thiết:

  1. Mở Eclipse, chọn File > New > Maven Project.
  2. Tick chọn Create a simple project, nhấn Next.
  3. Điền Group Id (vd: com.automation) và Artifact Id (vd: selenium-training), nhấn Finish.
  4. Mở file pom.xml và thêm đoạn code sau vào thẻ <dependencies> (đặt trước thẻ đóng </projects>):

<dependencies>
    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.16.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>7.9.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Note:

Bạn đã tạo được project và thấy file pom.xml chưa? Nếu gặp lỗi tải thư viện, hãy thử chuột phải vào project chọn Maven > Update Project nhé!

Selenium WebDriver cơ bản

Phần này chúng ta sẽ đi vào cốt lõi của Selenium. Mọi thao tác auto đều bắt đầu từ đây.

Khởi tạo WebDriver

Để trình duyệt “nghe lời” code, chúng ta cần khởi tạo WebDriver. Trong khóa học này chúng ta sử dụng Google Chrome để thực hành nhé. Lưu ý là từ Selenium 4.6+, tính năng Selenium Manager đã được tích hợp, bạn không cần tải chromedriver.exe thủ công nữa.

Chuột phải vào “src/test/java” chọn New -> package, đặt tên “demo”, nhấn Finish

Kế đến chuột phải package vừa tạo chọn New -> Class, và đặt tên là “FirstTest”

selenium-webdriver-maven-project

Code mẫu khởi tạo:

package demo;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class FirstTest {
    public static void main(String[] args) {
        // Khởi tạo trình duyệt Chrome
        WebDriver driver = new ChromeDriver();
        
        // Mở trang demo
        driver.get("https://blazedemo.com/");
        
        // In ra tiêu đề trang
        System.out.println("Title: " + driver.getTitle());
        
        // Đóng trình duyệt
        driver.quit();
    }
}

Hãy chuột phải vào class sau đó chọn Run as -> Java Application xem điều gì xảy ra nhé.

Locator trong Selenium

Muốn thao tác với phần tử nào (nút bấm, ô nhập liệu), bạn phải tìm được “địa chỉ” (Locator) của nó. Các loại Locator phổ biến: id, name, class, cssSelector, xpath.

1. Locator là gì? Tại sao nó là “trái tim” của Automation Test?

Trong Selenium WebDriver, để thực hiện bất kỳ hành động nào (như click, nhập văn bản, chọn dropdown), “máy” cần phải biết chính xác phần tử (element) đó nằm ở đâu trên trang web. Locator chính là địa chỉ định danh duy nhất của các phần tử HTML đó.

Nếu Locator sai hoặc không chính xác, script kiểm thử của bạn sẽ gặp lỗi phổ biến nhất: NoSuchElementException.

2. 8 Loại Locator cơ bản trong Selenium WebDriver

Selenium hỗ trợ 8 phương thức tìm kiếm phần tử thông qua lớp By. Dưới đây là danh sách được sắp xếp theo độ ưu tiên về tính ổn định và tốc độ:

  1. ID: Định danh duy nhất (Nhanh nhất và chính xác nhất).
  2. Name: Dựa trên thuộc tính name của thẻ HTML.
  3. Class Name: Dựa trên thuộc tính class.
  4. Tag Name: Dựa trên tên thẻ (ví dụ: input, div, a).
  5. Link Text: Dành riêng cho thẻ liên kết <a> (lấy toàn bộ text).
  6. Partial Link Text: Dành cho thẻ <a> (lấy một phần text).
  7. CSS Selector: Mạnh mẽ, tốc độ nhanh, cú pháp linh hoạt.
  8. XPath: Linh hoạt nhất, có thể đi ngược DOM, nhưng tốc độ chậm hơn CSS một chút.

3. Hướng dẫn lấy Locator chuẩn trên trình duyệt Chrome (Chrome DevTools)

Để lấy được Locator, bạn không cần cài đặt tool phức tạp, chỉ cần sử dụng Chrome Developer Tools có sẵn.

Quy trình 3 bước đơn giản:

  • Bước 1: Mở trang web cần test trên Chrome. Nhấn chuột phải vào phần tử bạn muốn lấy, chọn Inspect (Kiểm tra) hoặc nhấn phím tắt F12.
  • Bước 2: Cửa sổ Elements hiện ra và bôi đen dòng code HTML tương ứng với phần tử đó.
  • Bước 3:
    • Lấy ID/Name/Class: Nhìn trực tiếp vào thuộc tính trong thẻ HTML (Ví dụ: id="user-name").
    • Lấy XPath/CSS: Nhấn chuột phải vào dòng code HTML đó > Chọn Copy > Chọn Copy XPath hoặc Copy selector (cho CSS).

💡 Mẹo chuyên gia: Khi mới bắt đầu, việc dùng chức năng Copy XPath của Chrome là cách nhanh nhất. Tuy nhiên, Chrome thường trả về Absolute XPath (XPath tuyệt đối – rất dài và dễ gãy khi giao diện thay đổi). Hãy học cách viết Relative XPath (XPath tương đối) để script ổn định hơn.


4. Code ví dụ minh họa (Java & TestNG)

Dưới đây là ví dụ cách khai báo và sử dụng Locator trong dự án Selenium Java:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;

public class LocatorExample {
    
    @Test
    public void loginTest() {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.saucedemo.com/");

        // 1. Tìm bằng ID
        WebElement username = driver.findElement(By.id("user-name"));
        
        // 2. Tìm bằng Name
        WebElement password = driver.findElement(By.name("password"));
        
        // 3. Tìm bằng XPath (Tùy chỉnh)
        WebElement loginBtn = driver.findElement(By.xpath("//input[@id='login-button']"));
        
        // Thực hiện hành động
        username.sendKeys("standard_user");
        password.sendKeys("secret_sauce");
        loginBtn.click();
        
        driver.quit();
    }
}

5. Tài liệu tham khảo & Locator nâng cao

Để trở thành một Automation Tester giỏi, bạn không chỉ dừng lại ở việc copy-paste. Bạn cần hiểu sâu về cấu trúc của XPath và CSS Selector để xử lý các phần tử động (dynamic elements).

Dưới đây là các nguồn tài liệu chính thống và chuẩn mực nhất để bạn luyện tập cú pháp nâng cao:

Lab thực hành: Truy cập https://blazedemo.com/ và tìm locator cho nút “Find Flights”.

Code mẫu:

// Tìm bằng Name
driver.findElement(By.name("fromPort"));

// Tìm bằng CSS Selector (Nút Find Flights)
driver.findElement(By.cssSelector("input[value='Find Flights']"));

Các thao tác phổ biến

Sau khi tìm được phần tử, chúng ta sẽ tương tác với nó:

  • sendKeys("text"): Nhập dữ liệu.
  • click(): Click chuột.
  • getText(): Lấy nội dung văn bản để kiểm tra.

Lab thực hành: Đăng nhập sai trên trang DemoBlaze.

driver.get("https://www.demoblaze.com/");

// Click nút Login trên menu
driver.findElement(By.id("login2")).click(); 
// Code tiếp theo cần xử lý wait (xem phần dưới)

Wait cơ bản

Web hiện đại load rất nhiều JavaScript, nếu code chạy quá nhanh mà web chưa load xong sẽ gây lỗi NoSuchElementException.

  • Implicit Wait: Đợi ngầm định cho tất cả các element.
  • Explicit Wait: Đợi một điều kiện cụ thể (ví dụ: đợi nút bấm hiển thị).

Code mẫu:

// Implicit Wait: Đợi tối đa 10s cho mỗi lần tìm element
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));


TestNG cho người mới bắt đầu

Viết code trong hàm main rất khó quản lý. TestNG giúp chúng ta tổ chức code thành các Test Case, chạy song song và xuất báo cáo.

Cấu trúc Annotation

TestNG sử dụng các Annotation để định nghĩa luồng chạy:

  • @BeforeMethod: Chạy trước mỗi @Test (thường dùng để mở browser).
  • @Test: Chứa code auto chính.
  • @AfterMethod: Chạy sau mỗi @Test (thường dùng để đóng browser).

Chạy test và tạo test suite

Thay vì Run Java Application, bạn chuột phải vào file chọn Run As > TestNG Test.

Để chạy nhiều file cùng lúc, chúng ta tạo file testng.xml:

<suite name="Training Suite">
  <test name="Basic Test">
    <classes>
      <class name="com.automation.LoginTest"/>
    </classes>
  </test>
</suite>

Assertion + DataProvider

Automation là phải so sánh kết quả thực tế và kết quả mong đợi.

  • Assert: Assert.assertEquals(actual, expected);
  • DataProvider: Chạy 1 test case với nhiều bộ dữ liệu khác nhau (Data Driven Testing).

Lab thực hành TestNG:

@Test
public void verifyPageTitle() {
    String expectedTitle = "Automation Exercise";
    String actualTitle = driver.getTitle();
    Assert.assertEquals(actualTitle, expectedTitle, "Tiêu đề trang không đúng!");
}

Lab thực hành tổng hợp

Bây giờ hãy kết hợp tất cả kiến thức để làm một luồng (flow) hoàn chỉnh trên trang https://demo.nopcommerce.com/.

Kịch bản:

  1. Truy cập trang chủ.
  2. Click vào “Register”.
  3. Nhập thông tin và click “Register”.
  4. Verify thông báo đăng ký thành công.

Source Code mẫu (Java + TestNG):

public class NopCommerceTest {
    WebDriver driver;

    @BeforeMethod
    public void setup() {
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.get("https://demo.nopcommerce.com/");
    }

    @Test
    public void testRegisterUser() {
        // Click Register Link
        driver.findElement(By.className("ico-register")).click();

        // Fill Form
        driver.findElement(By.id("gender-male")).click();
        driver.findElement(By.id("FirstName")).sendKeys("Automation");
        driver.findElement(By.id("LastName")).sendKeys("User");
        driver.findElement(By.id("Email")).sendKeys("auto" + System.currentTimeMillis() + "@gmail.com"); // Random email
        driver.findElement(By.id("Password")).sendKeys("123456");
        driver.findElement(By.id("ConfirmPassword")).sendKeys("123456");

        // Click Register Button
        driver.findElement(By.id("register-button")).click();

        // Assert Message
        String result = driver.findElement(By.className("result")).getText();
        Assert.assertEquals(result, "Your registration completed");
    }

    @AfterMethod
    public void tearDown() {
        driver.quit();
    }
}

Thử thách cho bạn: Hãy thêm bước “Log out” sau khi đăng ký thành công và “Log in” lại với tài khoản vừa tạo. Hãy comment kết quả của bạn bên dưới nhé!


Mini Project cuối buổi

Để thực sự làm chủ Selenium, bạn cần tự tay làm một dự án nhỏ.

Đề bài: Tự động hóa luồng mua hàng trên https://www.demoblaze.com/

Checklist yêu cầu:

  1. [ ] Sử dụng cấu trúc TestNG (@BeforeMethod, @Test, @AfterMethod).
  2. [ ] Add 1 sản phẩm bất kỳ vào giỏ hàng (Samsung galaxy s6).
  3. [ ] Xử lý Alert sau khi add to cart (Gợi ý: dùng driver.switchTo().alert().accept()).
  4. [ ] Vào Cart và kiểm tra xem sản phẩm đã có trong đó chưa.
  5. [ ] Chụp ảnh màn hình (Screenshot) nếu Test Failed (Nâng cao).


Tổng kết và bài tập về nhà

Chúng ta đã cùng nhau đi qua những bước đầu tiên quan trọng nhất của Selenium WebDriver.

Tóm tắt kiến thức:

  • Cài đặt môi trường Eclipse + Maven.
  • Cách tìm Locator chuẩn xác.
  • Cách dùng TestNG để quản lý test.
  • Assertion để kiểm tra kết quả.

Câu hỏi củng cố:

  1. Sự khác nhau giữa findElementfindElements là gì?
  2. Tại sao Implicit Wait lại quan trọng?
  3. Làm sao để chạy TestNG từ file XML?

Bài tập về nhà: Hãy hoàn thành Mini Project ở trên và gửi link GitHub repo của bạn vào phần bình luận. Tôi sẽ review code cho 5 bạn nhanh nhất!

Hẹn gặp lại các bạn ở bài viết nâng cao tiếp theo: Page Object Model – Design Pattern sống còn trong Automation.

Leave a comment