Nội dung bài học

Xử lý phân trang trên Data Table trong Selenium Java (Handle Pagination on Data Table in Selenium Java)

1. Ý tưởng xử lý

- Phải nắm được mặc định hiện bao nhiêu Item trên 1 trang - đặt là itemTotalOnePage
- Bắt tổng số item thường hiện bên dưới bảng - đặt là itemTotal
- Tự tính nhẩm tổng số trang đó bằng tay - đặt là pageTotal
- Lấy itemTotal chia cho itemTotalOnePage để biết là nó phân trang đúng tổng số trang đó chưa (pageTotal)
- Lấy xpath nút Next để click chuyển từng trang
- Dùng vòng lặp FOR chạy từ 1 đến < pageTotal để duyệt từng trang
- Mỗi lần duyệt trang sau khi check data như mong muốn trên table rồi thì nhấn nút Next

Vậy là xong rồi. Y như mình nhìn vào thấy là sẽ check data từng trang xong cái nhấn nút Next để check trang tiếp. Vậy thôi. Mấy cái thông số mục đích để tính toán điểm bắt đầu và dừng thôi.

Cái phần check data từng cột thì An hướng dẫn rồi: xem thêm tại đây

Tiếp theo thì xem đoạn code An viết đầy đủ kết hợp vừa check data vừa phân trang nào dựa ý tưởng trên như An nói.

2. Xử lý phân trang trên Data Table trong Selenium Java

Hàm checkContainsSearchTableByColumn đã chỉ bài trước:

//Handle Data Table
public void checkContainsSearchTableByColumn(int column, String value) throws InterruptedException {
  JavascriptExecutor js = (JavascriptExecutor) driver;
  List < WebElement > totalRows = driver.findElements(By.xpath("//div[@id='example_wrapper']//tbody/tr"));
  Thread.sleep(1);
  System.out.println("Số kết quả cho từ khóa (" + value + "): " + totalRows.size());

  for (int i = 1; i <= totalRows.size(); i++) {
    boolean res = false;
    WebElement title = driver.findElement(By.xpath("//div[@id='example_wrapper']//tbody/tr[" + i + "]/td[" + column + "]"));
    // js.executeScript("arguments[0].scrollIntoView(true);", title);
    res = title.getText().toUpperCase().contains(value.toUpperCase());
    System.out.println("Dòng thứ " + i + ": " + res + " - " + title.getText());
    Assert.assertTrue(res, "Dòng thứ " + i + " (" + title.getText() + ")" + " không chứa giá trị " + value);
  }
}


Hàm phân trang checkDataTableWithPagination mới đây:

//Phân trang và check
@Test
public void checkDataTableWithPagination() throws InterruptedException {
  driver.get("https://datatables.net/");

  By title_H1 = By.xpath("//div[@class='fw-hero']//h1");

  JavascriptExecutor js = (JavascriptExecutor) driver;
  js.executeScript("arguments[0].scrollIntoView(true);", driver.findElement(title_H1));

  Thread.sleep(1000);

  By button_Next = By.xpath("//a[@id='example_next']");
  By label_Info_PageTotal = By.xpath("//div[@id='example_info']");
  String info = driver.findElement(label_Info_PageTotal).getText(); //Showing 1 to 10 of 57 entries

  System.out.println("Chuỗi chứa số item: " + info);

  //Mình tách cái chuỗi trên với ký tự khoảng trắng rồi lấy phần tử thứ 5 tính từ 0
  //Để bắt tổng số Item
  ArrayList < String > arrayListString = new ArrayList < > ();
  for (String s: info.split(" ")) {
    arrayListString.add(s);
  }

  int itemTotal = Integer.parseInt(arrayListString.get(5));
  System.out.println("Tổng số item: " + itemTotal);

  int itemTotalOnePage = 10; //mặc định như mẫu. Tuỳ vào hệ thống mình thay đổi theo
  System.out.println("Số item trên 1 trang: " + itemTotalOnePage);

  double pageTotal = (double) itemTotal / (double) itemTotalOnePage;

  DecimalFormat df = new DecimalFormat("#"); //Làm tròn số đến phần đơn vị của phần thập phân
  //Ví dụ 5.7 thì làm tròn 6 kiểu vậy
  int pageTotalInt = Integer.parseInt(df.format(pageTotal));
  System.out.println("Tổng số trang: " + df.format(pageTotalInt));

  //FOR này chạy tới < pageTotalInt để nó không click thêm lần cuối cùng
  //VD: 6 trang thì nó chỉ click 5 lần thôi chứ hả =))
  for (int i = 1; i < pageTotalInt; i++) {
    //Gọi hàm Check data bên trên lại
    checkContainsSearchTableByColumn(1, "");
    Thread.sleep(1000);
    //Click Next
    driver.findElement(button_Next).click();
  }

  Thread.sleep(2000);

}


Diễn giải thêm một chút:

- Từ ý tưởng thì mình thấy thực tế là cái số 57 nó nằm trong chuỗi nên vì thế buộc mình phải getText() chuỗi đó xong tách nó ra với hàm Split trong Java sau đó cho vào ArrayList. Số 57 nằm vị trí thứ 5 tính từ 0 sau khi tách cho vào mảng.

- Phải lấy được số 57 đó ra bằng mọi cách nhé. Trường hợp khác thì xử lý khác. Mục đích lấy nó ra là để mình tính coi nó phân trang đủ số trang hay chưa.

- Và mình dùng vòng lặp FOR là để nó duyệt từng page theo thứ tự 1 đến tổng số trang mà mình tính bước trên. Cách khác là mình có thể lấy theo findElements của cái số trang đó rồi duyệt cũng được. Nhưng mà cái cốt lỗi vẫn phải nắm được nó tối đa bao nhiêu và khi nào dừng nhé.


Xử lý phân trang trên Data Table trong Selenium Java | Anh Tester


Khi mỗi lần chuyển trang thì nó thay đổi mấy con số ở phần Info dưới bảng. Có thể check nó luôn.

Xử lý phân trang trên Data Table trong Selenium Java | Anh Tester

An note luôn trong mấy dòng code trên hong biết có rõ chưa ta. Nếu chưa ok thì liên hệ An trong nhóm nhé !!


Cộng đồng Automation Testing Việt Nam

🌱 Facebook Fanpage: Anh Tester
🌱 Telegram
Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

  • Anh Tester

    Đường dẫu khó chân vẫn cần bước đi
    Đời dẫu khổ tâm vẫn cần nghĩ thấu


Cộng đồng Automation Testing Việt Nam:

🌱 Telegram Automation Testing:   Cộng đồng Automation Testing
🌱 
Facebook Group Automation: Cộng đồng Automation Testing Việt Nam
🌱 
Facebook Fanpage: Cộng đồng Automation Testing Việt Nam - Selenium
🌱 Telegram
Manual Testing:   Cộng đồng Manual Testing
🌱 
Facebook Group Manual: Cộng đồng Manual Testing Việt Nam

Chia sẻ kiến thức lên trang

Bạn có thể đăng bài để chia sẻ kiến thức, bài viết của chính bạn lên trang Anh Tester Blog

Danh sách bài học