Hướng dẫn Selenium cho Tester

Giới thiệu về Selenium

Selenium là một framework mã nguồn mở mạnh mẽ được sử dụng để tự động hóa trình duyệt web. Nó chủ yếu được sử dụng để kiểm tra các ứng dụng web, đảm bảo chúng hoạt động chính xác trên các trình duyệt và hệ điều hành khác nhau. Selenium không chỉ là một công cụ mà là một bộ phần mềm, mỗi phần đáp ứng các nhu cầu kiểm tra khác nhau. Hướng dẫn toàn diện này sẽ dẫn bạn qua các thành phần cốt lõi của Selenium và các ứng dụng thực tiễn của nó.

Tại sao chọn Selenium để kiểm tra web?

Độ phổ biến của Selenium đến từ tính linh hoạt và bộ tính năng mạnh mẽ. Dưới đây là lý do tại sao nó là lựa chọn ưu tiên của nhiều tester:

  • Mã nguồn mở: Miễn phí sử dụng và phân phối.
  • Tương thích đa trình duyệt: Hỗ trợ các trình duyệt chính như Chrome, Firefox, Safari và Edge.
  • Hỗ trợ đa ngôn ngữ: Hoạt động với các ngôn ngữ như Java, Python, C#, Ruby và JavaScript.
  • Hỗ trợ cộng đồng lớn: Có sẵn tài liệu phong phú và diễn đàn cộng đồng để khắc phục sự cố và học hỏi.

Để biết thêm chi tiết về lợi ích của Selenium, bạn có thể tham khảo các tài nguyên như Tài liệu chính thức của Selenium.

Các thành phần của Selenium: Cái nhìn chi tiết

Hiểu rõ các thành phần khác nhau của Selenium là rất quan trọng để tận dụng tối đa tiềm năng của nó:

  • Selenium WebDriver: Thành phần cốt lõi điều khiển trình duyệt trực tiếp, tương tác với các phần tử web.
  • Selenium IDE: Một plugin trình duyệt cho phép bạn ghi lại và phát lại các tương tác với một trang web. Chủ yếu hữu ích để tạo các nguyên mẫu nhanh và báo cáo lỗi.
  • Selenium Grid: Cho phép bạn chạy các bài kiểm tra trên nhiều máy và trình duyệt đồng thời, giảm đáng kể thời gian thực hiện kiểm tra.

Bắt đầu với Selenium WebDriver

Selenium WebDriver là trái tim của kiểm tra tự động. Nó cung cấp một giao diện lập trình để điều khiển trình duyệt web. Để bắt đầu, bạn cần thiết lập môi trường của mình.

Yêu cầu trước:

  1. Cài đặt ngôn ngữ lập trình: Chọn một ngôn ngữ như Java hoặc Python. Đối với Java, bạn cần Bộ phát triển Java (JDK). Đối với Python, tải xuống từ Trang web chính thức của Python.
  2. Cài đặt IDE: Môi trường phát triển tích hợp (IDE) như IntelliJ IDEA, Eclipse hoặc PyCharm giúp viết mã và gỡ lỗi dễ dàng hơn.
  3. Tải xuống thư viện Selenium WebDriver: Thêm thư viện Selenium WebDriver vào dự án của bạn. Điều này có thể được thực hiện bằng các trình quản lý gói như Maven (cho Java) hoặc pip (cho Python).
  4. Tải xuống trình điều khiển trình duyệt: Bạn cần các trình điều khiển cho các trình duyệt bạn muốn kiểm tra (ví dụ: ChromeDriver cho Chrome, GeckoDriver cho Firefox). Đảm bảo phiên bản trình điều khiển khớp với phiên bản trình duyệt. ChromeDriver có thể được tìm thấy tại đây. GeckoDriver có sẵn tại đây.

Ví dụ mã cơ bản Selenium WebDriver (Java):


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

public class SeleniumExample {
  public static void main(String[] args) {
   // Đặt đường dẫn đến tệp thực thi ChromeDriver
   System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");

   // Khởi tạo ChromeDriver
   WebDriver driver = new ChromeDriver();

   // Điều hướng đến một trang web
   driver.get("https://www.example.com");

   // Lấy tiêu đề của trang
   String title = driver.getTitle();
   System.out.println("Tiêu đề trang: " + title);

   // Đóng trình duyệt
   driver.quit();
  }
}

Ví dụ mã cơ bản Selenium WebDriver (Python):


from selenium import webdriver

# Đặt đường dẫn đến tệp thực thi ChromeDriver
driver = webdriver.Chrome(executable_path='/path/to/chromedriver')

# Điều hướng đến một trang web
driver.get("https://www.example.com")

# Lấy tiêu đề của trang
title = driver.title
print("Tiêu đề trang:", title)

# Đóng trình duyệt
driver.quit()

Định vị các phần tử web

Một trong những khía cạnh quan trọng nhất của kiểm tra Selenium là định vị các phần tử web. Selenium cung cấp một số chiến lược để tìm các phần tử, bao gồm:

  • ID: Định vị các phần tử bằng thuộc tính ID duy nhất của chúng.
  • Tên: Định vị các phần tử bằng thuộc tính tên của chúng.
  • ClassName: Định vị các phần tử bằng tên lớp của chúng.
  • TagName: Định vị các phần tử bằng tên thẻ của chúng (ví dụ: <div>, <input>).
  • LinkText: Định vị các liên kết bằng văn bản chính xác của chúng.
  • PartialLinkText: Định vị các liên kết bằng một phần văn bản của chúng.
  • XPath: Định vị các phần tử bằng biểu thức XPath, cung cấp sự linh hoạt và chính xác hơn.
  • CSS Selector: Định vị các phần tử bằng bộ chọn CSS, tương tự như các bộ chọn được sử dụng trong việc tạo kiểu trang web.

XPath và bộ chọn CSS đặc biệt mạnh mẽ để định vị các phần tử phức tạp hoặc động. Hãy xem xét khám phá các hướng dẫn về XPathBộ chọn CSS để cải thiện kỹ năng định vị phần tử của bạn.

Ví dụ định vị phần tử (Java):


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ElementLocation {
  public static void main(String[] args) {
   System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
   WebDriver driver = new ChromeDriver();
   driver.get("https://www.example.com");

   // Định vị một phần tử bằng ID
   WebElement elementById = driver.findElement(By.id("elementId"));

   // Định vị một phần tử bằng Tên
   WebElement elementByName = driver.findElement(By.name("elementName"));

   // Định vị một phần tử bằng XPath
   WebElement elementByXPath = driver.findElement(By.xpath("//div[@class='example']"));

   // Định vị một phần tử bằng Bộ chọn CSS
   WebElement elementByCSS = driver.findElement(By.cssSelector("div.example"));

   driver.quit();
  }
}

Xử lý các khoảng chờ trong Selenium

Các ứng dụng web thường sử dụng JavaScript không đồng bộ và AJAX, điều này có thể dẫn đến các vấn đề về thời gian trong quá trình kiểm tra. Selenium cung cấp các cơ chế chờ để giải quyết vấn đề này:

  • Chờ ẩn: Yêu cầu WebDriver chờ một khoảng thời gian nhất định khi cố gắng tìm một phần tử nếu nó không có sẵn ngay lập tức.
  • Chờ rõ ràng: Cho phép bạn chờ cho một điều kiện cụ thể được đáp ứng trước khi tiếp tục.
  • Chờ linh hoạt: Cung cấp sự linh hoạt hơn, cho phép bạn chỉ định các khoảng thời gian kiểm tra và các ngoại lệ bị bỏ qua.

Ví dụ về chờ rõ ràng (Java):


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;

public class ExplicitWaitExample {
  public static void main(String[] args) {
   System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
   WebDriver driver = new ChromeDriver();
   driver.get("https://www.example.com");

   WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
   WebElement element = wait.until(
    ExpectedConditions.presenceOfElementLocated(By.id("dynamicElement"))
   );

   // Bây giờ bạn có thể tương tác với phần tử
   element.click();

   driver.quit();
  }
}

Làm việc với các phần tử web khác nhau

Selenium cho phép bạn tương tác với các phần tử web khác nhau, chẳng hạn như:

  • Hộp văn bản: Gửi văn bản đến các trường nhập liệu.
  • Nút: Nhấp vào các nút để kích hoạt hành động.
  • Hộp kiểm và Nút radio: Chọn hoặc bỏ chọn các tùy chọn.
  • Danh sách thả xuống: Chọn các tùy chọn từ danh sách thả xuống.
  • Cảnh báo và cửa sổ bật lên: Xử lý các cảnh báo JavaScript và hộp thoại modal.

Ví dụ tương tác với các phần tử web (Java):


import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;

public class WebElementInteraction {
  public static void main(String[] args) {
   System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
   WebDriver driver = new ChromeDriver();
   driver.get("https://www.example.com");

   // Hộp văn bản
   WebElement textBox = driver.findElement(By.id("textBoxId"));
   textBox.sendKeys("Xin chào, Selenium!");

   // Nút
   WebElement button = driver.findElement(By.id("buttonId"));
   button.click();

   // Hộp kiểm
   WebElement checkbox = driver.findElement(By.id("checkboxId"));
   checkbox.click();

   // Danh sách thả xuống
   WebElement dropdown = driver.findElement(By.id("dropdownId"));
   Select select = new Select(dropdown);
   select.selectByVisibleText("Tùy chọn 2");

   driver.quit();
  }
}

Các kỹ thuật kiểm tra Selenium nâng cao

Vượt ra ngoài những điều cơ bản, Selenium cung cấp các kỹ thuật nâng cao để xử lý các tình huống phức tạp hơn:

  • Xử lý nhiều cửa sổ và thẻ: Chuyển đổi giữa các cửa sổ và thẻ trình duyệt.
  • Làm việc với khung và iFrames: Chuyển đổi ngữ cảnh để tương tác với các phần tử trong khung.
  • Thực thi JavaScript: Chạy mã JavaScript trong trình duyệt.
  • Chụp ảnh màn hình: Chụp ảnh màn hình trình duyệt để báo cáo và gỡ lỗi.
  • Kiểm tra dựa trên dữ liệu: Sử dụng các nguồn dữ liệu bên ngoài để thực thi kiểm tra.

Ví dụ chụp ảnh màn hình (Java):


import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import java.io.File;
import java.io.IOException;

public class ScreenshotExample {
  public static void main(String[] args) throws IOException {
   System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
   WebDriver driver = new ChromeDriver();
   driver.get("https://www.example.com");

   // Chụp ảnh màn hình
   File screenshotFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
   FileUtils.copyFile(screenshotFile, new File("./screenshot.png"));

   driver.quit();
  }
}

Lưu ý: Ví dụ này yêu cầu thư viện Apache Commons IO. Hãy thêm nó vào các phụ thuộc của dự án của bạn.

Selenium Grid để kiểm tra song song

Selenium Grid cho phép bạn chạy các bài kiểm tra đồng thời trên các máy và trình duyệt khác nhau. Điều này làm giảm đáng kể thời gian cần thiết để hoàn thành bộ kiểm tra của bạn. Nó bao gồm một Hub (điểm trung tâm) và các Node (các máy nơi các bài kiểm tra được thực thi).

Thiết lập Selenium Grid bao gồm:

  1. Tải xuống tệp JAR độc lập của Selenium Server từ Trang tải xuống Selenium.
  2. Khởi động Hub: java -jar selenium-server-standalone.jar -role hub
  3. Khởi động Node: java -jar selenium-server-standalone.jar -role node -hub http://hub_ip:4444/grid/register

Bạn sau đó cấu hình WebDriver của bạn để kết nối với Hub, chỉ định trình duyệt và hệ điều hành mong muốn.

Thực hành tốt nhất cho kiểm tra Selenium

Để viết các bài kiểm tra Selenium hiệu quả và dễ bảo trì, hãy xem xét các thực hành tốt nhất sau:

  • Sử dụng các bộ định vị mô tả: Chọn các bộ định vị ổn định và ít có khả năng thay đổi. Tránh dựa hoàn toàn vào XPath, vì nó có thể dễ gãy.
  • Triển khai Mô hình Đối tượng Trang (POM): Mẫu thiết kế này tạo ra các lớp riêng biệt cho từng trang trong ứng dụng của bạn, đóng gói các phần tử và hành động liên quan đến trang đó. Điều này cải thiện khả năng tái sử dụng và bảo trì mã.
  • Viết các bài kiểm tra mô-đun: Chia nhỏ các bài kiểm tra của bạn thành các đơn vị nhỏ hơn, độc lập để dễ hiểu và gỡ lỗi hơn.
  • Sử dụng kiểm tra dựa trên dữ liệu: Sử dụng dữ liệu bên ngoài để tham số hóa các bài kiểm tra của bạn, cho phép bạn kiểm tra các kịch bản khác nhau với cùng một mã.
  • Giữ các bài kiểm tra độc lập: Mỗi bài kiểm tra nên có thể chạy độc lập, không dựa vào kết quả của các bài kiểm tra khác.
  • Thường xuyên xem xét và tái cấu trúc các bài kiểm tra: Giữ các bài kiểm tra của bạn cập nhật với các thay đổi trong ứng dụng và tái cấu trúc chúng để cải thiện khả năng đọc và bảo trì.

Selenium so với các công cụ kiểm tra khác

Mặc dù Selenium là một công cụ mạnh mẽ, nhưng nó không phải là lựa chọn duy nhất cho kiểm tra web. Dưới đây là so sánh với các công cụ phổ biến khác:

Công cụ Ưu điểm Nhược điểm
Selenium Mã nguồn mở, hỗ trợ đa trình duyệt, hỗ trợ đa ngôn ngữ, cộng đồng lớn. Yêu cầu kiến thức lập trình, có thể phức tạp để thiết lập, báo cáo tích hợp hạn chế.
Cypress Dễ dàng thiết lập, công cụ gỡ lỗi tuyệt vời, thực thi nhanh. Hỗ trợ trình duyệt hạn chế (chủ yếu Chrome), chỉ JavaScript.
Playwright Hỗ trợ đa trình duyệt, tự động chờ, chặn mạng. Tương đối mới, cộng đồng nhỏ hơn so với Selenium.
TestComplete Tính năng toàn diện, hỗ trợ các công nghệ khác nhau, ghi và phát lại. Công cụ thương mại, có thể tốn kém.

Kết luận

Selenium là một công cụ không thể thiếu để kiểm tra ứng dụng web, cung cấp một cách linh hoạt và mạnh mẽ để tự động hóa các tương tác trình duyệt. Bằng cách hiểu rõ các thành phần cốt lõi, thành thạo các chiến lược định vị phần tử và áp dụng các thực hành tốt nhất, bạn có thể tạo ra các bài kiểm tra tự động mạnh mẽ và dễ bảo trì, đảm bảo chất lượng và độ tin cậy của các ứng dụng web của bạn. Cho dù bạn là người mới bắt đầu hay một tester có kinh nghiệm, Selenium cung cấp các công cụ bạn cần để thành công trong lĩnh vực phát triển web luôn phát triển.

Chỉ mục