Testautomation för WebApplikationer – Selenium
Skrivet av:
Paul Arcombe,
Certified ISTQB Foundation SoftwareTester,
Örestad-Linux, Malmö
Projektet går ut på att
- Undersöka vad Selenium kan erbjuda inom automatiserad test av webapplikationer.
- Installera och sätta upp Selenium.
- Bygga och slutligen använda enskilda tester med hjälp av Selenium.
- Att sätta upp och få igång en fungerande testmiljö bestående av Selenium, Java och JUnit
- BASICS: Hur man använder testsviter/multipla test från Selenium m.h.a. Java och JUnit.
- ADVANCED (I): Skriva/modifiera skript m.h.a. skriptspråket Selenese.
- ADVANCED (II): Loggar, Test sammanfattningar och Test rapporter
Projektet är avsett att uppdateras en gång per vecka, med start 091116. Avslutat 091231.
Kapitel 6: ADVANCED (I): Skriva/modifiera skript m.h.a. skriptspråket Selenese.
Inledning.
I detta kapitel skall vi titta lite närmare på skriptspråket Selenese’s vanligaste kommandon, och hur de kan tillämpas. Detta är ett område som kan bli hur djupgående som helst, därför går vi bara igenom det absolut enklaste och mest användbara.
Vill du ha en djupare studie rekommenderas du att gå till Seleniums Reference Manual här . För att gå igenom koncepten för selenium locators och de olika kommando som finns tillgängliga finns det en komprimerad version av manualen här.
Jag rekommenderar bestämt att du åtminståne skummar igenom den komprimerade versionen av manualen. Annars kan du förlora mycket tid, helt i onödan när du ställs inför olika syntaxproblem (och det kommer du att göra) då du skall redigera dina testsviter. Naturligtvis gäller denna anmodan endast de som skall arbeta med Selenium. De som bara läser denna serie för att bilda sig en uppfattning om Selenium kan glatt nöja sig med att läsa igenom nedanstående kondensering av de vanligaste Selenese-kommandona.
“SELENESE” SELENIUM KOMMANDO – SNABBGENOMGÅNG
Assertion och Verification
Att välja mellan assert och verify beror på vad som känns bekvämt och hantering av fel. Det är ingen ide att testa om första paragrafen på en sida är korrekt eller ej om ditt test redan har misslyckats när det kontrollerade om browsern visade den förväntade sidan. Om du inte är på korrekt sida vill du sannolikt avbryta ditt testfall så att du kan undersöka orsaken till varför och fixa det problemet direkt. Å andra sidan, du vill kanske kontrollera många attribut av en sida utan att avbryta testfallet efter det första felet, så detta ger dig möjlighet att se gå igenom alla fel på en sida innan du angriper problemen. I princip kan man säga att vid en assert kommer testet att misslyckas och avbrytas, medan vid en verify kommer testet att fortsätta köras då det misslyckas.
Bästa användningen av denna egenskap är att logisk gruppera dina test kommando, och starta varje grupp med en assert följd av ett eller flera verify kommando. Se exempel nedan.
| open | /download/ | |
| assertTitle | Downloads | |
| verifyText | //h2 | Downloads |
| assertTable | 1.2.1 | Selenium IDE |
| verifyTable | 1.2.2 | June 3, 2008 |
| verifyTable | 1.2.3 | 1.0 beta 2 |
Ovanstånde exempel öppnar först en sida och gör sedan en assert att korrekt sida är laddad genom att jämföra titel med förväntat värde. Endast om detta stämmer kommer följande kommando att köra och verify att texten finns där den förväntas vara. Testfallet gör sedan en assert på den första kolumnen i den andra raden av den första tabellen, om denna har det förväntade värdet, och endast om detta passerar, kontrolleras de resterande cellerna i den raden och slutligen görs verify på resten.
Lokalisera Element
För många Selenium kommando krävs ett mål. Detta mål identifierar ett element i en webb applikations kontext och består av lokaliseringsstrategien följd av lokaliseringen i formatet locatorType=location. Denna locator type kan tas bort och en av default strategierna kommer att användas beroende på de första tecknen i lokaliseringen. De olika lokaliseringstyperna förklaras nedan med exempel för var och en.
Lokalisera med identifier
Detta är troligtvis den vanligaste metoden att lokalisera element och den huvudsakliga default metoden när det inte finns någon identifierbar locatortyp att använda.Med denna strategien hittar man lokaliseringen som matchar elementet med @id attribut värdet
- identifier=loginForm
- identifier=username
- identifier=continue
Till exempel, din page source har identifier(ID) och name attribut enligt följande:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Continue" /> </form> </body> <html>
Lokaliseras med id
Denna är mer begränsad än identifier locator type men också mera explicit. Denna skall användas när du känner ett elements @id attribute.
- id=loginForm
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Continue" /> </form> </body> <html>
Lokalisera med name
I likhet med identifier locator type när ett @id attribut inte hittas, kommer name locator type att hitta det första elementet som matchar @name attributet. Om multipla element har samma värde för ett name attribut kan du använda filter för att ytterligare förfina din sökning.Default filtertyp är value (matcha @value attributet).
- name=username
- name=continue
- name=continue Continue
- name=continue value=Continue
- name=continue
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Continue" /> </form> </body> <html>
Lokalisera med XPath
XPath är språket man använder för att lokalisera noder i ett XML dokument. Eftersom HTML kan vara en implementering av XML (XHTML) kan Seleniumanvändare använda sig av detta kraftfulla språket för att hitta element i sina webb applikationer. XPath sträcker sig bortom de enkla sökmetoderna för @id och @name attribut, och öppnar upp alla sorters nya möjligheter såsom ”att hitta den tredje checkboxen på sidan” och liknande.
En av huvudanledningarna att använda XPath är när du inte har ett lämpligt @id eller @name attribut för det element du avser att hitta. Du kan använda XPath antingen för att finna elementet i absoluta termer (inte att rekommendera), eller i relativa för ett element som har ett @id eller @name attribut.
Absoluta XPath innehåller lokaliseringen för alla element från root (HTML) och som resultat kommer dessa sannolikt att misslyckas då man gör minsta lilla ändring i applikationen. Genom att hitta ett närliggande element med @id eller @name attribut (idealisk: ett huvudelement) kan du lokalisera ditt målelement baserat på deras förhållande. Ett sådant förhållande är inte sannolikt att det ändras när man förändrar applikationen vilket gör testen mera robusta.
- xpath=/html/body/form[1] – Absolute path (would break if the HTML was changed only slightly)
- xpath=//form[1] – First form element in the HTML
- xpath=//form[@id=’loginForm’] – The form element with @id of ‘loginForm’
- xpath=//form[input/@name=’username’] – First form element with an input child element with @name of ‘username’
- xpath=//input[@name=’username’] – First input element with @name of ‘username’
- xpath=//form[@id=’loginForm’]/input[1] – First input child element of the form element with @id of ‘loginForm’
- xpath=//input[@name=’continue’][@type=’button’] – Input with @name ‘continue’ and @type of ‘button’
- xpath=//form[@id=’loginForm’]/input[4] – Fourth input child element of the form element with @id of ‘loginForm’
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Continue" /> </form> </body> <html>
Dessa exempel täcker en del basics, men för att verkligen kunna ta till vara fördelarna rekommenderas följande referenser:
- W3Schools XPath Tutorial
- W3C XPath Recommendation
- XPath Tutorial – with interactive examples.
Det finns även några mycket användbara FireFox Add-ons som kan vara till hjälp då man utforskar XPath av ett element:
- XPath Checker – suggests XPath and can be used to test XPath results.
- Firebug – very useful, XPath suggestions are just one of the many powerful features of this add-on.
Lokalisera hyperlänkar med link text
Detta är en enkel metod att lokalisera en hyperlänk i din webbsida genom att använda länkens text. Om det finns två länkar med samma text, kommer den första matchningen att användas.
- link=Continue
- link=Cancel
<html> <body> <p>Are you sure you want to do this?</p> <a href="continue.html">Continue</a> <a href="cancel.html">Cancel</a> </body> <html>
Lokalisera med DOM
DOM (Document Object Model) representerar ett HTML dokument och kan köras mha JavaSkript. Denna lokaliserings strategi leder JavaSkript som utvärderar till ett element på en sida, genom att använda sig av hierarkisk punkt notation.
- dom=document.getElementById(‘loginForm’)
- dom=document.forms[‘loginForm’]
- dom=document.forms[0]
- dom=document.forms[0].username
- dom=document.forms[0].elements[‘username’]
- dom=document.forms[0].elements[0]
- dom=document.forms[0].elements[3]
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Continue" /> </form> </body> <html>
Du kan använda Selenium själv såväl som andra siter och extensions för att utforska DOM av din webbapplikation. En bra referens finns på W3Schools.
Lokalisera med CSS
CSS teknik kan även den användas som lokaliseringsteknik, men det ligger utanför denna beskrivning att förklara. Den som gillar CSS kan själv testa denna metod (se i Reference Manual för närmare beskrivning).
”AndWait” kommandon
Skillnaden som en användare borde se mellan ett kommando och dess AndWait alternativ är att det vanliga kommandot (t.ex. click) kommer att utföra händelsen och fortsätta med nästkommande kommando direkt efter. Medan AndWait-alternativet (t.ex. clickAndWait) ger Selenium instruktion att vänta tills sidan laddats efter det att händelsen har utförts.
Detta är viktigt att tänka på att lägga in i koden för att förhindra att testet skenar iväg. Man använder t.ex. alltid AndWait alternativet när en händelse får webbläsaren att navigera till en annan sida eller gör en reload på den nuvarande.
Du har nu gått igenom Seleniums kommandospråk Selenese. Efter detta föväntas du kunna redigera, modifiera och ändra dina testfall så de fungerar enligt de kravspecifikationer som du ställs inför efterhand som du skall testa olika webbapplikationer. Du är nu klar att gå vidare till det sista kapitlet i denna serie, där vi försöker knyta ihop säcken med loggar, rapporter och lite nyttiga tips.
