This is UltimateRPA Documentation
Robotická interakce

Robotická interakce a vlastnosti elementu GUI

Robot UltimateRPA pracuje s aplikací stejně jako běžný uživatel. Může například aktivovat tlačítka pod kurzorem myši nebo používat klávesové zkratky. V tomto návodu si vyzkoušíme jak na to.

Příprava prostředí

Nejdříve si připravíme kód pro spuštění aplikace RpaLoginTest. Naimportujeme modul urpa. Funkcí condition_factory si vytvoříme konstantu cf. Definujeme si funkci main, ve které pomocí funkce set_debug_mode spustíme robota v debuggovacím režimu, který nám nalezený element GUI zvýrazní zeleným rámečkem a tak se můžeme přesvědčit, že jsme opravdu našli to, co jsme chtěli. Cesta k aplikaci v argumentu funkce exec_app může být absolutní nebo relativní vůči skriptu. Nakonec metodou set_auto_close nastavíme, aby robot spuštěnou aplikaci po dokončení skriptu neukončil. Pokud s tímto nastavením spouštíte aplikaci přes PyScripter, je nutné jí ukončit před dalším spuštěním robota.

import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaLoginTest.exe")
app.set_auto_close(False)

Cesta k aplikaci "TutorialApps/RpaLoginTest.exe" je relativní od umístění spouštěného skriptu a předpokládá, že skript je uložený v hlavní složce s nástroji UltimateRPA. Pokud je váš skript uložený jinde, nezapomeňte cestu upravit.

Interakce s elementem GUI

Kliknutí myší

Jeden z nejčastějších úkonů, který běžný uživatel při ovládání aplikací používá, je kliknutí myší, a proto si ho ukážeme jako první. Použijeme k tomu aplikaci RpaLoginTest, kterou si bez pomoci robota spustíme. V nástroji Inspector aktivujeme zaměřovač a přeneseme ho na tlačítko Login v aplikaci RpaLoginTest. Zaškrtneme pole checkboxu Name.

RobotInteraction_name_checked.png
Obrázek 1 Nejednoznačná identifikace objektu

Jak můžeme vidět v levé části Inspectoru, vlastnost Name s hodnotou Login nám nestačí k jednoznačnému nalezení požadovaného elementu GUI. Musíme tedy rozšířit naši condition factory o další vlastnost. Zaškrtneme tedy ještě pole Control type. V Search function vybereme find_first a v Type of action vybereme send_mouse_click. Inspector nám v poli Expression vygeneruje výraz app.find_first(cf.button().name("Login")).send_mouse_click(). Ten si zkopírujeme do našeho kódu. Metoda send_mouse_click umístí kurzor na střed elementu a provede kliknutí myší.

RobotInteraction_expression_generated.png
Obrázek 2 Vygenerovaný výraz v Inspectoru
import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaLoginTest.exe")
app.set_auto_close(False)
app.find_first(cf.button().name("Login")).send_mouse_click()

Spustíme robota pomocí klávesové zkratky (ALT + F9) nebo v horním menu PyScripteru vybereme Run a potom External Run. Robot spustí aplikaci RpaLoginTest a klikne na tlačítko Login. Vzápětí aplikace zobrazí chybovou hlášku, že uživatelské jméno nebo heslo je chybné.

RobotInteraction_login_error.png
Obrázek 3 Chybová hláška při přihlášení

Metoda send_mouse_click má dva nepovinné parametry. První se jmenuje action a slouží k nastavení typu akce myši. Například zde můžeme nastavit, jestli chceme stisknout pravé nebo levé tlačítko. Ve výchozím nastavení robot stiskne levé tlačítko myši. Přehled všech možných voleb najdete v dokumentaci funkce set_default_mouse_action. Druhý parametr se nazývá position a umožňuje nám zvolit souřadnice, kam se umístí kurzor, než se provede kliknutí myši. Více informací získáte v dokumentaci send_mouse_click.

Stisknutí klávesy

Při práci s aplikací může uživatel používat i klávesnici. Proto je další na řadě metoda send_key, která provede stisknutí vybrané klávesy. Použití si ukážeme v příkladu na aplikaci RpaLoginTest, kde vyplníme písmeno "u" do pole Username. Zaměřovač Inspectoru přeneseme na příslušný editbox a zaškrtneme Name a Control type, vybereme find_first a jako Type of action zvolíme send_key. Vygeneruje se nám výraz app.find_first(cf.edit().name("Username")).send_key(""), který vložíme do našeho kódu a do dvojitých uvozovek metody send_key vložíme "u".

import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaLoginTest.exe")
app.set_auto_close(False)
app.find_first(cf.edit().name("Username")).send_key("u")

Spustíme skript, který nám spustí aplikaci RpaLoginTest a označí zeleným rámečkem editbox Username a pak do něj vyplní písmeno "u".

RobotInteraction_username_u.png
Obrázek 4 Písmeno "u" zapsané v Username editboxu

Robot nemá problém ani s kombinací kláves. Například můžeme aplikaci ukončit klávesovou zkratkou ALT+F4. Nahradíme řetězec "u" v argumentu metody send_key za "ALT+F4".

import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaLoginTest.exe")
app.set_auto_close(False)
app.find_first(cf.edit().name("Username")).send_key("ALT+F4")

Opět spustíme skript. Robot spustí aplikaci, najde textové pole a aplikaci ukončí klávesou zkratkou ALT+F4. Tato metoda, ale není vhodná pro zadávání textu. Mnohem více se k tomu hodí metoda z další kapitoly.

Vyplnění textu

Abychom textové pole nemuseli vyplňovat po jednom znaku má robot k dispozici metodu send_text, které předáme jako argument řetězec, který robot vyplní do příslušného elementu GUI. Zkusíme si praktický případ opět na aplikaci RpaLoginTest a konečně se zkusíme do aplikace řádně přihlásit. Uživatelské jméno je RPA_test_user a heslo 12345. Myslím, že najít pomocí Inspectoru editboxy pro Username a Password zvládnete už sami. Jako Type of action si nastavte send_text, zkopírujte výrazy do kódu a doplňte o přihlašovací jméno a heslo. Nakonec ještě přidáme řádek s aktivací tlačítka login pomocí metody send_mouse_click.

import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaLoginTest.exe")
app.set_auto_close(False)
app.find_first(cf.edit().name("Username")).send_text("RPA_test_user")
app.find_first(cf.edit().name("Password")).send_text("12345")
app.find_first(cf.button().name("Login")).send_mouse_click()

Spustíme skript a robot nám spustí aplikaci. Vyplní uživatelské jméno a heslo a aktivuje tlačítko login. Objeví se nám nové zpráva, že přihlášení bylo úspěšné.

Vault_login_successful.png
Obrázek 5 Úspěšné přihlášení

Zaměření elementu GUI

Metoda set_focus slouží k nastavení fokusu pro vybraný element GUI. Fokus nastaví element GUI jako aktivní. My zkusíme dát fokus tlačítku Login v aplikaci RpaLoginTest. Tlačítko si označíme pomocí Inspectoru stejně jako v předchozích případech, a protože Type of action možnost set_focus nenabízí, nastavíme ji na (none). Zkopírujeme vygenerovaný výraz do našeho kódu a doplníme ho o volání metody set_focus takže poslední řádek bude vypadat takto app.find_first(cf.button().name("Login")).set_focus().

import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaLoginTest.exe")
app.set_auto_close(False)
app.find_first(cf.button().name("Login")).set_focus()
RobotInteraction_set_focus.png
Obrázek 6 Tlačítko login s fokusem

Spustíme robota a otevře se nám okno aplikace RpaLoginTest a kolem vnitřní hrany tlačítka se udělá tečkovaná čára, která značí, že tlačítko Login dostalo fokus.

Vlastnosti elementu GUI

V některých případech nepotřebujeme s elementem GUI provádět žádnou akci, ale chceme jen znát jeho vlastnosti, například hodnotu, která je vyplněná v textovém poli. Ukážeme si opět několik praktických příkladů, tentokrát na aplikaci RpaTableTest. Nejdříve si připravíme aplikaci podle kódu níže. Tentokrát nebudeme potřebovat debuggovací režim a vlastnosti elementů GUI budeme vypisovat přímo do logu PyScripteru python výrazem print.

import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaLoginTest.exe")

Název a hodnota elementu GUI

V ukázce si vytiskneme do konzole všechny hodnoty v prvním řádku tabulky aplikace RpaTableTest. Najdeme si pomocí nástroje Inspector první řádek. Pokud nevíte jak na to, pomůže vám kapitola Vyhledání elementu v aplikaci. V řádku si pak vyhledáme všechny elementy typu text. Ty pak projedeme cyklem for a vytiskneme si do konzole jejich jméno za použití metody name.

import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaTableTest.exe")
row = app.find_first(cf.list_item().name("1"))
row_elements = row.find_all(cf.text())
for value in row_elements:
print(value.name())

Do konzole se nám zaznamenává spousta užitečných informacích, více si o nich řekneme v kapitolePokročilé lekce. V tuto chvíli nám stačí vědět, že každý příkaz print ve skriptu se do konzole zapíše. Konzoli můžete najít v PyScripteru ve spodním okně v záložce Output.

RobotInteraction_pyscripter_output.png
Obrázek 7 Výstup skriptu v konzoli PyScripteru

Pro získání hodnoty elementu GUI postupujeme stejně, jen místo metody name použijeme value.

Velikost a pozice elementu GUI

Jako další vlastnost zkusíme zjistit velikost obrázku Simply with UltimateRPA a jeho pozici na obrazovce. Inspectorem identifikujeme obrázek a vytvoříme si výraz app.find_first(cf.image()). Ten v našem kódu uložíme do proměnné image. Velikost elementu GUI získáme použitím metody size na objekt image. Velikost je metodou vrácena jako tuple obsahující dvě hodnoty integer. První je šířka elementu GUI a druhá je výška v pixelech. Aktuální pozici elementu GUI na celé obrazovce (Pozor ne v aplikaci!) získáme metodou bounding_rectangle, která pozici vrací jako tuple čtyř hodnot integer v pixelech od levého vrchního rohu. Hodnoty jsou řazeny v pořadí levá, vrchní, pravá, spodní.

import urpa
def main():
app = urpa.exec_app("TutorialApps/RpaTableTest.exe")
image = app.find_first(cf.image())
print(image.size())
print(image.bounding_rectangle())

Po spuštění a po ukončení si prohlédneme konzoli, kde najdeme požadované informace.

RobotInteraction_pyscripter_image.png
Obrázek 8 Výstup skriptu v konzoli PyScripteru

Další vlastnosti elementu GUI

Seznam všech metod, které můžeme nad elementem GUI použít, najdeme v dokumentaci ke třídě AppElement.

Doporučené postupy při interakci s elementy GUI

Načtení aplikace

Při robotizaci je vždy důležité začít pracovat s aplikací, až když je úplně načtená. Proto se nám osvědčila praxe, že než začneme s aplikaci pracovat, vybereme si pro každou obrazovku několik kontrolních elementů GUI, na kterých ověříme, že se obrazovka po předchozí akci stihla nahrát. Pokud je to možné, volíme elementy GUI tak, aby patřili mezi ty, co se na obrazovce objevují jako poslední.

Kontrola vyplněných údajů

Další postup, který se nám v praxi osvědčil je kontrolovat před odesláním formuláře, jestli údaje v nich vyplněné, souhlasí s tím, co jsme vyplnit chtěli. Někdy se může stát, že aplikace na okamžik zamrzne a nereaguje. Robot pak do textového pole nevyplní řetězec celý, ale pouze jen jeho část. Abychom se této a podobným situacím vyhnuli před tím, než formulář odešleme, zkontrolujeme vlastnosti všech elementů, které jsou pro nás důležité, a formulář odešleme jen v případě, že jsou všechny v pořádku.

Přístup k elementu GUI

Někdy se může stát, že Inspector potažmo robot, najdou elementy GUI, které v aplikaci sice jsou, ale nejsou přístupné pro interakci. Například v naší aplikaci RpaTableTest si můžete všimnout, že Inspector ve stromě zobrazí i informace o řádcích v tabulce, které nevidíme a museli bychom scrollovat dolů, abychom se k ním dostali. Takové elementy GUI, i když je robot najde, nejdou ovládat například stisknutím tlačítka myši. Pokud s nimi potřebujeme pracovat, musíme nejdříve elementy GUI zpřístupnit. Toho se dá často docílit pomocí stisku šipek na klávesnici nebo použitím klávesy tabulátoru.