Appium Khả năng mong muốn cho Android giả lập

⚡ Tóm tắt thông minh

Các khả năng mong muốn là các cặp khóa-giá trị. Appium Khi mở phiên làm việc, máy khách gửi thông tin cho máy chủ về nền tảng, thiết bị, trình điều khiển và ứng dụng mà bài kiểm tra tự động nên được thực hiện.

  • ???? Phiên họptract: Các quyền hạn được truyền tải trong phần thân JSON của yêu cầu tạo phiên mới và không thể thay đổi sau đó.
  • ☑️ Android yếu tố cần thiết: `appPackage` và `appActivity` đặt tên cho ứng dụng và màn hình. Appium nên khởi chạy.
  • Các biến thể chờ đợi: appWaitPackage và appWaitActivity bao gồm các màn hình chờ xuất hiện trước khi vào ứng dụng chính.
  • 🧪 Appium Tiền tố 2: Mọi chức năng không chuẩn hiện nay đều cần tiền tố appium:vendor, nếu không máy chủ sẽ từ chối.
  • 🛠️ hiện đại Java khách hàng: DesiredCapabilities đã được thay thế bằng UiAutomator2Options và XCUITestOptions. Selenium 4.
  • 📊 Tìm kiếm giá trị: Lệnh `adb dumpsys query` hoặc lớp `PackageManager` sẽ tiết lộ tên gói và hoạt động.

Appium các cặp khóa-giá trị khả năng mong muốn cho một Android phiên giả lập

Khả năng mong muốn là gì

'Các khả năng mong muốn' giúp chúng ta điều chỉnh hành vi của máy chủ trong quá trình tự động hóa. Trong Appium Nó là một bảng băm, hay một cặp khóa-giá trị, được sử dụng để gửi lệnh đến... Appium máy chủ, nơi mọi lệnh của máy khách được chạy trong ngữ cảnh của một phiên.

Ví dụ, một máy khách gửi yêu cầu POST /session chứa một đối tượng JSON đến... Appium máy chủ.

Vì vậy, để gửi yêu cầu hoặc duy trì phiên kết nối với máy chủ, một tập hợp các cặp khóa và giá trị được sử dụng. Điều này được gọi là 'Các khả năng mong muốn' (Desired Capabilities).

import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
{
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName","Android Emulator");
        capabilities.setCapability("platformVersion", "4.4");
}

Vai trò quan trọng của năng lực mong muốn

  • 'DesiredCapabilities' giúp người dùng kiểm soát yêu cầu phiên với máy chủ. Ví dụ, đối với phiên iOS, chúng ta đặt khả năng platformName = iOS, và đối với một phiên khác... Android Tên nền tảng phiên = Android.
  • 'DesiredCapabilities' được sử dụng để thiết lập phiên bản WebDriver, ví dụ: FirefoxDriver, ChromeDriver hoặc InternetExplorerDriver.
  • DesiredCapability rất hữu ích cho Selenium Lưới (Grid). Ví dụ, nó được sử dụng để chạy các trường hợp kiểm thử khác nhau trên các trình duyệt và hệ điều hành khác nhau. Dựa trên khả năng đã nêu, trung tâm lưới (Grid hub) trỏ đến nút tương ứng. Các nút được định nghĩa bằng cách sử dụng các phương thức thuộc tính 'set':
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • Khả năng mong muốn là một gói được định nghĩa trong thư viện. Trước khi sử dụng 'DesiredCapabilities', nó cần được nhập từ thư viện bên dưới.
    Org.openqa.selenium.remote.DesiredCapabilities

Appium hỗ trợ cả Android và iOS, vì vậy có một bộ riêng biệt. Appium Khả năng của máy chủ cho từng nền tảng.

Bảng dưới đây hiển thị một số cách sử dụng phổ biến. Android năng lực và các giá trị cần sử dụng.

DỊCH VỤ Mô tả Chi tiết Giá trị/Công dụng
gói ứng dụng Gọi số điện thoại mong muốn Java gói trong Android mà người dùng muốn chạy

Giá trị= com.example.myapp/

Obj.setCapability(“appPackage”, “com.whatsapp”);

hoạt động ứng dụng Hoạt động ứng dụng mà người dùng muốn khởi chạy từ gói phần mềm.

Giá trị= MainActivity, .Settings

Obj.setCapability(“appActivity”, “com.whatsapp.Main”);

gói ứng dụngWait Gói mà ứng dụng cần phải chờ Giá trị=com.example.android.myapp
ứng dụngWaitActivity Bất kì Android hoạt động mà người dùng cần phải chờ đợi

Giá trị= Hoạt động giật gân

khả năng.setCapability ("appWaitActivity", "com.example.game.SplashActivity")

LƯU Ý: Vui lòng tham khảo Appium tài liệu hướng dẫn để xem thêm Android khả năng.

Bảng dưới đây hiển thị một số tính năng thường dùng của iOS và các giá trị cần sử dụng.

DỊCH VỤ Mô tả Chi tiết Các giá trị
Thời gian khởi chạy Tổng thời gian (tính bằng mili giây) để chờ thiết bị đo. 2000
BẠN ĐÃ Để xác định số hiệu thiết bị duy nhất của một thiết bị vật lý được kết nối. 166aestu4

LƯU Ý: Vui lòng tham khảo Appium hướng dẫn năng lực Để xem thêm các tính năng của iOS.

Năng lực mong muốn đã thay đổi như thế nào trong Appium 2

Các ví dụ trên đến từ... Appium Một kỷ nguyên vẫn thể hiện hình dạng của một bộ kỹ năng, nhưng hai quy tắc đã thay đổi và cả hai sẽ ngăn cản một phiên hiện đại bắt đầu.

Thứ nhất, đặc tả W3C WebDriver chỉ định nghĩa một tập hợp nhỏ các khả năng tiêu chuẩn, trong đó có: platformNamebrowserName Vấn đề ở đây là vậy. Mọi khả năng khác đều là phần mở rộng của nhà cung cấp và phải có tiền tố không gian tên kết thúc bằng dấu hai chấm. AppiumTiền tố của 's là appium:. Vì vậy, deviceName trở thành appium:deviceNameplatformVersion trở thành appium:platformVersion. Appium 2 cũng yêu cầu appium:automationNameVì trình điều khiển được cài đặt riêng biệt chứ không phải được tích hợp sẵn trong máy chủ.

Thứ hai, việc lặp lại tiền tố trở nên nhàm chán, vì vậy Appium chấp nhận một appium:options Khả năng có giá trị là một đối tượng. Các khả năng bên trong đối tượng đó không cần tiền tố, và khi một tên xuất hiện cả bên trong và bên ngoài đối tượng, giá trị bên trong sẽ được ưu tiên.

{
    "platformName": "iOS",
    "appium:options": {
        "automationName": "XCUITest",
        "platformVersion": "16.0",
        "app": "/path/to/your.app",
        "deviceName": "iPhone 12",
        "noReset": true
    }
}

⚠️ Ghi chú phiên bản: trên Java bên, Selenium 4 và Appium Java máy khách 8 đã loại bỏ DesiredCapabilities Lớp được hiển thị trước đó. Các trình tạo dành riêng cho trình điều khiển được kế thừa từ BaseOptions thay thế nó — UiAutomator2Options cho Android và XCUITestOptions dành cho iOS — với bản đồ tỷ lệ 1:1ping từ mỗi người cũ setCapability cuộc gọi. Đoạn mã gốc ở trên được giữ lại ở đây như một ví dụ lịch sử.

ExtracThông tin về các gói dịch vụ và hoạt động

Các gói là các tập tin hoặc lớp được đóng gói lại với nhau. Chúng cung cấp một cấu trúc có tổ chức cho lập trình theo mô-đun. Trong JavaCác gói phần mềm khác nhau được lưu trữ trong một tệp JAR duy nhất, và người dùng có thể gọi tệp JAR đó để thực thi toàn bộ. Một khái niệm tương tự cũng được áp dụng trong phát triển ứng dụng di động.

Trong tạp chí Android hệ điều hành, tất cả các ứng dụng được cài đặt dưới dạng Java gói hàng. Vì vậy, để ví dụtracthông tin đường dẫn gói t, Android Lớp PackageManager được sử dụng.

Nó truy xuất thông tin về gói ứng dụng và hoạt động của các ứng dụng được cài đặt sẵn và cài đặt sau trên thiết bị.

Bạn có thể lấy một thể hiện của lớp PackageManager bằng cách gọi phương thức getPackageManager(). Phương thức này có thể truy cập và thao tác với các gói và các quyền liên quan của các ứng dụng đã cài đặt.

Ví dụ:

PackageManager pManager = getPackageManager();
List<ApplicationInfo> list = pManager.getInstalledApplications(PackageManager.GET_META_DATA)

Cách tìm appPackage và appActivity bằng adb

Phương pháp sử dụng PackageManager ở trên hoạt động từ bên trong ứng dụng. Là người kiểm thử, bạn thường chỉ có bản dựng đã được cài đặt, vì vậy cách nhanh hơn là truy vấn thông qua PackageManager. Adb so sánh với thiết bị được kết nối hoặc trình giả lập.

Mở ứng dụng trên thiết bị theo cách thủ công, sau đó chạy một trong các lệnh bên dưới từ cửa sổ terminal trong thư mục platform-tools. Lệnh này sẽ in ra cửa sổ hiện đang được chọn, và giá trị được định dạng như sau: package/activity.

adb shell dumpsys window | find "mCurrentFocus"
adb shell dumpsys window windows | grep -i "mCurrentFocus"

Sử dụng dạng đầu tiên trong Windows Một lệnh trong cửa sổ dòng lệnh và lệnh thứ hai trong shell Unix hoặc Git Bash. Đọc kết quả thành hai phần: mọi thứ trước dấu gạch chéo là giá trị cho appPackagevà mọi thứ sau đó đều là giá trị cho appActivity.

Có hai lưu ý cần ghi nhớ. Hoạt động được tập trung là bất cứ thứ gì đang hiển thị trên màn hình tại thời điểm đó, không phải lúc nào cũng là hoạt động mà ứng dụng bắt đầu – nếu phiên làm việc thất bại trong quá trình khởi tạo trình điều khiển, hãy khởi chạy lại ứng dụng và đọc lại giá trị. Và nếu màn hình chờ xuất hiện trước, hoạt động đầu vào sẽ khác với hoạt động mà bạn muốn kiểm tra sau này, và đó chính xác là trường hợp này. appWaitActivity tồn tại vì điều đó.

Một phương án trực quan khác là uiautomatorviewer, chức năng này ghi lại cấu trúc phân cấp màn hình hiện tại và hiển thị gói cũng như lớp của mỗi nút.

Các lỗi thường gặp về khả năng mong muốn (DCC) và cách khắc phục chúng.

Thất bại nhiều nhất Appium Các phiên kiểm thử kết thúc trước khi bất kỳ bước kiểm thử nào được thực thi, và nguyên nhân hầu như luôn nằm ở bộ khả năng chứ không phải ở chính bài kiểm thử. Bảng dưới đây đối chiếu từng thông báo với cách khắc phục thường gặp.

Tin nhắn Nguyên nhân có thể Sửa chữa
Khả năng WebDriver không hợp lệ hoặc không được hỗ trợ Một chức năng không tiêu chuẩn đã được gửi đi mà không có tiền tố của nhà cung cấp. Thêm `appium:` vào đó, hoặc chuyển nó vào bên trong `appium:options`.
Các khả năng mong muốn phải bao gồm automationName hoặc platformName. Appium 2 không thể chọn người lái xe Đặt platformName và appium:automationName một cách rõ ràng.
Không thể khởi động ứng dụng. Lỗi gốc: hoạt động dùng để khởi động ứng dụng không tồn tại. appActivity không khớp với manifest Đọc lại giá trị bằng lệnh dumpsys ở trên
Phiên kết nối không bắt đầu: không tìm thấy thiết bị nào. Không có trình giả lập hoặc thiết bị cầm tay nào được gắn kèm. Xác nhận thiết bị bằng lệnh adb devices trước khi khởi chạy.
Không thể tạo phiên mới sau khi hết thời gian chờ. Màn hình chờ làm trì hoãn hoạt động nhập liệu. Đặt appWaitActivity và tăng appWaitDuration.
Trạng thái ứng dụng không được đặt lại giữa các lần chạy. Hành vi đặt lại mặc định đã bị ghi đè. RevXem appium:noReset và appium:fullReset cho lần chạy bạn muốn.

Khi phiên làm việc không khởi động được, hãy đọc hướng dẫn. Appium nhật ký máy chủ thay vì ngăn xếp máy khách trace. Máy chủ nêu rõ khả năng nào nó không thể đáp ứng và dòng đó nêu tên giải pháp khắc phục.

Câu Hỏi Thường Gặp

Không. platformName và browserName là các khả năng tiêu chuẩn của W3C và không có tiền tố. Mọi thứ khác Appium Khả năng này, bao gồm deviceName và platformVersion, là một phần mở rộng của nhà cung cấp và cần có tiền tố appium:.

Các công cụ học máy trong nền tảng điện toán đám mây thiết bị đề xuất một tập hợp các khả năng từ bản dựng và thiết bị mục tiêu, đồng thời đánh dấu các giá trị bị lỗi trong các phiên tương tự. Hãy xem kết quả đầu ra như một bản nháp và xác nhận lại từng tên so với tài liệu trình điều khiển.

Phi công phụ hoàn thành các khối năng lực chung, nhưng nó được huấn luyện trên rất nhiều lĩnh vực. Appium Mã này thường bỏ qua tiền tố hoặc đề xuất sử dụng lớp DesiredCapabilities đã lỗi thời. Hãy kiểm tra từng đề xuất so với hướng dẫn hiện hành.

appPackage đặt tên cho gói phần mềm. Appium khởi chạy. appWaitPackage đặt tên cho gói. Appium Chờ cho đến khi xuất hiện trước khi trả lại quyền điều khiển, điều này rất quan trọng khi trình khởi chạy hoặc màn hình chờ tải một gói khác trước.

platformName được đặt thành iOS và appium:automationName được đặt thành XCUITest. Trình điều khiển XCUITest cũng cần ít nhất một trong các giá trị appium:app, appium:bundleId hoặc browserName, nếu không nó sẽ mở một phiên trên màn hình chính.

Khoảng thời gian này là số giây máy chủ chờ máy khách gửi lệnh tiếp theo. Nếu thời gian chờ vượt quá, máy chủ sẽ cho rằng máy khách đã rời đi và đóng phiên làm việc, điều này thường trông giống như một lỗi ngẫu nhiên.

noReset bỏ qua bước thiết lập lại thông thường để dữ liệu ứng dụng được giữ nguyên sau khi kết thúc phiên. fullReset thêm các bước bổ sung, gỡ cài đặt và cài đặt lại, để đảm bảo tính khả thi tối đa. Cả hai đều mặc định là false và không nên được bật cùng lúc.

Không. Khả năng là các tham số để bắt đầu phiên và được cố định sau khi phiên được tạo. Trường hợp trình điều khiển cho phép thay đổi hành vi giữa chừng trong phiên, nó sẽ hiển thị một Thiết lập thông qua API Cài đặt.

Tóm tắt bài viết này với: