NỘI DUNG BÀI HỌC

✅Các hàm xử lý hành động automation trong Appium Java
✅Cách xử lý Input và Button
✅Cách xử lý Dropdown và Alert Message

✅Các hàm xử lý hành động automation trong Appium Java

Dưới đây là một số hàm xử lý hành động automation phổ biến trong Appium Java 2x, kèm theo ví dụ minh họa.

🔆Đối tượng Appium Driver cung cấp 2 hàm tìm kiếm element

- Tìm một phần tử: dùng hàm findElement. Trả về đối tượng WebElement.

Ví dụ:

WebElement usernameField = driver.findElement(AppiumBy.id("username_input"));

Trong khoá học này chúng ta thay thế driver thành DriverManager.getDriver() để sử dụng giá trị driver toàn cục hỗ trợ chạy parallel.


- Tìm nhiều phần tử: dùng hàm findElements. Trả về đối tượng List<WebElement>.

Ví dụ:

// Tìm tất cả các item trong một danh sách bằng XPath
List<WebElement> listItems = driver.findElements(AppiumBy.xpath("//android.widget.ListView/android.view.View"));

Sử dụng vòng lặp for hoặc for-each để duyệt qua từng WebElement trong danh sách và thực hiện hành động.

// Sử dụng vòng lặp for-each
for (WebElement element : listItems) {
    String text = element.getText();
    System.out.println("Văn bản của phần tử: " + text);
    // Thực hiện hành động khác trên element nếu cần
}

// Sử dụng vòng lặp for với index
for (int i = 0; i < listItems.size(); i++) {
    WebElement element = listItems.get(i);
    String text = element.getText();
    System.out.println("Phần tử thứ " + (i + 1) + ": " + text);
    // Thực hiện hành động khác trên element nếu cần
}



🔆Đối tượng WebElement cung cấp nhiều hàm xử lý hành động trên element

1. click()

Mô tả: Hàm click() được sử dụng để thực hiện hành động nhấp (tap) lên một phần tử trên màn hình ứng dụng. Đây là hành động cơ bản nhất trong automation, thường dùng để tương tác với nút, liên kết, hoặc các phần tử có thể nhấp khác.

Ví dụ:

// Tìm phần tử bằng ID (ví dụ: nút "Đăng nhập")
WebElement loginButton = driver.findElement(AppiumBy.id("login_button"));

// Thực hiện hành động click lên nút "Đăng nhập"
loginButton.click();

 

2. sendKeys(String value)

Mô tả: Hàm sendKeys() được dùng để nhập văn bản vào một trường văn bản (ví dụ: ô nhập liệu username, password). value là chuỗi văn bản bạn muốn nhập.

Đối tượng element thường là android.widget.EditText

Ví dụ:

// Tìm trường nhập liệu username bằng ID
WebElement usernameField = driver.findElement(AppiumBy.id("username_field"));

// Nhập username vào trường
usernameField.sendKeys("testuser");

// Tìm trường nhập liệu password bằng Accessibility ID
WebElement passwordField = driver.findElement(AppiumBy.accessibilityId("passwordInput"));

// Nhập password vào trường
passwordField.sendKeys("password123");

 

3. clear()

Mô tả: Hàm clear() dùng để xóa nội dung hiện tại trong một trường văn bản trước khi nhập nội dung mới. Thường được sử dụng trước khi sendKeys() để đảm bảo trường nhập liệu trống.

Ví dụ:

// Tìm trường nhập liệu tìm kiếm bằng XPath
WebElement searchField = driver.findElement(AppiumBy.xpath("//android.widget.EditText[@resource-id='search_bar']"));

// Xóa nội dung hiện tại trong trường tìm kiếm
searchField.clear();

// Nhập từ khóa tìm kiếm mới
searchField.sendKeys("Appium tutorial");

 

4. isDisplayed()

Mô tả: Hàm isDisplayed() kiểm tra xem một phần tử có hiển thị trên màn hình hay không. Hàm này trả về true nếu phần tử hiển thị và false nếu không. Rất hữu ích để kiểm tra trạng thái hiển thị của các phần tử UI.

Ví dụ:

// Tìm phần tử thông báo lỗi bằng class name
WebElement errorToast = driver.findElement(AppiumBy.className("android.widget.Toast"));

// Kiểm tra xem thông báo lỗi có hiển thị hay không
boolean isErrorDisplayed = errorToast.isDisplayed();

if (isErrorDisplayed) {
    System.out.println("Thông báo lỗi hiển thị!");
} else {
    System.out.println("Thông báo lỗi không hiển thị.");
}

 

5. isEnabled()

Mô tả: Hàm isEnabled() kiểm tra xem một phần tử có đang ở trạng thái kích hoạt (enabled) hay không. Ví dụ, một nút có thể bị vô hiệu hóa (disabled) cho đến khi một điều kiện nào đó được đáp ứng. Hàm này trả về true nếu phần tử được kích hoạt và false nếu không.

Ví dụ:

// Tìm nút "Tiếp theo" bằng ID
WebElement nextButton = driver.findElement(AppiumBy.id("next_button"));

// Kiểm tra xem nút "Tiếp theo" có được kích hoạt hay không
boolean isNextButtonEnabled = nextButton.isEnabled();

if (isNextButtonEnabled) {
    System.out.println("Nút 'Tiếp theo' được kích hoạt.");
} else {
    System.out.println("Nút 'Tiếp theo' bị vô hiệu hóa.");
}

 

6. getText()

Mô tả: Hàm getText() lấy văn bản hiển thị của một phần tử. Hàm này trả về một chuỗi chứa văn bản của phần tử đó. Thường được dùng để xác minh nội dung hiển thị trên UI.

Ví dụ:

// Tìm tiêu đề trang bằng ID
WebElement pageTitle = driver.findElement(AppiumBy.id("page_title"));

// Lấy văn bản tiêu đề trang
String titleText = pageTitle.getText();

System.out.println("Tiêu đề trang là: " + titleText);

 

7. getAttribute(String name)

Mô tả: Hàm getAttribute() trả về giá trị của một thuộc tính cụ thể của phần tử. name là tên thuộc tính bạn muốn lấy giá trị (ví dụ: "content-desc", "resource-id", "class").

Ví dụ:

// Tìm phần tử hình ảnh logo bằng XPath
WebElement logoImage = driver.findElement(AppiumBy.xpath("//android.widget.ImageView[@content-desc='App Logo']"));

// Lấy giá trị thuộc tính "content-desc"
String logoDescription = logoImage.getAttribute("content-desc");
System.out.println("Mô tả logo: " + logoDescription);

// Lấy giá trị thuộc tính "class"
String logoClass = logoImage.getAttribute("class");
System.out.println("Class của logo: " + logoClass);

 

8. getLocation()getSize()

Mô tả:

  • getLocation(): Trả về vị trí (tọa độ x, y) của phần tử trên màn hình.
  • getSize(): Trả về kích thước (chiều rộng và chiều cao) của phần tử.

Cả hai hàm này trả về đối tượng Point (cho getLocation()) và Dimension (cho getSize()) chứa thông tin vị trí và kích thước.

Ví dụ:

// Tìm nút bằng Accessibility ID
WebElement button = driver.findElement(AppiumBy.accessibilityId("ActionButton"));

// Lấy vị trí của nút
Point location = button.getLocation();
System.out.println("Vị trí nút (x, y): " + location.getX() + ", " + location.getY());

// Lấy kích thước của nút
Dimension size = button.getSize();
System.out.println("Kích thước nút (width, height): " + size.getWidth() + ", " + size.getHeight());

 

Lưu ý quan trọng về Appium 2x và Actions API:

  • Actions API (W3C Actions): Appium 2x chuyển sang sử dụng W3C Actions API, thay thế cho TouchActionMultiTouchAction của phiên bản cũ. Cách xử lý vuốt và kéo thả sẽ được sử dụng PointerInputSequence để tạo các chuỗi hành động.
  • Duration: Khi sử dụng Actions API, bạn cần chú ý đến Duration để kiểm soát tốc độ và thời gian của các hành động (ví dụ: thời gian vuốt, thời gian giữ ngón tay).
  • Tìm kiếm phần tử: Trước khi thực hiện bất kỳ hành động nào, bạn cần tìm kiếm phần tử mục tiêu bằng các locator strategies (ID, XPath, Accessibility ID, v.v.) sử dụng AppiumBy.


Đây chỉ là một số hàm xử lý hành động cơ bản
và phổ biến. Appium Java 2x cung cấp nhiều khả năng hơn nữa để tương tác với ứng dụng di động của bạn. Hãy tham khảo tài liệu chính thức của Appium và Selenium để khám phá thêm các hàm và kỹ thuật khác.

https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebElement.html

✅Cách xử lý Input và Button

Để xử lý các ô Input thì chúng ta dùng hàm clear(), click() và sendKeys(). Khi dùng hàm sendKeys() không được thì kết hợp dùng hàm click() trước rồi đến sendKeys() sau.

Để xử lý các nút Button thì chúng ta dùng hàm click().

Ví dụ 1: code Login trên app demo MyDemoApp (Sauce Labs):

import com.anhtester.common.BaseTest;
import com.anhtester.drivers.DriverManager;
import io.appium.java_client.AppiumBy;
import org.testng.annotations.Test;

public class DemoInputButton extends BaseTest {
    @Test
    public void testLoginMyDemoApp() {
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("View menu")).click();
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Login Menu Item")).click();
        DriverManager.getDriver().findElement(AppiumBy.xpath("//android.widget.EditText[@resource-id=\"com.saucelabs.mydemoapp.android:id/nameET\"]")).clear();
        DriverManager.getDriver().findElement(AppiumBy.xpath("//android.widget.EditText[@resource-id=\"com.saucelabs.mydemoapp.android:id/nameET\"]")).sendKeys("bod@example.com");
        DriverManager.getDriver().findElement(AppiumBy.xpath("//android.widget.EditText[@resource-id=\"com.saucelabs.mydemoapp.android:id/passwordET\"]")).clear();
        DriverManager.getDriver().findElement(AppiumBy.xpath("//android.widget.EditText[@resource-id=\"com.saucelabs.mydemoapp.android:id/passwordET\"]")).sendKeys("10203040");
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Tap to login with given credentials")).click();
    }
}

 

Ví dụ 2: code Login trên app demo Taurus (Anh Tester - Flutter): dùng bản app release (không dùng bản debug)

import com.anhtester.common.BaseTest;
import com.anhtester.common.BaseTestTaurusApp;
import com.anhtester.drivers.DriverManager;
import io.appium.java_client.AppiumBy;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;

public class DemoInputButton extends BaseTestTaurusApp {
    
    @Test
    public void testLoginTaurusApp() throws InterruptedException {
        Thread.sleep(2000);
        WebElement inputUsername = DriverManager.getDriver().findElement(AppiumBy.xpath("//android.view.View[@content-desc=\"Mobile App Flutter Beta\"]/following-sibling::android.widget.EditText[1]"));
        inputUsername.click();
        inputUsername.sendKeys("admin");
        Thread.sleep(1000);
        WebElement inputPassword = DriverManager.getDriver().findElement(AppiumBy.xpath("//android.view.View[@content-desc=\"Mobile App Flutter Beta\"]/following-sibling::android.widget.EditText[2]"));
        inputPassword.click();
        inputPassword.sendKeys("admin");

        DriverManager.getDriver().findElement(AppiumBy.xpath("//android.widget.Button[@content-desc=\"Sign in\"]")).click();

        Thread.sleep(2000);
        WebElement menuMenu = DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Menu"));
        if(menuMenu.isDisplayed()){
            System.out.println("Login success.");
        }else {
            System.out.println("Login failed.");
        }
    }
}



✅Cách xử lý Dropdown và Alert Message

Xử lý dropdown trên Mobile app chúng ta sử dụng hàm click() để click chọn item hoặc kết hợp hàm sendKeys() để search dữ liệu sau đó click chọn item trong dropdown list.

Thực hành trên app demo Taurus luôn nhé.

import com.anhtester.common.BaseTestTaurusApp;
import com.anhtester.drivers.DriverManager;
import io.appium.java_client.AppiumBy;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;

public class DemoDropdownAlertMessage extends BaseTestTaurusApp {

    @Test(priority = 1)
    public void testLoginTaurusApp() throws InterruptedException {
        Thread.sleep(2000);
        WebElement inputUsername = DriverManager.getDriver().findElement(AppiumBy.xpath("//android.view.View[@content-desc=\"Mobile App Flutter Beta\"]/following-sibling::android.widget.EditText[1]"));
        inputUsername.click();
        inputUsername.sendKeys("admin");
        Thread.sleep(1000);
        WebElement inputPassword = DriverManager.getDriver().findElement(AppiumBy.xpath("//android.view.View[@content-desc=\"Mobile App Flutter Beta\"]/following-sibling::android.widget.EditText[2]"));
        inputPassword.click();
        inputPassword.sendKeys("admin");

        DriverManager.getDriver().findElement(AppiumBy.xpath("//android.widget.Button[@content-desc=\"Sign in\"]")).click();

        Thread.sleep(2000);
        WebElement menuMenu = DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Menu"));
        if (menuMenu.isDisplayed()) {
            System.out.println("Login success.");
        } else {
            System.out.println("Login failed.");
        }
    }

    @Test(priority = 2)
    public void testSortTables() throws InterruptedException {
        testLoginTaurusApp();
        //Navigate to config to download database demo
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Config")).click();
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Server database")).click();
        Thread.sleep(2000);
        DriverManager.getDriver().findElement(AppiumBy.xpath("//android.view.View[contains(@content-desc,'Data 1')]/android.widget.Button")).click();
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Replace")).click();
        Thread.sleep(1000);

        //Handle Alert Message, check displayed hoặc getText/getAttribute để kiểm tra nội dung message
        if(DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Downloaded")).isDisplayed()){
            System.out.println("Database demo downloaded.");
        }else {
            System.out.println("Warning!! Can not download Database demo.");
        }
        Thread.sleep(2000);
        //Click Back and click Table Management menu to sort data from A-Z to Z-A
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("Back")).click();
        DriverManager.getDriver().findElement(AppiumBy.xpath("//android.widget.Button[contains(@content-desc,\"Tables management\")]")).click();
        Thread.sleep(1000);
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("By name A-Z")).click();
        Thread.sleep(1000);
        DriverManager.getDriver().findElement(AppiumBy.accessibilityId("By name Z-A")).click();
        Thread.sleep(1000);
        WebElement firstItem = DriverManager.getDriver().findElement(AppiumBy.xpath("//android.widget.ScrollView/android.view.View[1]"));
        System.out.println("First Item: " + firstItem.getAttribute("content-desc"));
    }
}

Teacher

Teacher

Anh Tester

Software Quality Engineer

Đườ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ẻ khóa học lên trang

Bạn có thể đăng khóa học của chính bạn lên trang Anh Tester để kiếm tiền

Danh sách bài học