Chào các bạn đã đến với chủ đề tiếp theo của mình. Hôm nay, mình sẽ tiếp tục hướng dẫn các bạn cách xử lý với control Checkbox (Bạn thường thấy control này ở màn hình Login, chỗ Remember me ấy. Hoặc trong mấy bài test, mà câu trả lời là multi choice).
Về mặt code (dev), thì control này sẽ chia làm 2 loại:
- 1 là default checkbox
- 2 là custom checkbox. Những trang web bây giờ thường dùng 1 số frameword mới như angular, react … Mà những loại này thì đa số nó là custom checkbox. Ví dụ như hình bên dưới:
Nhìn trên UI thì nó hoàn toàn giống nhau, chỉ khi nào bạn vào Developer Tool (F12), trỏ vào đúng cái control đó thì bạn mới có thể biết được cái checkbox đang dùng đó là loại nào. Lúc này bạn chỉ cần tìm xpath tương ứng với control đó là có thể thao tác với nó được.
Với control này, thì thường sẽ có những action chính như sau (item 4, 5, 6 thì hơi nâng cao xíu, đòi hỏi các bạn phải có 1 xíu kiến thức về lập trình) :
- Single check
- Uncheck
- Kiểm tra trạng thái của checkbox đó: check/uncheck
- Check all checkbox
- Check random check box
- Check theo 1 danh sách có sẵn
Nào, mình cùng bắt đầu nhé.
Nội dung
1. Các hàm sử dụng cho control Checkbox
1.1. Hàm click()
- Hàm này dùng để giả lập hành động của user click vào button/checkbox/radio button/link
- Lưu ý: trước khi check vào control checkbox, chúng ta nên kiểm tra trạng thái của của checkbox đó trước. Nếu nó đã check rồi, thì bạn không click vào nó nữa (hoặc ngược lại)
- Ví dụ:
driver.findElement(By.xpath("//span[text()='Checked']/preceding-sibling::div/input")).click();
1.2. Hàm isSelected()
- Hàm này dùng để kiểm tra control Checkbox/Radio xem có đang được select hay không.
- Giá trị trả về kiểu boolean. Nếu kết quả trả về true nghĩa là checkbox/radio đang được check/select, ngược lại sẽ trả giá trị là false.
- Ví dụ:
Boolean isSelected = driver.findElement(By.xpath("//span[text()='Checked']/preceding-sibling::div/input")).isSelected();
2. Demo
2.1. Demo 1: Check/uncheck all checkbox
- Ví dụ mình có list checkbox như hình bên dưới:
- Link demo: https://automationfc.github.io/multiple-fields/
- Có 2 cách để check all checkbox trong hình trên:
- 1. Bắt hết tất cả xpath/cssSelector của từng control theo label trên và select từng checkbox-> mặc dù cách này vẫn hoạt động được nhưng mình không khuyến khích xài nó vì nếu dùng sẽ làm cho code của bạn phình ra. Nếu 1 ngày nào đó, develper change cái label hiện tại sang label khác, thì bạn phải update lại tất cả các xpath
- 2. Get tất cả các control lên, duyệt qua vòng lặp for để check all checkbox trên -> cách này bạn sẽ code gọn hơn rất nhiều
- Bây giờ mình sẽ bắt đầu implement nhé.
@Test
public void TC_01_Checkbox_Check_Uncheck_All() {
driver.get("https://automationfc.github.io/multiple-fields/");
// Find list element of checkbox
List<WebElement> lst_Checkbox = driver.findElements(By.cssSelector(".form-checkbox-item .form-checkbox"));
//Check all checkbox
for (WebElement checkbox: lst_Checkbox) {
if(!checkbox.isSelected()) {
checkbox.click();
}
sleepInSecond(1);
}
// Verify checkbox is checked
for (WebElement checkbox: lst_Checkbox) {
boolean isChecked = checkbox.isSelected();
Assert.assertTrue(isChecked);
}
sleepInSecond(5);
// Uncheck all checkbox
for (WebElement checkbox: lst_Checkbox) {
if(checkbox.isSelected()) {
checkbox.click();
}
sleepInSecond(1);
}
// Verify checkbox is unchecked
for (WebElement checkbox: lst_Checkbox) {
boolean isChecked = checkbox.isSelected();
Assert.assertFalse(isChecked);
}
}
2.2. Demo 2: Check random checkbox
- Cũng tương tự như demo trên, đầu tiên, mình sẽ find tất cả các checkbox control. Sau đó, mình sẽ viết 1 hàm get random. Bạn sẽ dùng danh sách random đó để xử lý
@Test
public void checkRandomCheckbox(){
driver.get("https://automationfc.github.io/multiple-fields/");
// Find list element of checkbox
List<WebElement> lst_Checkbox = driver.findElements(By.cssSelector(".form-checkbox-item .form-checkbox"));
// Get all label
List<String> lstLabel = new ArrayList<>();
for(WebElement item: lst_Checkbox){
String itemText = item.getAttribute("value");
lstLabel.add(itemText);
}
// Get random 10 items in checkbox
List<String> randomListCheckbox = getRandomListString(lstLabel, 10);
// Duyệt qua từng checkbox control
for(WebElement item: lst_Checkbox){
String itemText = item.getAttribute("value");
Boolean isCheck = item.isSelected();
if(randomListCheckbox.contains(itemText) && !isCheck){
item.click();
sleepInSecond(1);
}
}
}
public static List<String> getRandomListString(List<String> lstData, int numOfItems){
Random rand = new Random();
List<String> getListRandom = new ArrayList<>();
List<String> lstTemp = new ArrayList<>();
lstTemp.addAll(lstData);
for (int i = 0; i < numOfItems; i++){
int index = rand.nextInt(lstTemp.size());
getListRandom.add(lstTemp.get(index));
lstTemp.remove(lstTemp.get(index));
}
return getListRandom;
}
2.3. Demo 3: Check theo 1 danh sách có sẵn
- Case này tương tự với cách làm trên, chỉ khác là bây giờ mình không cần phải get random label nữa mà sẽ định nghĩa sẵn danh sách. Hiện tại mình đang định nghĩa trên code. Khi làm thực tế, bạn nên định nghĩa danh sách này trong data file, có thể là excel, csv. Sau đó bạn viết thêm function để đọc nó lên. Mục đích là sau này khi developer có thay đổi về label checkbox, bạn chỉ cần update lại data file tương ứng là có thể chạy được mà ko cần update code.
@Test
public void checkWithProvidedData(){
driver.get("https://automationfc.github.io/multiple-fields/");
// Khoi tao list checkbox
String[] arr = { "Anemia", "Arthritis", "Heart Attack" };
List<String> randomCheckBox = Arrays.asList(arr);
// Find list element of checkbox
List<WebElement> lst_Checkbox = driver.findElements(By.cssSelector(".form-checkbox-item .form-checkbox"));
// Check to checkbox with provided data
for(WebElement item: lst_Checkbox){
String itemText = item.getAttribute("value");
Boolean isCheck = item.isSelected();
if(randomCheckBox.contains(itemText) && !isCheck){
item.click();
sleepInSecond(1);
}
}
}
Here is full code:
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class Checkbox {
WebDriver driver;
@BeforeClass
public void beforeClass() {
driver = new ChromeDriver();
driver.manage().window().maximize();
}
@Test
public void TC_01_Checkbox_Check_Uncheck_All() {
driver.get("https://automationfc.github.io/multiple-fields/");
// Find list element of checkbox
List<WebElement> lst_Checkbox = driver.findElements(By.cssSelector(".form-checkbox-item .form-checkbox"));
//Check all checkbox
for (WebElement checkbox: lst_Checkbox) {
if(!checkbox.isSelected()) {
checkbox.click();
}
sleepInSecond(1);
}
// Verify checkbox is checked
for (WebElement checkbox: lst_Checkbox) {
boolean isChecked = checkbox.isSelected();
Assert.assertTrue(isChecked);
}
sleepInSecond(5);
// Uncheck all checkbox
for (WebElement checkbox: lst_Checkbox) {
if(checkbox.isSelected()) {
checkbox.click();
}
sleepInSecond(1);
}
// Verify checkbox is unchecked
for (WebElement checkbox: lst_Checkbox) {
boolean isChecked = checkbox.isSelected();
Assert.assertFalse(isChecked);
}
}
@Test
public void checkRandomCheckbox(){
driver.get("https://automationfc.github.io/multiple-fields/");
// Find list element of checkbox
List<WebElement> lst_Checkbox = driver.findElements(By.cssSelector(".form-checkbox-item .form-checkbox"));
// Get all label
List<String> lstLabel = new ArrayList<>();
for(WebElement item: lst_Checkbox){
String itemText = item.getAttribute("value");
lstLabel.add(itemText);
}
// Get random 10 items in checkbox
List<String> randomListCheckbox = getRandomListString(lstLabel, 10);
// Duyệt qua từng checkbox control
for(WebElement item: lst_Checkbox){
String itemText = item.getAttribute("value");
Boolean isCheck = item.isSelected();
if(randomListCheckbox.contains(itemText) && !isCheck){
item.click();
sleepInSecond(1);
}
}
}
@Test
public void checkWithProvidedData(){
driver.get("https://automationfc.github.io/multiple-fields/");
// Khoi tao list checkbox
String[] arr = { "Anemia", "Arthritis", "Heart Attack" };
List<String> randomCheckBox = Arrays.asList(arr);
// Find list element of checkbox
List<WebElement> lst_Checkbox = driver.findElements(By.cssSelector(".form-checkbox-item .form-checkbox"));
// Check to checkbox with provided data
for(WebElement item: lst_Checkbox){
String itemText = item.getAttribute("value");
Boolean isCheck = item.isSelected();
if(randomCheckBox.contains(itemText) && !isCheck){
item.click();
sleepInSecond(1);
}
}
}
public static List<String> getRandomListString(List<String> lstData, int numOfItems){
Random rand = new Random();
List<String> getListRandom = new ArrayList<>();
List<String> lstTemp = new ArrayList<>();
lstTemp.addAll(lstData);
for (int i = 0; i < numOfItems; i++){
int index = rand.nextInt(lstTemp.size());
getListRandom.add(lstTemp.get(index));
lstTemp.remove(lstTemp.get(index));
}
return getListRandom;
}
public void sleepInSecond(long timeInSecond) {
try {
Thread.sleep(timeInSecond * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@AfterClass
public void afterClass() {
driver.quit();
}
}
Kết quả:
3. Kết
Như vậy chúng ta đã tìm hiểu qua 1 số hàm xử lý cho control checkbox. Cảm ơn các bạn đã theo dõi bài viết của mình. Chúc các bạn thành công. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.