Appium Επιθυμητές Δυνατότητες για Android εξομοιωτή

⚡ Έξυπνη Σύνοψη

Οι επιθυμητές δυνατότητες είναι τα ζεύγη κλειδιού-τιμής και Appium Ο πελάτης στέλνει όταν ανοίγει μια συνεδρία, ενημερώνοντας τον διακομιστή σε ποια πλατφόρμα, συσκευή, πρόγραμμα οδήγησης και εφαρμογή θα πρέπει να εκτελεστεί η αυτοματοποιημένη δοκιμή.

  • ???? Συνεδρία contract: Οι δυνατότητες ταξιδεύουν στο σώμα JSON του αιτήματος νέας συνεδρίας και δεν μπορούν να αλλάξουν αργότερα.
  • ☑️ Android είδη πρώτης ανάγκης: Τα appPackage και appActivity ονομάζουν την εφαρμογή και την οθόνη Appium θα πρέπει να ξεκινήσει.
  • Παραλλαγές αναμονής: Τα appWaitPackage και appWaitActivity καλύπτουν οθόνες εκκίνησης που εμφανίζονται πριν από το πραγματικό σημείο εισόδου.
  • 🧪 Appium 2 πρόθεμα: Κάθε μη τυπική δυνατότητα χρειάζεται πλέον το πρόθεμα appium: vendor, διαφορετικά ο διακομιστής το απορρίπτει.
  • ΜΟΝΤΕΡΝΑ Java πελάτης: Το DesiredCapabilities έδωσε τη θέση του στο UiAutomator2Options και το XCUITestOptions στο πλαίσιο Selenium 4.
  • 📊 Εύρεση τιμών: Ένα ερώτημα adb dumpsys ή η κλάση PackageManager αποκαλύπτει τα ονόματα των πακέτων και των δραστηριοτήτων.

Appium επιθυμητά ζεύγη κλειδιού-τιμής δυνατοτήτων για ένα Android συνεδρία εξομοιωτή

Τι είναι οι Επιθυμητές Δυνατότητες

Οι «Επιθυμητές Δυνατότητες» μας βοηθούν να τροποποιήσουμε τη συμπεριφορά του διακομιστή κατά τη διάρκεια του αυτοματισμού. Appium είναι ένα hashmap ή ζεύγος κλειδιού-τιμής, που χρησιμοποιείται για την αποστολή μιας εντολής στο Appium διακομιστή, όπου κάθε εντολή πελάτη εκτελείται στο πλαίσιο μιας συνεδρίας.

Για παράδειγμα, ένας πελάτης στέλνει ένα αίτημα POST /session που περιέχει ένα αντικείμενο JSON στο Appium διακομιστή.

Έτσι, για την αποστολή ενός αιτήματος ή τη διατήρηση μιας συνεδρίας με τον διακομιστή, χρησιμοποιείται ένα σύνολο ζευγών κλειδιών και τιμών. Αυτό είναι γνωστό ως «Επιθυμητές Δυνατότητες».

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");
}

Σημαντικός Ρόλος της Επιθυμητής Ικανότητας

  • Οι «Επιθυμητές Δυνατότητες» βοηθούν τον χρήστη να ελέγχει το αίτημα συνεδρίας με τον διακομιστή. Για παράδειγμα, για μια συνεδρία iOS ορίζουμε τη δυνατότητα platformName = iOS, και για μια Android πλατφόρμα συνεδρίας Όνομα = Android.
  • Οι «DesiredCapabilities» χρησιμοποιούνται για τη ρύθμιση της παρουσίας WebDriver, για παράδειγμα FirefoxΠρόγραμμα οδήγησης, πρόγραμμα οδήγησης Chrome ή πρόγραμμα οδήγησης Internet Explorer.
  • Το DesiredCapability είναι πολύ χρήσιμο για Selenium Πλέγμα. Για παράδειγμα, χρησιμοποιείται για την εκτέλεση διαφορετικών περιπτώσεων δοκιμών σε διαφορετικό πρόγραμμα περιήγησης και διαφορετικό λειτουργικό σύστημα. Με βάση τη δηλωμένη δυνατότητα, ο κόμβος πλέγματος δείχνει στον αντίστοιχο κόμβο. Οι κόμβοι ορίζονται χρησιμοποιώντας τις μεθόδους ιδιότητας 'set':
    DesiredCapabilities obj = new DesiredCapabilities(); 
    obj.setBrowserName("firefox"); 
    obj.setVersion("18.0.1"); 
    obj.setPlatform(org.openqa.selenium.Platform.WINDOWS);					
    
  • Μια επιθυμητή δυνατότητα είναι ένα πακέτο που ορίζεται από βιβλιοθήκη. Πριν από τη χρήση του 'DesiredCapabilities', θα πρέπει να εισαχθεί από την παρακάτω βιβλιοθήκη.
    Org.openqa.selenium.remote.DesiredCapabilities

Appium υποστηρίζει και τα δύο Android και iOS, επομένως υπάρχει ξεχωριστό σύνολο Appium δυνατότητες διακομιστή για κάθε πλατφόρμα.

Ο παρακάτω πίνακας παρουσιάζει μερικές από τις πιο συνηθισμένες Android δυνατότητες και οι αξίες που θα χρησιμοποιηθούν.

Δυνατότητες Περιγραφή Αξίες/Χρήσεις
πακέτο εφαρμογών Καλέστε τον επιθυμητό Java πακέτο σε Android που ο χρήστης θέλει να εκτελέσει

Value= com.example.myapp/

Obj.setCapability ("appPackage", "com.whatsapp");

AppActivity Δραστηριότητα εφαρμογής που θέλει να εκκινήσει ο χρήστης από το πακέτο.

Τιμή= MainActivity, .Ρυθμίσεις

Obj.setCapability("appActivity", "com.whatsapp.Main");

appWaitPackage Πακέτο για το οποίο πρέπει να περιμένει η εφαρμογή Value=com.example.android.myapp
appWaitActivity Κάθε Android δραστηριότητα για την οποία ο χρήστης πρέπει να περιμένει

Τιμή= SplashActivity

capabilities.setCapability("appWaitActivity", "com.example.game.SplashActivity")

ΣΗΜΕΙΩΣΗ: ανατρέξτε στο Appium τεκμηρίωση για να δείτε περισσότερα Android δυνατότητες.

Ο παρακάτω πίνακας δείχνει ορισμένες δυνατότητες του iOS που χρησιμοποιούνται συνήθως και τις τιμές που πρέπει να χρησιμοποιηθούν.

Δυνατότητες Περιγραφή Αξίες
LaunchTimeout Συνολικός χρόνος (σε ms) για αναμονή για όργανα. 2000
ΕΣΥ ΤΟ ΕΚΑΝΕΣ Για να προσδιορίσετε τον μοναδικό αριθμό συσκευής μιας συνδεδεμένης φυσικής συσκευής 166aestu4

ΣΗΜΕΙΩΣΗ: ανατρέξτε στο Appium οδηγός δυνατοτήτων για να δείτε περισσότερες δυνατότητες του iOS.

Πώς άλλαξαν οι επιθυμητές δυνατότητες Appium 2

Τα παραπάνω παραδείγματα προέρχονται από το Appium 1 εποχή και εξακολουθούν να εμφανίζουν το σχήμα ενός συνόλου δυνατοτήτων, αλλά δύο κανόνες άλλαξαν και οι δύο θα εμποδίσουν την έναρξη μιας σύγχρονης συνεδρίας.

Καταρχάς, η προδιαγραφή WebDriver του W3C ορίζει μόνο ένα μικρό σύνολο τυπικών δυνατοτήτων, εκ των οποίων platformName και browserName έχει σημασία εδώ. Κάθε άλλη δυνατότητα είναι μια επέκταση προμηθευτή και πρέπει να φέρει ένα πρόθεμα χώρου ονομάτων που τελειώνει σε άνω και κάτω τελεία. AppiumΤο πρόθεμα του είναι appium:. Έτσι deviceName γίνεται appium:deviceName και platformVersion γίνεται appium:platformVersion. Appium 2 απαιτεί επίσης appium:automationName, επειδή τα προγράμματα οδήγησης εγκαθίστανται ξεχωριστά και όχι σε πακέτο με τον διακομιστή.

Δεύτερον, η επανάληψη του προθέματος γίνεται κουραστική, επομένως Appium δέχεται ένα μόνο appium:options Δυνατότητα της οποίας η τιμή είναι ένα αντικείμενο. Οι δυνατότητες μέσα σε αυτό το αντικείμενο δεν χρειάζονται πρόθεμα και όπου ένα όνομα εμφανίζεται τόσο μέσα όσο και έξω από το αντικείμενο, η εσωτερική τιμή υπερισχύει.

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

⚠️ Σημείωση έκδοσης: σχετικά με την Java πλευρά, Selenium 4 και Appium Java Ο πελάτης 8 απέρριψε το DesiredCapabilities κατηγορία που παρουσιάστηκε νωρίτερα. Οι κατασκευαστές που κληρονόμησαν ειδικά για τον οδηγό BaseOptions αντικαταστήστε το — UiAutomator2Options για Android και XCUITestOptions για iOS — με χάρτη ένα προς έναping από κάθε παλιό setCapability κλήση. Ο αρχικός κώδικας παραπάνω διατηρείται εδώ ως ιστορικό παράδειγμα.

Extracπληροφορίες για πακέτα και δραστηριότητες

Τα πακέτα είναι ομαδοποιημένα αρχεία ή κλάσεις. Δίνουν μια οργανωμένη δομή στον αρθρωτό προγραμματισμό. Java, διαφορετικά πακέτα αποθηκεύονται σε ένα μόνο αρχείο JAR και ο χρήστης μπορεί να καλέσει αυτό το JAR για πλήρη εκτέλεση. Μια παρόμοια ιδέα ακολουθείται στην ανάπτυξη εφαρμογών για κινητά.

Στο Android λειτουργικό σύστημα, όλες οι εφαρμογές εγκαθίστανται με τη μορφή Java πακέτα. Έτσι, για ναtracπληροφορίες διαδρομής πακέτου t, το Android Χρησιμοποιείται η κλάση PackageManager.

Ανακτά πληροφορίες πακέτων και δραστηριότητας για προεγκατεστημένες και μεταεγκατεστημένες εφαρμογές στη συσκευή.

Μπορείτε να λάβετε μια παρουσία της κλάσης PackageManager καλώντας την getPackageManager(). Αυτή η μέθοδος μπορεί να έχει πρόσβαση και να χειριστεί τα πακέτα και τα σχετικά δικαιώματα των εγκατεστημένων εφαρμογών.

Για παράδειγμα:

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

Πώς να βρείτε το appPackage και το appActivity με το adb

Η παραπάνω διαδρομή PackageManager λειτουργεί μέσα από μια εφαρμογή. Ως δοκιμαστής, συνήθως έχετε μόνο την εγκατεστημένη έκδοση, επομένως η ταχύτερη διαδρομή είναι ένα ερώτημα μέσω adb σε μια συνδεδεμένη συσκευή ή εξομοιωτή.

Ανοίξτε την εφαρμογή στη συσκευή χειροκίνητα και, στη συνέχεια, εκτελέστε μία από τις παρακάτω εντολές από ένα τερματικό στον φάκελο platform-tools. Η εντολή εκτυπώνει το παράθυρο που έχει την τρέχουσα εστίαση και η τιμή έχει τη μορφή package/activity.

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

Χρησιμοποιήστε την πρώτη φόρμα στο Windows γραμμή εντολών και το δεύτερο σε ένα κέλυφος Unix ή Git Bash. Διαβάστε το αποτέλεσμα ως δύο μισά: όλα όσα βρίσκονται πριν από την κάθετο είναι η τιμή για appPackage, και όλα όσα ακολουθούν έχουν την αξία για appActivity.

Ισχύουν δύο προειδοποιήσεις. Η εστιασμένη δραστηριότητα είναι ό,τι εμφανίζεται στην οθόνη εκείνη τη στιγμή, η οποία δεν είναι πάντα η δραστηριότητα με την οποία ξεκινά η εφαρμογή — εάν μια συνεδρία αποτύχει κατά την αρχικοποίηση του προγράμματος οδήγησης, εκκινήστε την εφαρμογή από την αρχή και διαβάστε ξανά την τιμή. Και εάν εμφανιστεί πρώτα μια οθόνη εκκίνησης, η δραστηριότητα εισαγωγής θα διαφέρει από αυτήν που τελικά θέλετε να αντιταχθείτε, κάτι που ισχύει ακριβώς. appWaitActivity υπάρχει για.

Μια οπτική εναλλακτική είναι uiautomatorviewer, το οποίο καταγράφει την τρέχουσα ιεραρχία οθόνης και εμφανίζει το πακέτο και την κλάση κάθε κόμβου.

Συνήθη σφάλματα επιθυμητών δυνατοτήτων και πώς να τα διορθώσετε

Οι περισσότεροι απέτυχαν Appium Οι συνεδρίες τερματίζονται πριν από την εκτέλεση ενός μόνο βήματος δοκιμής και η αιτία βρίσκεται σχεδόν πάντα στο σύνολο δυνατοτήτων και όχι στη δοκιμή. Ο παρακάτω πίνακας αντιστοιχίζει κάθε μήνυμα στη συνήθη επιδιόρθωσή του.

Το μήνυμά σας Πιθανή αιτία σταθερός
Μη έγκυρη ή μη υποστηριζόμενη δυνατότητα WebDriver Στάλθηκε μια μη τυπική δυνατότητα χωρίς το πρόθεμα του προμηθευτή Προσθέστε το appium: σε αυτό ή μετακινήστε το μέσα στο appium:options
Οι επιθυμητές δυνατότητες πρέπει να περιλαμβάνουν είτε ένα automationName είτε ένα platformName Appium 2 δεν μπορούν να επιλέξουν οδηγό Ορίστε ρητά τα platformName και appium:automationName
Δεν είναι δυνατή η εκκίνηση της εφαρμογής. Αρχικό σφάλμα: η δραστηριότητα που χρησιμοποιήθηκε για την εκκίνηση της εφαρμογής δεν υπάρχει. Η εφαρμογήActivity δεν ταιριάζει με το μανιφέστο Ξαναδιαβάστε την τιμή με την εντολή dumpsys παραπάνω
Η συνεδρία δεν ξεκίνησε: δεν βρέθηκαν συσκευές Δεν υπάρχει συνδεδεμένος εξομοιωτής ή ακουστικό Επιβεβαιώστε τη συσκευή με συσκευές adb πριν από την εκκίνηση
Δεν ήταν δυνατή η δημιουργία νέας συνεδρίας μετά το χρονικό όριο Μια οθόνη εκκίνησης καθυστερεί τη δραστηριότητα εισόδου Ορίστε την τιμή appWaitActivity και αυξήστε την τιμή appWaitDuration
Η κατάσταση της εφαρμογής δεν επαναφέρεται μεταξύ των εκτελέσεων Η προεπιλεγμένη συμπεριφορά επαναφοράς παρακάμφθηκε Review appium:noReset και appium:fullReset για την εκτέλεση που θέλετε

Όταν μια συνεδρία αρνείται να ξεκινήσει, διαβάστε το Appium αρχείο καταγραφής διακομιστή αντί για τη στοίβα πελατών tracε. Ο διακομιστής δηλώνει ποια δυνατότητα δεν μπορούσε να ικανοποιήσει και αυτή η γραμμή ονομάζει την επιδιόρθωση.

Συχνές Ερωτήσεις

Αρ. Τα platformName και browserName είναι τυπικές δυνατότητες του W3C και παραμένουν χωρίς πρόθεμα. Κάθε άλλο Appium Η δυνατότητα, συμπεριλαμβανομένων των deviceName και platformVersion, είναι μια επέκταση προμηθευτή και χρειάζεται το πρόθεμα appium:.

Τα εργαλεία μηχανικής μάθησης στα cloud συσκευών προτείνουν ένα σύνολο δυνατοτήτων από τη συσκευή δημιουργίας και προορισμού και επισημαίνουν τιμές που απέτυχαν σε παρόμοιες συνεδρίες. Αντιμετωπίστε την έξοδο ως προσχέδιο και επιβεβαιώστε κάθε όνομα με βάση την τεκμηρίωση του προγράμματος οδήγησης.

Ο συγκυβερνήτης ολοκληρώνει κοινά μπλοκ ικανοτήτων, αλλά εκπαιδεύτηκε σε πολλά Appium 1 κώδικα και συχνά παραλείπει το πρόθεμα ή προτείνει την παρωχημένη κλάση DesiredCapabilities. Ελέγξτε κάθε πρόταση με τον τρέχοντα οδηγό.

Το appPackage ονομάζει το πακέτο Appium εκκινείται. Το appWaitPackage ονομάζει το πακέτο Appium περιμένει να εμφανιστεί πριν επιστρέψει τον έλεγχο, κάτι που έχει σημασία όταν ένας εκκινητής ή μια οθόνη εκκίνησης φορτώνει πρώτα ένα διαφορετικό πακέτο.

Το platformName έχει οριστεί σε iOS και το appium:automationName έχει οριστεί σε XCUITest. Το πρόγραμμα οδήγησης XCUITest χρειάζεται επίσης τουλάχιστον ένα από τα appium:app, appium:bundleId ή browserName, διαφορετικά ανοίγει μια συνεδρία στην αρχική οθόνη.

Ο αριθμός των δευτερολέπτων που περιμένει ο διακομιστής μέχρι ο υπολογιστής-πελάτης να στείλει την επόμενη εντολή του. Εάν η αναμονή ξεπεραστεί, ο διακομιστής υποθέτει ότι ο υπολογιστής-πελάτης έχει αποχωρήσει και τερματίζει την περίοδο λειτουργίας, κάτι που συχνά μοιάζει με τυχαία αποτυχία.

Η επιλογή noReset παρακάμπτει τη συνήθη επαναφορά, έτσι ώστε τα δεδομένα της εφαρμογής να επιβιώνουν από την περίοδο λειτουργίας. Η επιλογή fullReset προσθέτει επιπλέον βήματα, απεγκατάσταση και επανεγκατάσταση, για μέγιστη αναπαραγωγιμότητα. Και οι δύο ρυθμίσεις είναι από προεπιλογή false και δεν πρέπει να είναι ενεργοποιημένες ταυτόχρονα.

Όχι. Οι δυνατότητες είναι παράμετροι για την έναρξη της συνεδρίας και καθορίζονται μόλις δημιουργηθεί. Όταν ένα πρόγραμμα οδήγησης επιτρέπει σε μια συμπεριφορά να αλλάξει κατά τη διάρκεια της συνεδρίας, εκθέτει μια Ρύθμιση μέσω του API Ρυθμίσεων.

Συνοψίστε αυτήν την ανάρτηση με: