Tư duy dự án: Kiểm thử hỗn hợp từ khóa + dữ liệu
- Chìa khóa để tự động hóa Mini Program WeChat trên nền tảng Android là: chuyển đổi webview
- Đối với ứng dụng WeChat, quá trình chuyển đổi từ NATIVE sang webview
Thông tin phiên bản kiểm thử
- Phiên bản WeChat: 7.0.21
- Android: 7.0
- Phụ thuộc appium: 6.1.0
- Phụ thuộc testng: 6.14.3
Cấu hình khởi tạo thực thể
Cấu hình tham số như sau:
Quá trình liên quan đến việc đặt sự tương thích giữa phiên bản webview tích hợp của WeChat và chromedriver:
Bước 1: Xem thông tin phiên bản webview WeChat
Sử dụng công cụ uc-devtools để xem
Link tải uc-devtools:
https://pan.baidu.com/s/1GA3EPDz0GD3IyXUsgU8Z3g Mã提取码: 3lpg
Link tải công cụ scrcpy:
https://pan.baidu.com/s/1If7q_empeZgXWVXU0v8rIw Mã提取码: 3hi9
Sau khi tải về, mở công cụ và kết nối thiết bị thật với scrcpy để mở WeChat, lúc này sẽ hiển thị phiên bản chromedriver của WeChat:
Từ hình trên, ta thấy chromedriver, truy cập trang chủ chromedriver để tải phiên bản tương ứng
Sau khi tải, đặt vào thư mục resources, xem đường dẫn cấu hình như hình trên.
Bước 2: Bây giờ có thể sử dụng bình thường để xem các yếu tố web:
Bước 2: Cấu hình tham số setCapability
(Vấp ngã - cần xem trước context chuyển đổi của mini program WeChat, có thể xem bằng phương pháp sau):
Yếu tố quan trọng nhất là: options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
Sử dụng phương pháp driver.getContextHandles() để lấy tất cả các handle sau khi chuyển từ ứng dụng WeChat sang mini program, cấu hình vào tham số khởi động.
Cấu chi tiết như sau:
// Tham chiếu tham số cấu hình
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("platformName", platformName);
capabilities.setCapability("appPackage", appPackage);
capabilities.setCapability("appActivity", appActivity);
capabilities.setCapability("automationName", automationName);
capabilities.setCapability("deviceName", deviceName);
capabilities.setCapability("chromedriverExecutable", chromePath);
capabilities.setCapability("platformVersion", "7.0");
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("noReset", true);
// Không ký lại apk
capabilities.setCapability("resetKeyboard", true);
// Hỗ trợ cấu hình tự động hóa ứng dụng nhân X5
capabilities.setCapability("recreateChromeDriverSessions", true);
/**
* ChromeOptions được sử dụng để tùy chọn khởi động, vì trong appium khi chuyển đổi context để nhận diện webview,
* nhận diện webview của com.tencent.mm:toolsmp thành webview của com.tencent.mm.
* Vì vậy để tránh vấn đề này, thêm androidProcess: com.tencent.mm:toolsmp
*/
ChromeOptions options = new ChromeOptions();
/**
* Đây là phần rất quan trọng >>
* ChromeOptions được sử dụng để tùy chọn khởi động, vì trong appium khi chuyển đổi context để nhận diện webview,
* nhận diện webview của com.tencent.mm:toolsmp thành webview của com.tencent.mm.
* Vì vậy để tránh vấn đề này, thêm tên androidProcess: lấy tất cả context bằng driver.getContextHandles(),
* ở đây mình lấy được là com.tencent.mm:appbrand0
*/
options.setExperimentalOption("androidProcess", "com.tencent.mm:appbrand0");
capabilities.setCapability(ChromeOptions.CAPABILITY, options);
// Khởi tạo sẽ mặc định mở trình duyệt chrome, cần đặt Browser thành rỗng
capabilities.setBrowserName("");
// Mỗi lần khởi động sẽ ghi đè session, nếu không thì lần chạy thứ hai sẽ báo lỗi không thể tạo session mới
capabilities.setCapability("sessionOverride", true);
URL url = null;
try {
url = new URL("http://127.0.0.1:4723/wd/hub");
} catch (MalformedURLException e) {
e.printStackTrace();
}
driver = new AndroidDriver(url, capabilities);
Logic triển khai chính
1. Truy cập Mini Program
Trên mạng nhiều người nói cần vào mini program qua chức năng tìm kiếm trong ứng dụng WeChat, nhưng với phiên bản trải nghiệm của mini program chắc chắn không thể tìm thấy được. Vì vậy, phương pháp đơn giản nhất để vào mini program trải nghiệm được kiểm thử là: kéo xuống khung WeChat + nhấp vào tọa độ của mini program.
Lần đầu vào mini program đều sẽ hiển thị trong danh sách mini program, vị trí mới nhất luôn là đầu tiên.
Bật cài đặt [Vị trí con trỏ] trên điện thoại để định vị tọa độ của mini program
Phương pháp nhấp tọa độ như sau:
public void tapByCoordinates(AndroidDriver driver, int x, int y) {
// Thiết lập thời gian chờ hiển thị 10 giây
wait = new WebDriverWait(driver, 20);
// Nhấp tọa độ, nhập tọa độ, sau đó release() giải phóng điểm tọa độ, sử dụng perform() để thực hiện chuỗi thao tác action
action = new TouchAction(driver).tap(PointOption.point(x, y)).release().perform();
}
2. Triển khai mã - sau khi chuyển đổi webview thành công, có thể sử dụng thời gian chờ hiển thị để giải quyết vấn đề tải phần tử
// Kéo xuống trong WeChat
swipeToDown(driver);
// Nhấp vào mini program được kiểm thử, nhấp qua tọa độ
tapByCoordinates(driver, 190, 673);
// Chuyển đổi trang webview
// Lấy tất cả các contexts, và cấu hình trong tham số khởi động
System.out.println("Tất cả các contexts: " + driver.getContextHandles());
// Chuyển sang context webview tương ứng của mini program
driver.context("WEBVIEW_com.tencent.mm:appbrand0");
System.out.println("Chuyển context thành công!");
// Lấy tất cả các handles
Set<String> windowHandles = driver.getWindowHandles();
System.out.println("Tất cả các windowHandles: " + windowHandles);
for (String handle : windowHandles) {
System.out.println("Chuyển đến windowHandle tương ứng: " + handle);
driver.switchTo().window(handle);
String strTip = "Khóa học hot Internet";
if (driver.getPageSource().contains(strTip)) {
// Đã tìm thấy cửa sổ tương ứng, thoát vòng lặp
break;
} else {
System.out.println("Tìm kiếm: " + strTip + " trang có thể không chứa thông tin văn bản này");
}
}
// Kéo lên thao tác
swipeToUp(driver);
// Vào thao tác định vị phần tử web bình thường
// Nhấp vào bài kiểm tra mô phỏng
UIElementUtil.clickButton("Tencent Classroom", "Category", driver);
Thông tin định vị phần tử được duy trì bởi xml
Từ nhật ký có thể thấy đã chuyển sang webview và định vị thành công phần tử để nhấp:
Tất cả các contexts: [NATIVE_APP, WEBVIEW_com.tencent.mm:appbrand0, WEBVIEW_com.tencent.mm:appbrand2] Chuyển context thành công! Tất cả các windowHandles: [CDwindow-ABCE2F2B94ED5F6A2BF2153F6CFEFF21, CDwindow-FA78683E0B1150082058BBC8EFF73001] Chuyển đến windowHandle tương ứng: CDwindow-ABCE2F2B94ED5F6A2BF2153F6CFEFF21 Tìm kiếm: Khóa học hot Internet trang có thể không chứa thông tin văn bản này Chuyển đến windowHandle tương ứng: CDwindow-FA78683E0B1150082058BBC8EFF73001 INFO 2020-12-14 10:24:22 [main] com.iappium.utils.UIElementUtil.clickButton(UIElementUtil.java:186) - [Category] sự kiện nhấp này tốn thời gian: 445ms
Công cụ và lớp UIElementUtil
Lớp công cụ UIElementUtil là thanh công cụ từ khóa được đóng gói, duy trì định vị phần tử qua xml (tương đương với từ khóa kiểm thử tự động hóa UI), do UIElementUtil sử dụng dom4j để phân tích tệp xml, nội dung nhiều, nếu cần xem có thể chuyển đến mã nguồn dự án iappium4j dự án app + mini program tự động kiểm thử - mã nguồn