Archiwa tagu: appium

Pobieranie UDID podłączonego iPhone

Jednym z wymaganych ustawień Appium jest UDID – Unique Device Identifier.

Pobieranie numeru UDID podłączonego urządzenia z systemem iOS (iPhone/iPad…) jest możliwe za pomocą komendy:

udid=$(system_profiler SPUSBDataType | grep "Serial Number: " | tail -c 41)

Oczywiście może różnić się w zależności od systemu. Testowana była na OS X 10.10.

Tak pobraną wartość można przekazać do skryptu uruchamiającego serwer Appium.

Minimalne wymagania ustawień Appium

Dzisiejszy wpis dotyczy konfiguracji Appium do testów aplikacji natywnych.

Aby Appium mogło zostać uruchomione, należy ustawić kilka podstawowych ustawień (capabilities). Można je zapisać w pliku (np. appium.txt) i odczytywać podczas uruchomienia testów lub przekazywać podczas uruchamiania serwera Appium.

Minimalne wymagane ustawienia w części [caps], to:

  1. dla systemu iOS:
    1. podpięty iPhone, aplikacja *.ipa:
      udid = "1234567890abcdefghijklmnopqrstuvwxyz0123" – wartość obowiązkowa, po której Appium rozpoznaje, czy powinno działać na prawdziwym urządzeniu, czy na symulatorze.
      app = "~/builds/ApplicationName.ipa" – wartość obowiązkowa.
    2. podpięty iPhone, aplikacja już zainstalowana na urządzeniu:
      deviceName = "iPhone-name"
      udid = "1234567890abcdefghijklmnopqrstuvwxyz0123"
      bundleId = "com.company.package"
    3. symulator – bez znaczenia, czy aplikacja jest już zainstalowana, czy Appium musi ja dopiero zainstalować – konieczne jest podanie parametru app, samo bundleId nie jest wystarczające.
      deviceName = "iPhone 5 iOS 8.1" – wartość obowiązkowa. Musi być wpisana dokładna nazwa symulatora, bez udid.
      app = "/Users/d9k/Library/Developer/Xcode/DerivedData/ApplicationName-qwertyuiopasdfghjklzxcvbnmqw/Build/Products/Debug-iphonesimulator/ApplicationName.app" – wartość obowiązkowa
      udid – w zasadzie nie można go używać, gdyż parametr ten sugeruje serwerowi Appium, że ma do czynienia z podłączonym urządzeniem.
  2. dla systemu Android:
    1. podpięty telefon z Androidem lub emulator, bez zainstalowanej aplikacji:
      platformName = "Android"
      deviceName ="dev" – wartość obowiązkowa, pomimo że podczas testowania aplikacji Android jest ignorowana (można wpisać cokolwiek).
      app = "someApp.apk" – wartość obowiązkowa.
    2. podpięty telefon z Androidem lub emulator, z zainstalowaną aplikacją:
      platformName = "Android"
      appPackage = "com.company.package"
      appActivity = ".SomeActivity"
      deviceName = "dev" – j.w.

Notatki z Appium

  1. Jeśli na emulatorze Androida wyłączy się GPS, to pomimo ustawienia pozycji (poprzez telnet), nie zostaje ona ustawiona (co jest oczywiście logiczne 🙂 ).
  2. Appium lubi zgłaszać wiele false-negative. W tym celu stosuje się np. narzędzie rake, gdzie konfiguruje się, aby powtórzył testy, które sfailowały. Jeżeli test nie przejdzie kilka razy pod rząd, oznacza to ze faktycznie coś jest na rzeczy – a nuż test wykrył błąd?
  3. Problem zdarzającego się w Appium co jakiś czas wyjątku Unknown error clearing text został rozwiązany w Appium 1.4.6. Żeby je zainstalować:
    npm install appium@1.4.6
    Komendę tę należy uruchomić w folderze, gdzie jest zainstalowane Appium App („Windows GUI”). Ja akurat uruchomiłam w innym miejscu, komenda wygenerowała mi folder node_modules, który podmieniłam za analogiczny folder w C:\Programy\Appium_146. Samo Appium uruchamiam plikiem *.bat:
    cd c:\Programy\Appium_146\node_modules\appium\bin
    start node appium & --device_name Nexus
  4. Przydatne flagi do ustawienia w Appium.txt:
    1. sendKeyStrategy = "setValue"
      Tekst jest wtedy „wklejany” do pola. Testy działają szybciej, bo tekst nie jest wpisywany litera po literze. Dodatkowa korzyść: nie działa podpowiadanie tekstu (Autocomplete), a wiec np. adresy URL nie są podmieniane na znane wartości ze słownika.
    2. autoAcceptAlerts = true
      Automatycznie akceptuje komunikaty, np. o pozwoleniu na użycie GPS albo aparatu.
      Jest również opcja odwrotna: autoDismissAlerts, czyli automatyczne wybieranie opcji negatywnej.