Um das Testen mit Bilderkennung praktisch zu erproben, wurde ein bestehender Testfall aus einer Web-Anwendung nachgebaut. Der Test umfasst die Anmeldung, zweimal einen neuen Autor mit dem (gleichen) Namen „Hans“ anzulegen und zu prüfen, ob die eben erstellten Einträge auch wirklich existieren. Zuerst mit Eggplant und dann mit UI.Vision implementiert. Abschließend der Original-Testfall mit dem Ruby on Rails Framework – das übliche Testen ohne Bilderkennung.
Das kommerzielle Produkt Keysight Eggplant Digital Automation Intelligence bietet automatisierte Tests mit Bilderkennung. Durch das Recording kann das Test-Skript im Format SenseTalk einfach erstellt und dabei die Bilder gesammelt werden. Für das Beispiel waren es 10 Einzelbilder. Im Video sieht man die erkannten Bilder orange umrandet.
Bei dem Bild-basierten Testen kommt optische Zeichenerkennung zum Einsatz. Um die Nummer des neuen Eintrags auszulesen, wird ab Zeile 15 zuerst das Bild I_interne_nr.png
gesucht, der Bildschirmbereich rechts daneben berechnet und dann die Nummer mit OCR ausgelesen. Dieser Prozess ist im Video mit grünen Rahmen zu sehen. Die interne Nummer des neuen Eintrags wird in Zeile 19 ausgegeben (blauer Eintrag im Log, links im Video) und dann in Zeile 24 genutzt, um die URL des neuen Eintrags einzugeben.
Das System Under Test (SUT) wird über RDP oder VNC gesteuert. Da die Web-Anwendung in der Test- und Entwicklungsumgebung schon einen Selenium mit Headless Chromium Container nutzt, kann der Chromium Docker Container gleich als SUT genutzt werden.
verwendeter Bildname | Bild |
---|---|
I_login.png | |
I_anmelden.png | |
I_autoren.png | |
I_autor_anlegen.png | |
I_speichern.png | |
I_author_success_hans.png | |
I_interne_nr.png | |
I_browser_URL.png | |
I_browser_URL_selected.png | |
I_logout.png |
1# /authors/new with Eggpplant SenseTalk
2## login
3Click "I_login"
4TypeText "first_user",Tab,"first_user_password"
5Click "I_anmelden"
6WaitFor 15, "I_login_success_first_user"
7
8## create 1st author "Hans"
9Click "I_autoren"
10Click "I_autor_anlegen"
11TypeText "Hans"
12Click "I_speichern"
13WaitFor 15, "I_author_success_hans"
14## read number to the right of "Interne Nr."
15put the topright of ImageRectangle("I_interne_nr") into TopLeft
16put the bottom of ImageRectangle("I_interne_nr") into Bottom
17put the RemoteScreenSize's width into Right
18put ReadText([(TopLeft),[Right, Bottom]]) into Author_Id_1
19log "1st new autor id is " && Author_Id_1
20## check 1st author
21Click "I_autoren"
22Click "I_browser_URL"
23Click "I_browser_URL_selected"
24TypeText "/",Author_Id_1,Return
25WaitFor 15, "I_name_hans"
26
27## create 2nd author "Hans"
28Click "I_autoren"
29Click "I_autor_anlegen"
30TypeText "Hans"
31Click "I_speichern"
32WaitFor 15, "I_author_success_hans"
33## read number to the right of "Interne Nr."
34put ReadText([(TopLeft),[Right, Bottom]]) into Author_Id_2
35log "2nd new autor id is " && Author_Id_2
36## check 2nd author
37Click "I_autoren"
38Click "I_browser_URL"
39Click "I_browser_URL_selected"
40TypeText "/",Author_Id_2,Return
41WaitFor 15, "I_name_hans"
42
43# logout
44Click "I_logout"
UI.Vision RPA (Robotic Process Automation) mit Selenium IDE für die Web-Anwendung und Desktop Test-Automatisierung wurde in der Version 6.3.3. verwendet. Es gibt einen Free Plan, neben den kommerziellen Angeboten in Pricing. Aus den mitinstallierten Demo-Skripts lässt sich viel lernen. OCR funktioniert in der Cloud mit 100 Scans täglich in der Gratis-Version.
UI.Vision RPA speichert Bilder mit der DPI-Auflösung im Dateinamen ab, um bei anderen Bildschirmauflösungen die Bilder umrechnen zu können. Die Angabe DPI (Dots Per Inch) zu den Bildern funktionierte schwierig. Auf Windows musste die Bildschirmauflösung auf 100% und in Chrome der Seitenzoom auf 100% gestellt werden, damit die Bilder wiedererkannt wurden. Auf einem 5k Retina iMac wurden die Bilder mit dpi_96 aufgenommen, aber die Erkennung funktionierte nicht. Der Bildschirm hat auch 218 dpi. Durch Ausprobieren mit dem Find-Button und variieren der conf (confidence, Zuversichtlichkeit @0.6) wurde dann dpi_192 gefunden und alle Bilder darauf korrigiert. Hilfreich ist es auch, die Bildschirmfotos (captured screenshoots) zu prüfen. Bei einer falschen DPI ist der Bildausschnitt verschoben. Alles ein wenig magisch.
Das Bild interne_number_dpi_96.png
zeigt mit grünem Rahmen das zu suchende Bild und mit rotem Rahmen den OCR-Bereich, aus dem die erstellte Nummer ausgelesen wird.
Mit dem Modus „Record” werden Bildschirmabläufe aufgezeichnet. UI.Vision RPA nutzt dazu neben Bildern auch die Selenium IDE. Mit dem Kommando clickAndWait
werden Aktionen auf DOM-Elementen ausgelöst und mit XPath
(XML Path Language) Elemente gefunden. Daher sind hier weniger Bilder nötig.
verwendeter Bildname | Bild |
---|---|
author_created_dpi_96.png | |
author_fields_dpi_96.png | |
interne_number_dpi_96.png |
1store http://localhost:8102/ "url"
2open ${url}
3setWindowSize "1024x768"
4click linkText=Login
5type id=user_session_login "first_user"
6type id=user_session_password "first_password"
7clickAndWait name=commit
8click linkText=Autoren
9clickAndWait xpath=//*[@id=\content\]/form/button
10type id=author_name "Hans"
11clickAndWait name=commit
12visualAssert author_created_dpi_96.png@0.8
13OCRExtractRelative interne_number_dpi_96.png@0.8 "author_1"
14echo First new author id is ${author_1} "darkgreen"
15open ${url}
16open ${url}/authors/${author_1}
17visualAssert author_fields_dpi_96.png@0.8
18click linkText=Autoren
19clickAndWait xpath=//*[@id=\content\]/form/button
20type id=author_name "Hans"
21clickAndWait name=commit
22visualAssert author_created_dpi_96.png@0.8
23OCRExtractRelative interne_number_dpi_96.png@0.8 "author_2"
24echo Second new author id is ${author_2} "darkgreen"
25open ${url}
26open ${url}/authors/${author_2}
27visualAssert author_fields_dpi_96.png@0.8
28click linkText=Logout
Der UI.Vision RPA Test als ZIP-Archiv: authors_new.zip
Zum Vergleich ist hier der ursprüngliche Testfall aus der Web-Anwendung quote. In dem Ruby on Rails Web-Framework basiert der System-Test auf Basis von Capybara, Selenium und Headless Chromium. Wenn man in der Entwicklung sowieso im Web-Framework ist, dann ist der Test dort kürzer und einfacher zu schreiben. Zum Beispiel gibt die Methode Author.last
die ID des zuletzt angelegten Autor-Eintrags und der im Framework generierte Helper author_url
die dazu gehörende URL. Der Test geht dann auch so schnell, dass im Video kaum etwas zu sehen ist.
1# /authors/new
2test "create two authors with same name" do
3 new_author_name = 'Hans'
4 ## login
5 visit login_url
6 fill_in 'user_session_login', with: 'first_user'
7 fill_in 'user_session_password', with: 'first_user_password'
8 click_on 'Anmelden'
9 ## create 1st author "Hans"
10 check_page page, new_author_url, "h1", "Autor anlegen"
11 fill_in 'author_name', with: new_author_name
12 click_on 'Speichern'
13 check_page page, author_url(Author.find_by_name(new_author_name)), "h1", "Autor"
14 # it is possible to have two authors with the same name
15 check_page page, new_author_url, "h1", "Autor anlegen"
16 fill_in 'author_name', with: new_author_name
17 click_on 'Speichern'
18 check_page page, author_url(Author.last), "h1", "Autor"
19end