Selenium remote control – testování AJAXu a další finty
Na posledním projektu jsem dělal větší část práce na GUI a nehodlal jsem stále dokola klikat jak cvičená opice a raději jsem si dal trochu práce s nasazením Selenium remote control. Nešlo ani tak o jednotkové testy jako spíš o integrační a regresní testování. Zvolil jsem remote control a ne plugin do firefoxu (Selenium IDE), protože takto jsem měl k dispozici servisní vrstvu a mohl kontrolovat zápis do databáze. Potřeboval jsem ale pokročilejší postupy než ty, které naleznete v getting started, a o ty bych se s vámi rád podělil.
Firefox 3
Přečtěte si návod jak zprovoznit selenium remote control s firefox 3
AJAX
Pro testování AJAXu můžete využít vlastní aktivní čekání nebo elegantněji použít metodu waitForCondition a nastavit i timeout čekání.
Například chcete testovat, zda se po kliknutí na link add hoo přidá nějaký DOM element identifikovaný id hoo-1
selenium.click( "link=add hoo" );
selenium.waitForCondition( "selenium.browserbot.getCurrentWindow().document.getElementById('hoo-1')", MAX_WAIT_TIME_IN_MS );
Analogicky mazání, všimněte si zejména podmínky === null
selenium.click( "link=remove hoo" );
selenium.waitForCondition( "selenium.browserbot.getCurrentWindow().document.getElementById('hoo-1') <b>=== null</b>", MAX_WAIT_TIME_IN_MS );
Dynamicky generované DOM id
I dynamicky generované DOM id je snadné testovat. Potřebujete-li například znát id nově přidaného elementu hoo, zjistíte si nejprve pomocí XPath počet těch stávajících.
int nextHooIndex = selenium.getXpathCount( "//div[contains(@id,'hoo-')]" ).intValue();
Rychlost klikání
Výchozí nastavení je, že selenim kliká jak zběsilé bez jakéhokoliv prodlení a to se pak dějí věci. Doporučuji nastavit nějaké rozumné zpoždění, třeba vteřinu, alespoň můžete vizuálně kontrolovat, co se děje.
selenium.setSpeed( "1000" );
Psaní teček
Bug SEL-519 jsem vyřešil podle návodu na stackoverfow.com
Prostě nemůžete do formuláře napsat tečku, takže musíte string podle teček splitnout a napsat po částech. Tečka se napíše následovně.
selenium.getEval("window.document.getElementById('fooId').value += '.'");
Simulace psaní a test našeptávače
Past je ve vyplňování formulářů, selenium.type zajistí zapsání stringu do DOMu, ale potřebujete-li testovat třeba našeptávač, použijte selenium.typeKeys ale ještě předtím potřebujete na prvek získat focus
Nabízenou možnosti z našeptávače potvrdíte entrem následovně
selenium.keyDown( "//input[@id='myInput']", "\\13" );
Confirm dialog
Otevření a potvrzení confirm dialogu provedete následovně
assertEquals("Are you sure to delete foo?", selenium.getConfirmation())
XPath
Pro efektivní práci se seleniem budete potřebovat znalost XPath, můžete začít třeba na w3school.com Hodí se i plugin do firefoxu - XPather
Závěr
Psaní testů vyžaduje čas a u selenium testů to platí dvojnásob. A právě čas bývá nejčastější výmluva, proč testy nepsat. Snad vás nemusím přesvědčovat, že selenium vám v důsledku spoustu času ušetří. Navíc je to tak pohodlné pustit selenium testy a mezitím chvilku vydechnou a místo usilovného a soustředěného klikání, do kterého se vám už po sté nechce, si vychutnat kafe.