Rampup: betriebssystemnahe Ranorex-Tests auf Android-Geräten

Einschränkungen:
Grundsätzlich sollte man versuchen, betriebssystemnahe Tests nicht mit GUI-basierten Mitteln zu verwirklichen (z.B. Howto get battery status), da GUI-Automatisierung im Allgemeinen “teuer” ist, jedoch in diesem Bereich im Speziellen noch mehr.
Die Testautomatisierung von Android-apps und -webapps wird seitens Ranorex unterstützt, doch wie sieht das aus, wenn das Android Betriebssystem involviert ist, wie beispielsweise die notifications oder der Akkustand? Bei Andriod-Emulatoren(!) zumindest wird dies seitens Ranorex offiziell nicht unterstützt (laut der heutigen Aussage einer Ranorex-Mitarbeiters). Dies drücke sich durch fehlende einschlägige Tests aus. Auch ist das Setup nicht straight-forward und auch das reguläre Arbeiten fühlt sich wackelig an.
Aber auch für physische Android-Geräte ist die Android-OS Testautomatisierung ohnehin eingeschränkt, so kann man beispielsweise nicht tracken und highlighten (was die Identifikation der GUI-Elemente natürlich deutlich erschwert.)
In den Ranorex Settings muss einmalig ‘Android OS Automation’ auf true gestellt werden und ‘Screenshots on AndroidOS’ unbedingt auch auf true (damit die Screenshots im Ranorex Spy als Orientierung zur Verfügung stehen).
Der Emluator muss natürlich im Ranorex Device Manager (z.B. vom Ranorex Spy aus erreichbar) angelegt sein.
Hack in der Ranorex-Konfiguration:
Um die OS-Elemente eines emulierten Android-Gerätes aktuell per Ranorex Spy zugänglich zu machen, bedarf es eines Workarounds für einen bekannten Bug. Aktuell sind die entsprechenden Knoten weder sichtbar noch erreichbar, was dann im Ranorex Spy so aussieht: nach dem Anklicken des Kreuzes vor dem Gerät verschwindet es einfach, ohne dass weitere Knoten zum Vorschein kommen:
ranorex android os
In C:\Users\michael\AppData\Roaming\RanorexConfig6.xml finden sich die Konfigurationen aller im Device Manager angelegten Android-Emulatoren. Bei jedem(!) dieser Emulatoren muss nun statt ‘Emulator’ ‘USB’ eingetragen werden:

<EndpointInformation>
    <Metadata>emulator-5556</Metadata>
    <DisplayName>emulator-5556</DisplayName>
    <!--<ConnectionType>Emulator</ConnectionType>-->
    <ConnectionType>USB</ConnectionType>
    <HostAddress>127.0.0.1;localhost</HostAddress>
    <AskForAddressChange>true</AskForAddressChange>
    <Port>31000</Port>
    <Platform>
        <OSVersionName>0.0.0</OSVersionName>
        <OSVersionNumber>0.0.0</OSVersionNumber>
        <RxVersion>0.0.0</RxVersion>
        <MobilePlatform>Android</MobilePlatform>
    </Platform>
    <IsDiscoverable>false</IsDiscoverable>
    <Enabled>true</Enabled>
</EndpointInformation>

In den Developer-Settings im Android-Emulator muss ‘USB-Debugging’ aktiviert sein.
Zusätzlich bedarf es noch ein wenig “Fingerfertigkeit” beim Laden des Geräts im Spy. So muss man u.U. anfangs das Gerät im Fenster unten selektieren und retryen, dann das Gerät im oberen Fenster selektieren und dann retryen, damit man im Baum nach unten navigieren kann. Letzteres muss u.U. mehrmals wiederholt werden, was sich schon ziemlich merkwürdig anfühlt. Übrigens tritt dieses merkwürdige Verhalten nicht nur bei Android-Emulatoren, sondern auch bei USB-angebundenen physischen Devices auf.
2016-11-08 15_37_28-Ranorex Spy (32bit) - Live
Außerdem hatte ich Fälle, in denen im “Screenshots”-Navigator (im Spy rechts unten) einzelne GUI-Elemente nicht selektiert werden konnten oder die Screenshots überhaupt nicht erschienen sind. Auch da half nur mehrmaliges oben bereits beschriebenes “Refreshen”. Das Ganze erscheint also sehr wackelig.
Zur Test-Vorbereitung schicke ich eine SMS in den Emulator mit einem bestimmten Text, z.B. “Ranorex Experte”.
2016-11-10 15_36_30-Program Manager
Ich habe die Ausführung folgenden Testskripts häufig wiederholt. Einmal scheint sich die Verbindung zwischen Ranorex und dem Android-Emulator aufgehängt zu haben und ein Neustart des Android-Emulators war erforderlich.
Testskript
Das Runterziehen (Swipe(…)) der Notification-Bar funktioniert zumindest im Emulator nicht zuverlässig. Ohne das Testskript zu ändern funktioniert es mal und mal nicht. Hierbei helfen auch keine “static waits”.
Als Beispiel testautomatisiere ich den Check der Akkuanzeige im Android-Emulator. Darin wird zuerst die Notification Bar “runtergezogen”. Anschließend wird im “Screenshot”-Navigator des Ranorex Spys auf die Akkuanzeige geklickt, um den RanoreXPath zu ermitteln:
2016-11-09 14_02_29-Ranorex Spy (32bit) - Live
->
2016-11-09 14_07_15-Ranorex Spy (32bit) - Live
Als Referenzen müssen Ranorex.Core und Ranorex.Plugin.Mobile hinzugefügt werden:

using Ranorex;
using System;
using System.Text.RegularExpressions;
namespace TestcaseForMobileApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Ranorex.AndroidElement elementOfEnergyStatus = null;
            Host.Local.TryFindSingle("/mobileapp[@devicename='nexus one api']/container[@rid='R.id.panel_holder']//container[@rid='R.id.system_icons_super_container']/text", 90000, out elementOfEnergyStatus); // 90000 milliseconds to wait for the element.
            var energyStatusWithPercentSymbol = elementOfEnergyStatus.GetAttributeValue&lt;string&gt;("Caption");
            string energyStatusNumber = Regex.Replace(energyStatusWithPercentSymbol, @"%", "");
            int energyStatus = Int32.Parse(energyStatusNumber);
            if (energyStatus &lt;= 50) throw new Exception("Energie level too low!");
        }
    }
}

Android-App per Ranorex testautomatisieren

Um Deine Android App mit Ranorex zu testautomatisieren, muss sie als apk-Datei vorliegen. Als Beispiel für diesen Artikel nehme ich die apk-Datei von HelloCharts und lade sie hier (keine Garantie für die Zuverlässigkeit der Quelle) herunter.
Öffne nun den Ranorex Instrumentation Wizard und wähle Mobile -> Android. Anschließend browse zur apk-Datei und wähle Dein Smartphone als ‘Target Device’:
2016-10-24 11_13_20-Ranorex Instrumentation Wizard
Nachdem Du ‘Next’ geklickt hast, deployed der Instrumentation Wizard die App auf Dein Smartphone. Du kannst Sie dort unter dem Menü-Button finden und musst die App öffnen, damit diese vom Ranorex Spy gefunden werden kann. Das oberste sichtbare Element in unserer Hellocharts-App ist der ‘Line Chart’.
Laut Ranorex Support gibt es aktuell noch keine Möglichkeit ein GUI-Element auf dem Smartphone zu tracken, jedoch einen Workaround dafür: Im Ranorex Spy gibt es im rechten, unteren Bereich einen Screenshot der Applikation. Hier kann man mit der Maus alle Elemente unter einem rotem Rahmen sehen und auswählen. Wenn man auf ein Element im Screenshot klickt, öffnet der Spy automatisch den Baum zu diesem Element.
Wie gewohnt findet sich der RanoreXPath oben im Ranorex Spy:
2016-10-24 11_29_15-Ranorex Spy (32bit) - Live
Folgender C#-Code ist ein automatischer Test für unsere Hellocharts-App (als Referenzen benötigt man Ranorex.Core und Ranorex.Plugin.Mobile):

using Ranorex;
namespace TestcaseForMobileApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // 'USB-23c3caa8' bezeichnet mein bei Ranorex angemeldete Android-Smartphone.
            // 'lecho.lib.hellocharts.samples' kann dem @title-Attribut des RanoreXPaths entnommen werden.
            // falls die App im Smartphone geöffnet ist, braucht man das folgende Statement nicht, denn es öffnet die App:
            Host.Local.RunMobileApp("USB-23c3caa8", "lecho.lib.hellocharts.samples", true);
            Ranorex.AndroidElement lineChart = null;
            // trage als ersten Parameter den RanoreXPath aus dem Ranorex Spy ein
            Host.Local.TryFindSingle("/mobileapp[@title='lecho.lib.hellocharts.samples']/form[@title='MainActivity']/?/?/container[@rid='container']//list[@rid='list']/?/?/text[@caption='Line Chart']", 90000, out lineChart); // 90000 milliseconds to wait for the element.
            lineChart.Touch();
        }
    }
}

Einfacher C# Ranorex-Testcase zum mobilen Website-Testen

Dieser einfache Testcase demonstriert, wie Du mit Ranorex eine Website in einem Browser auf einem Android-Gerät testest.
Voraussetzungen:

  • Dein Android-Smartphone muss bei Ranorex angemeldet sein: Anleitung.
  • Damit das unten genannte Beispiel exakt wie angegeben läuft, muss das Smartphone als ‘USB-23c3caa8’ angemeldet sein.
using Ranorex;
namespace TestcaseForMobileApp
{
    class Program
    {
        static void Main(string[] args)
        {
            // `USB-23c3caa8` bezeichnet mein bei Ranorex angemeldete Android-Smartphone.
            // `ranorex.RxBrowser` ist die default AUT von Ranorex.
            Host.Local.RunMobileApp("USB-23c3caa8", "ranorex.RxBrowser", true);
            Ranorex.WebDocument webDocument = null;
            Host.Local.TryFindSingle("/mobileapp[@title='ranorex.RxBrowser']//dom", out webDocument);
            webDocument.Element.SetAttributeValue("PageUrl", "http://www.google.de");
            Ranorex.WebElement googleSearchField = null;
            Host.Local.TryFindSingle("/mobileapp[@title='ranorex.RxBrowser']//dom//input[#'lst-ib']", 90000, out googleSearchField); // 90000 milliseconds to wait for the element.
            googleSearchField.Element.SetAttributeValue("value", "Ranorex");
            Ranorex.WebElement googleSearchButton = null;
            Host.Local.TryFindSingle("/mobileapp[@title='ranorex.RxBrowser']//dom//button[@name='btnG']", 90000, out googleSearchButton); // 90000 milliseconds to wait for the element.
            googleSearchButton.Touch();
        }
    }
}