Archiv der Kategorie: Ranorex

RanoreXPath versus XPath

Der RanoreXPath folgt den gleichen syntaktischen Regeln wie der XPath. Folgende Unterschiede gibt es jedoch:

Die erste Achse des RanorexPath’s beginnt mit /forms oder /dom, was es bei XPath’s nicht gibt. Standardmäßig beginnt der RanoreXPath mit /dom, wenn Webelemente selektiert werden sollen. Werden Elemente in einer desktop-Anwendung selektiert, ist die erste Achse des RanoreXPath /forms

Repository items repräsentieren in Ranorex die Elemente mit denen bei der Ausführung der automatischen Tests interagiert (also beispielsweise geklickt, Text ausgelesen und validiert, usw. wird). Mit dem repository item wird der RanoreXPath, ein Timeout, optional ein Screenshot und optional ein Kommentar gespeichert. Repositoryitems sind in einer hierarchischen Struktur von ein oder mehreren übereinander geordneten foldern gespeichert. Jeder dieser folder kann einen Teilpfad enthalten, den sogenannten Base Path (Quelle). Jedes item setzt sich also aus seinem Teilpfad und den Teilpfaden seiner übergeordneten folder zusammen. Solch einen zusammengesetzten Pfad kennen die meisten anderen Testautomatisierungsframeworks nicht.

Ein Text wird in XPath mit text() selektiert, in RanoreXPath jedoch mit @innertext. Wenn anhand eines Teils eines Textes ein Element selektiert werden soll, wird in XPath die contains()-Funktion genutzt – in RanoreXPath kann kein contains() verwendet werden! Stattdessen verwendet RanoreXPath reguläre Ausdrücke (Regex), die durch eine Tilde (~) symbolisiert werden (Quelle). Beispiel: Der XPath //div[contains(@name,’michael‘)] würde in RanoreXPath also so aussehen: /dom//div[@name~’michael‘)]. Kann das @name-Attribut des div groß und klein geschrieben werden, kann man in RanoreXPath also Regex einsetzen: /dom//div[@name~'(m|M)ichael‘)]

Im RanoreXPath kann man @id= abkürzen, indem man ein # nutzt. Wenn der XPath so aussehen würde: //div[@id=’mySearch‘] , würde der entsprechende RanorexPath kann also so aussehen: /dom//div[#’mySearch‘]. Damit man den Pfad aber sowohl als RanoreXPath als auch als XPath nutzen kann, sollte man darauf aber verzichten.

In XPath wird das letze Element mit last() angesprochen, in RanoreXPath wird das durch [-1] erreicht. (darüberhinausgehende Quelle der Unterschiede zwischen RanorexPath und XPath)

Verneinung eines Attributes geht in XPath mit not(@type=’hidden‘) in RanorexPath hingegen gibt’s kein not(), dort macht man das so: @type!=’hidden‘. Beispiel in XPath: //div[not(@id=’falscheID‘)] – das entsprechende Beispiel in RanoreXPath lautet /dom//div[@id!=’falscheID‘]

In XPath kann man die Existenz eines Attributs, also beispielsweise des title-Attributs einfach durch @title überprüfen (Quelle), in RanoreXPath muss man das so machen: @title!=null() -> die Klammern hinter null braucht es tatsächlich. Letzteres funktioniert in XPath nicht.

In XPath kann man die Nicht-Existenz eines Attributes, z.B. des title-Attributes einfach durch not(@title) überprüfen, z.B. //div[not(@class)] selektiert alle div auf einer Webseite, die kein class-Attribut haben. In RanoreXPath ist das ziemlich uneinheitlich (im Ranorex-Forum bestätigt der Support zumindest, dass das einmal zwischen verschiedenen Browsern uneinheitlich war (Quelle)). In Edge habe ich mir mühsam Schritt-für-Schritt erarbeitet, welcher RanoreXPath das wie macht:

AttributRanoreXPath zum Selektieren eines Elements ohne das Attribut
Zugelassene Attribute eines divs (Quelle)
id@id=null()
class@class=null()
lang@lang=null()
title@title=null()
stylekeinen RanoreXPath gefunden, der das kann.
align@align=null()
onclick@onclick=null()
Phantasie-Attribute
hubba-bubba@hubba-bubba=null()
Web-Element Attribute
tagValue@tagValue=null()
innertext@innertext=“
ContentEditable@ContentEditable=null()
ContextMenue@ContextMenue=null()

In RanoreXPath verwenden Sie etwas wie /dom[@page=’FlexExample.html‘], um den Browsertab, also den kleinen rechteckigen Reiter, der auf dem Viewport sitzt, zu selektieren. In Selenium XPath können Sie den Browsertab nicht auswählen, da er außerhalb des Viewports liegt.

Case-sensitivity abschalten: in RanoreXPath mit Regex (Quelle) – in XPath mit Translate()

Um das x-te Element zu selektieren verwendet man in RanoreXPath: /dom[@domain~’mydomain‘]//div[@class=’header‘][2] und in XPath: (.//div[@class=’header‘])[2]

Um svg-Elemente zu selektieren verwendet man in RanoreXPath so etwas: /dom[@domain~’mydomain‘]//tag[@TagName=’rect‘][13] und in XPath so etwas: (//*[local-name()=’rect‘])[13]

Strings dürfen in RanoreXPath nur in einfachen Anführungszeichen verwendet werden und in XPath können sowohl einfache, als auch doppelte Anführungszeichen verwendet werden. Damit man den Pfad sowohl als RanoreXPath als auch als XPath nutzen kann, sollte man für die Strings einfache Anführungszeichen nutzen.

In RanoreXPath kann man die Frage nach der Sichtbarkeit einbauen (was in Selenium nicht über XPath geht), z.B.: //table[@visible=’true‘]. Dies ist nützlich, weil in manchen Frameworks zwei optisch gleiche Elemente mit der gleichen ID existieren, die sich jedoch in ihren Zuständen unterscheiden. Das eine Element ist sichtbar und das andere nicht, je nachdem welcher Zustand gerade herrscht.

Und/Oder:

  • XPath: .//*[@TagName=’input‘ or @TagName=’select‘ or @TagName=’textarea‘]
  • RanoreXPath: .//*[self::input or self::select or self::textarea]

Im Zusammenhang mit den Pfaden stehend

Falls mehrere Elemente bei einem Pfad matchen, wird bei Selenium immer das erste im DOM zurückgegeben – bei Ranorex entscheidet darüber ein Algorithmus, welches zurückgegeben wird.

In Ranorex wird der innere Text eines bestimmten Elements zurückgegeben. In Selenium wird der konkatenierte Text aller abhängigen Elemente zurückgegeben

Ranorex: Alles zu Screenshots erstellen

Screenshot erstellen

Man braucht kein Ranorex, um in seinem Testfall zwischendurch ein Screenshot zu schießen und zu speichern.
Folgenden Snippet habe ich bereits erfolgreich in einen Ranorex-Testfall eingebaut: https://stackoverflow.com/a/363008/1777526

Ansonsten: Save time with Ranorex 6.0 | Ranorex Blog

Screenshots in separaten Ordner speichern

Das geht nur mit Programmieren (Quelle)

Ranorex Report: In welchem Augenblick werden Screenshots geschossen?

Kann man in den TestSuite-Properties einstellen:

Ranorex Entitäten: Role, Capabilities & Characteristics / Adapter & Element / RepoItem & RepoItemInfo

Role, Capabilities & Characteristics

Allgemein

Das Schaubild aus der Offiziellen Doku:

Im Prinzip geht es immer um Attribute und ihre Werte – das ist für die alltägliche Testautomatisierungs-Praxis das Wesentliche. Die Bedeutung des obigen Schaubilds liegt eher im theoretischen Bereich und zeigt, woher Ranorex Spy die Attribute bekommt und wie es diese zusammenfasst.

Technology bezieht sich wohl auf die Technologie mit der die Application Under Test umgesetzt ist, also z.B. Web, Office, Java, SAP, usw. Jedenfalls die Technologie aus Sicht von Ranorex. Im Desktop-Bereich können das mehrere gleichzeitig sein – im Web-Bereich hingegen ist das ganz einfach: es geht immer um die Webtechnologie, also um die Attribute des Bereichs Web Plugin.

Categories (im Bereich Capabilities) sind die blauen Überschriften:

Tatsächlich sind es 18 (im Schaubild ist die Rede von 15+) und werden alle mit Plugin postfixt und meint die Technologie im Sinne Ranorex. Im Ranorex attributes overview ist zusätzlich noch ganz oben die Kategorie build in roles aufgelistet, wobei m.E. die Spaltenüberschrift hier nicht Capabilities sondern eben Roles lauten müsste.

Beispiel: Google-Logo

Ich habe das Google-Logo mit dem Ranorex Spy getrackt – Folgendes steht nun im Advanced-Tab des Ranorex Spy:

Im Gegensatz zu einer Desktopanwendung hat das Element schon mal die Role Unknown, weshalb auch keine Rollen-spezifische Überschrift im AdvancedTab zu sehen ist.

Als PreferedCapability ist ImgTag angezeigt, wobei das wohl dem Primary Adapter entspricht, der ganz links oben neben dem vorgeschlagenen Namen steht.

Die Attribute im Ranorex Attribute Overview stimmen mit denen im Advanced Tab von Ranorex Spy exakt überein.

Ranorex Spy in action

Am besten macht man sich den Unterschied der ganzen Begrifflichkeiten anhand des Ranorex Spy -> Track -> Hovern über ein bestimmtes Element und studieren des kurz später auftauchenden Tooltips klar:

Im Header:

  • Icon für den nachfolgende Primary Adapter.
  • Primary Adapter: die Haupt-Capability
  • Von Ranorex vorgeschlagener Name in einfachen Anführungszeichen

Role spezifiziert, welche Funktion ein Steuerelement (unabhängig von der verwendeten Technologie) hat, also z.B. handelt es sich um einen Button oder um ein Textfeld (egal ob in einer Webanwendung oder in einer ASP.net-Anwendung). Für die Web-basierte Testautomatisierung hat die Role keine Bedeutung, da Ranorex Spy dort die UI-Elemente ohnehin immer als Unknown kennzeichnet.

Caps: Capabilities. Im Web ist das immer das WebElement und eine spezifischere Capability (also z.B. imgtag). Die spezifischere Capability wird im Header immer als primary adapter angezeigt.

Location: wo beginnt das Element relativ zum Viewport in Pixel

Size: wie groß ist das Element in Pixel

Attributes: alle Begriffe in blauer Schrift. Kennzeichnet die kleinsten Einheiten in diesem Begriffsdschungel, nämlich z.B. Visible oder InnerText

Beispiel Keepass-Button OK

Ich habe den OK-Button beim Windows New Entry in Keepass getracked.

Die Überschriften Button, Control und NativeWindow im Advanced-Tab des Ranorex Spy:

… finden sich im Ranorex attributes overview wieder:

Adapter & Element

Adapter

Capabilities (z.B. ImageTag) sind im Ranorex-Code als Adapter implementiert:

Auch Roles (z.B. Button) sind in Ranorex als Adapter implementiert:

Click() ist beispielsweise eine Methode des Adapters.

Der generierte Ranorex-Code leitet den Adapter aus dem entsprechenden Repoitem her:

Darüber hinaus zählt der Adapter zahlreiche Properties – die Auswahl der wichtigsten:

  • Screenrectangle (Advanced -> Layout) beschreibt X- und Y-Position (ausgehend von der linken oberen Monitorecke) sowie Breite und Höhe. Exakt diese Daten in genau dieser Reihenfolge werden auch optisch unter dem Titel herausgehoben:
  • Flavorname (Advanced -> General) gibt einen Hinweis auf das dahinterliegende Gebilde. Werte von Elementen einer Desktop-Anwendung sind bsps.weise msaa, winforms, win32, chromeweb
  • Location (Advanced -> Dynamic) gibt die X- und Y-Position (ausgehend von der linken oberen Ecke des Parent-Elements) an. (Achtung: Es gibt in Ranorex auch irritierenderweise eine Klasse Ranorex.Location, deren x- und y-Werte jedoch die Distanz zur oberen linken Ecke des Elements selbst darstellt.)

MyRepoObject.Element.Location.X

WebElement ist eine Subklasse von Adapter und hat z.B. die zusätzliche Methode getInnerHTML():

Element

Element im allgemeinen Sinne

Bestandteil einer UI.

Element (im Sinne der Ranorex-library)

Dieser Post fasst die aktuellen(?) Unklarheiten gut zusammen – ein user postete einen interessanten Erklärungsversuch.

Hier ein Post, der das Verhältnis von Element und Adapter skizzieren dürfte.

RepoItem, RepoItemInfo & Adapter

RepoItem

RepoItem: am 17.8.2022 habe ich bei einem <i>-Element die Beobachtung gemacht, dass Ranorex, wenn es mit dem entsprechenden RanoreXPath eigentlich mehrere <i>-Elemente auf der Webseite selektieren würde, es nur das erste nahm.

RepoItemInfo

RepoItemInfo: What’s a RepoItemInfo and how do you use it? – Ranorex Forum

Eine in einer Actiontable erzeugte Validierungsaction, nutzt im dahinterliegenden Code nicht das repoItem, sondern das repoItemInfo, z.B.

Validate.Exists(repo.StartPage.SuchfeldInfo);

Ein in einer Actiontable erzeugtes Wait, nutzt im dahinterliegenden Code ebenfalls das repoItemInfo, z.B.

repo.StartPage.SuchfeldInfo.WaitForExists(5000);
//oder:
repo.StartPage.SuchfeldInfo.WaitForAttributeEqual(5000, "Id", "yourValue");

Ein repoItem hat gar keine WaitForExists-Methode:

und auch keine sonstige Wait-Methode …

Wie komme ich von RepoItemInfo zu Adapter

Es gilt jedoch zu beachten, dass FindAdapter<WebElement> immer einem spezifischen Adapter vorzuziehen ist, weil bei der Änderung eines Elements von beispielsweise <div> auf <td> folgende Fehlermeldung kommt:

Item myRepository.okButton is no DivTag.
The element does not support the required capability ‚divtag‘.

Wie komme ich von RepoItem zu Adapter

var okButtonAdapter = myrepo.okButton; // hier wird der Adapter erzeugt, der im repository item gespeichert ist, beispielsweise WebElement
okButtonAdapter.Click();

Wie komme ich von Adapter zu RepoItemInfo

aktuell gar nicht (Quelle)

mit Hilfe von Adapter.GetPath() bekommt man zwar einen RanoreXPath, dieser ist jedoch nicht der ursprünglich vom Testautomatisierer eingegebene, sondern ein „künstlich“ generierter:

string RxPath = webElement.Element.GetPath(PathBuildMode.Default);