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.
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ó: platformName và browserName 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:deviceName và platformVersion 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.
