12/08/2018, 15:41

Tương tác Mobile elements trong Appium

Định vị một Element trong ứng dụng Một phần quan trọng khi viết script là bạn cần phải định vị được các đối tượng test (elements), đó có thể là textbox, button, view,... và đương nhiên có rất nhiều cách khác nhau mà bạn có thể sử dụng để tìm các elements, ở đây mình muốn giới thiệu một số ...

Định vị một Element trong ứng dụng

Một phần quan trọng khi viết script là bạn cần phải định vị được các đối tượng test (elements), đó có thể là textbox, button, view,... và đương nhiên có rất nhiều cách khác nhau mà bạn có thể sử dụng để tìm các elements, ở đây mình muốn giới thiệu một số phương pháp cơ bản nhất và hay dùng nhất được dùng để xác định một phần từ. Để định ví các element trong ứng dụng mobile, Appium cung cấp một số loại định vị cụ thể hoặc phù hợp với từng loại platform di động khác nhau như Android hay iOS, đó là: định vị qua Class name, định vị qua id, định vị qua Xpath.

Tìm phần tử bằng Class Name

Appium hỗ trợ tìm một hoặc nhiều phần tử dựa trên tên class. Ví dụ:

#python
driver.find_element_by_class_name('android.widget.DatePicker')

Tìm phần tử bằng Xpath

XPath là từ viết tắt của XML Path language. Nó là một ngôn ngữ truy vấn để chọn các nút của một XML document. Xpath dựa trên một cây đại diện của XML document và cung cấp khả năng điều hướng xung quanh cây bằng cách chọn các nút dựa nhiều tiêu chí. Trên GUI của ứng dụng mobile cũng sử dụng dạng xml nên cũng có thể định vị phần tử thông qua xpath tương tự trên web.

#python
driver.find_element_by_xpath('//UIAApplication[1]/UIAWindow[1]/UIATextField[1]')

Tìm phần tử bằng ID

Sử dụng bộ định vị id, nếu tìm được id phù hợp sẽ trả về vị trí của phần tử, nếu không có phần từ phù hợp với id sẽ xuất hiện NoSuchElementException

Ví dụ: Gọi method findElement sử dụng thuộc tính name để xác định vị trí của các ô nhập liệu username và password, và thuộc tính id để xác định vị trí phần tử form.

import org.openqa.selenium.By; 
import org.openqa.selenium.WebElement; 

WebElement emailInput = driver.findElement(By.id("fbemail"));

Mách bạn: Cách tốt nhất khi sử dụng các bộ định vị là định vị qua id bởi nó là bộ định vị phần tử duy nhất, mỗi element chỉ có 1 id riêng. Class name và xpath chỉ nên được sử dụng khi ID không có sẵn, vì nhiều phần tử có thể có cùng tên lớp và việc sử dụng tìm kiếm toàn bộ bằng xpath có thể làm chậm các kiểm tra của bạn.

Tương tác với một element

Khi bạn đã xác định được các phần tử trên ứng dụng bạn muốn kiểm tra, bước tiếp theo là tương tác với chúng. Bạn thực hiện một hành động trên một phần tử bằng cách gọi phương thức tương tác tương ứng mà với yêu cầu kiểm tra. WebElement cung cấp các phương thức tương tác cơ bản sau:

  • sendKeys: dùng cho việc nhập văn bản
  • clear: dùng để xóa văn bản đã nhập
  • submit: xử lý như một sự kiện click và gửi biểu mẫu

Ví dụ: Gọi method sendKeys để nhập văn bản vào trường username và password, sau đó gọi method submit để gửi biểu mẫu login.

emailInput.sendKeys("SauceIsAwesome@email.com");

emailInput.submit();

Chờ phản hồi từ ứng dụng

Khi bạn nhấn nút Submit , bạn phải đợi một hoặc hai giây để hành động của bạn đến được với máy chủ và để máy chủ trả lời lại trước khi bạn làm bất cứ điều gì khác. Nếu bạn đang cố gắng kiểm tra phản hồi và những gì xảy ra sau đó thì bạn cần phải xây dựng thời gian chờ đó trong kiểm tra của mình. Nếu không, thử nghiệm có thể thất bại vì các yếu tố được mong đợi cho bước tiếp theo đã không nạp vào trình duyệt. Có hai kỹ thuật cơ bản để dự đoán phản ứng của ứng dụng là Implicit Wait và Explicit Wait.

Implicit Waits Implicit Waits là thời gian chờ mặc định tối đa mà máy chủ Appium sẽ dùng để tìm một phần tử (nếu vẫn chưa tìm thấy phần tử ấy). Sử dụng Implicit Wait không phải là phương pháp tốt nhất vì thời gian phản hồi của ứng dụng khó có thể đoán trước được, do đó sử dụng Implicit Wait phải có hiểu biết rõ hơn về mặt kỹ thuật và hệ thống.

Trong ví dụ này sử dụng Implicit Waits để dự đoán phản hồi của driver, ở đây ta set thời gian chờ tối đa là 10 giây: driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Explicit Waits Explicit Waits là set thời gian chờ cho đến khi một điều kiện dự kiến xảy ra trên ứng dụng, hoặc cho đến khi hết thời gian chờ đợi tối đa.
Sử dụng Explicit, bạn phải tạo một đối tượng WebDriverWait với thời gian chờ tối đa, sau đó gọi phương thức until với một điều kiện dự kiến xảy ra.

import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.WebDriverWait; 

WebDriverWait wait = new WebDriverWait(driver, 10); WebElement messageElement = wait.until( ExpectedConditions.presenceOfElementLocated(By.id("loginResponse")) );

Ví dụ trên driver sẽ chờ đến khi tìm thấy phần tử "loginResponse" hoặc cho đến khi hết 10 giây thời gian chờ đợi tối đa

Note: Không nên mix giữa Implicit Wait và Explicit Wait Bạn không nên mix 2 loại này với nhau, bởi nó có thể tạo ra thời gian chờ không thể đoán trước. Ví dụ thiết lập một chờ đợi Implicit 10 giây và chờ đợi Explicit 15 giây, có thể gây ra một thời gian chờ xảy ra sau 20 giây.

Chạy kiểm tra và so sánh với kỳ vọng

Chạy các bài kiểm tra và xác nhận lại kết quả kiểm tra là mục đích cuối cùng của test script: nó được làm một cách hoàn toàn tự động để kiểm tra được chức năng và hiệu suất trong AUT mà không cần sự tương tác của con người.

Assertions

Assertions được dùng để so sánh giữa kết quả phản hồi thực tế và kết quả kỳ vọng của test case. Nó thường có tên bắt đầu với thuật ngữ assert, ví dụ "assertEquals" trong JUnit.

import junit.framework.Assert;
import junit.framework.TestCase;
 
WebElement messageElement     = driver.findElement(By.id("loginResponse"));
String message                 = messageElement.getText();
String successMsg             = "Welcome to foo. You logged in successfully.";
assertEquals (message, successMsg);

Ví dụ này dùng assertEquals để xác nhận rằng thông báo trả về đúng như kết quả mong đợi (successMsg)

Kết thúc kiểm tra

Sau chị chạy test, bạn sẽ cần kết thúc kiểm tra của bạn bằng cách gọi phương thức quit của WebDriver. Nó sẽ giải phóng các nguồn tài nguyên đã được sử dụng để đảm bảo các kiểm tra sau không bị ảnh hưởng bởi resources và trạng thái ứng dụng đã chạy trước đó. Có các phương pháp quit sau:

  • Đóng tất cả web browser, đóng tất cả các trang web
  • Đóng server WebDriver đang tương tác với trình duyệt web
  • Releases driver - biến số duy nhất của WebDriver.

Ví dụ:

driver.quit(); // đóng driver

Demo

Tổng hợp cho các bước bên trên, bạn tạo một class Java và đặt tên là "Example" và paste đoạn code này vào, đây là những gì các bạn đã biết ở trên và run thử nhé.

package com.yourcompany;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.android.AndroidDriver;
import java.net.MalformedURLException;
import java.net.URL;
import junit.framework.Assert;
public class SampleSauceTest {
     
    public static void  main() throws MalformedURLException {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("deviceName", "Samsung Galaxy S4 Emulator");
        capabilities.setCapability("platformVersion", "5.0.1");
        capabilities.setCapability("app", "app-test.apk");
        capabilities.setCapability("browserName", "");
        capabilities.setCapability("deviceOrientation", "portrait");
        capabilities.setCapability("appiumVersion", "1.5.1");
        WebDriver driver = new AndroidDriver<WebElement>( new URL("http://SAUCE_USERNAME:SAUCE_ACCESS_KEY@ondemand.saucelabs.com:80/wd/hub"), capabilities);
         
        WebElement emailInput = driver.findElement(By.id("fbemail"));
        emailInput.sendKeys("someone@email.com");
        assertEquals(emailInput.getText(), "someone@email.com");
         
        driver.quit();
    }
}

Nguồn: Getting Started with Appium

0