Automatisierte Tests mit Bilderkennung

Screenshot-Ausschnitt zum automatiertes Testen mit OCR

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.

Eggplant Logo

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 Bild des Links Login
I_anmelden.png Bild des Buttons Anmelden
I_autoren.png Bild des Links Autoren
I_autor_anlegen.png Bild des Buttons „Autoren anlegen”
I_speichern.png Bild des Buttons Speichern
I_author_success_hans.png Bild der Nachricht des erfolgreichen Anlegens des Autors
I_interne_nr.png Bild des Feldes „Interner Nr.”
I_browser_URL.png Erstes Bild der Browserzeile
I_browser_URL_selected.png Bild der selektierten Browserzeile
I_logout.png Bild des Links Logout
 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 Logo

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 Bild der Nachricht, der Autor wurde angelegt
author_fields_dpi_96.png Felder des Autor-Eintrags
interne_number_dpi_96.png ID des Autors mit OCR-Bereich in rot
 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

Ruby on Rails Logo

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