Er zijn echter manier om dit soort problemen flink te verminderen. Maar de belangrijkste les om dit doel te bereiken, vraagt misschien voor sommige testers een flinke stap: ga niet uit van record-and-play. Als record-and-play een item voor je vastlegt in het testscript, zal dit te vaak op een manier zijn die niet geschikt is voor een veranderende applicatie. Daarom zal je als tester zelf moeten leren hoe je objecten op een pagina uniek kan identificeren. Tenminste, als je je testscript meer geschikt wil maken voor veranderingen.
Leer de HTML-structuur
De eerste stap is het leren lezen van een HTML pagina. Je hoeft niet alles te snappen, je moet wel weten hoe je de structuur van een HTML pagina kan herkennen. En je moet weten hoe je in de HTML code een specifieke knop of afbeelding kan terugvinden. Elke programmeur kan je vertellen hoe je dit doet en welke tools hiervoor geschikt zijn. Om deze blog niet te lang te maken, zal ik dit daarom niet beschrijven.Leer zelf elementen herkennen
Voor de tweede stap moet je je testautomatiseringstool beter leren kennen. Leer hoe je tool elementen kan identificeren en leer hoe je deze identificatie zelf aanpast. Hieronder staan de leerdoelen beschreven, die je, naar mijn ervaring, bij voorkeur moet kunnen toepassen. Zelf heb ik meestal gebruik gemaakt van Selenium IDE. Bij Selenium IDE kan je gebruik maken van XPath of CSS-selectors om elementen te vinden. Voor onderstaande leerdoelen zal ik dan ook alvast het XPath of de CSS-selector meegeven.1. Een deel van de waarde van een attribuut selecteren
Een voorbeeld van een attribuut met een waarde is type="submit" . Het kan echter handig zijn om bij langere waardes slechts een deel van de waarde te kunnen selecteren. Dit is bijvoorbeeld verstandig als de naam of het id, de meest gebruikte attributen bij testautomatisering, niet bij elke versie van de applicatie dezelfde waarde hebben. Sommige programmeertalen geven een element bij elke versie een ander id of een andere naam. Dit gegenereerde deel is vaak herkenbaar door een numerieke waarde of een onleesbaar stukje met letters en cijfers. Maar bijna altijd is er ook een deel wat de functionaliteit van het element beschrijft, b.v. id="btn_zoek939" of id="input_G4K9L_surname". Als je dit deel van de waarde gebruikt, is het niet nodig om elke versie je testscript aan te passen.
HTML-code = <INPUT id="input_G4K9L_surname">
XPath = //INPUT[contains(@id,'surname')]
CSS-selector = input[id*=surname]
2. Tekst herkennen
Tekst op een HTML pagina is niet bepaalt een vast gegeven. Teksten worden regelmatig aangepast. Daarom is tekst vaak niet verstandig om te gebruiken bij het identificeren van elementen. Er zijn echter uitzonderingen op deze regel. De meest voorkomende hiervan is "selecteren op basis van gegevens". Soms moet je in b.v. een filterlijst of een zoekresultatenlijst altijd een bepaalde waarde selecteren of openen. Bijvoorbeeld in een filterlijst wil je altijd "Duitsland" selecteren. Of in een tabel met aangeboden producten wil je altijd de stofzuiger openen. Als deze concrete waarde nergens in een attribuut terug te vinden is, dan zal je het element voor deze keuze aan de hand van de tekst moeten herkennen.
HTML-code = <TD>Stofzuiger</TD>
XPath = //TD[contains(text(),'Stofzuiger')]
3. Het zoveelste attribuut selecteren
Als er op een pagina lijsten voorkomen, bijvoorbeeld tabellen voor een productkeuze of checkboxlijsten voor filteren, is het soms moeilijker om een element te vinden. Als je altijd de eerste optie kiest, zal dit vaak niet veel problemen opleveren. Maar het is regelmatig ook verstandig om (ook) de derde of zevende te kiezen. Dan moet je kunnen tellen om een element te herkennen.
In een andere situatie heb je soms elementen onder elkaar, die hele verschillende gegevens bevatten, maar op geen enkele manier uniek te herkennen zijn. In een tabel staat bijvoorbeeld in de eerste kolom de naam van een persoon, in de tweede kolom het adres en in de derde kolom het telefoonnummer. Maar alle teksten staan in het standaard HTML-element voor een kolom, namelijk <TD>. Ook dan moet je, om het adres te kunnen controleren, weten hoe je het tweede <TD> element moet selecteren. In onderstaande uitwerking wordt van deze situatie uitgegaan.
HTML-code= <TR><TD>Jan de Visser</TD><TD>Damplein 4</TD><TD>0123-456789</TD></TR>
XPath = //TR/TD[2]
CSS-selector = tr>td:nth-of-type(2)
4. Terug naar de parent
Het is verstandig om de identificatie van een element zo dicht mogelijk bij het element zelf te houden. Hoe dichter je namelijk bij het element blijft, hoe kleiner de kans dat wijzigingen in de opmaak een wijziging in je testscript veroorzaken. Als je de vierde rij in een tabel selecteert, begin je daarom bij voorkeur bij het selecteren van de tabel en ga je daarna naar de vierde rij.
Maar stel dat je vanaf het geselecteerde element steeds naar het element kijkt waar dit element een deel van uitmaakt, ook wel de parent genoemd. En daarna weer naar de parent van de parent. En dan naar de parent van de parent van de parent. Soms kunnen al die elementen zo algemeen beschreven zijn en zo vaak voorkomen, dat je een hele lange rij van parents hebt, voor je een uniek element kan vinden. Dan kan het verstandig zijn om niet naar de parent te kijken, maar naar een ander uniek element in de buurt.
Stel dat je bijvoorbeeld een samenvatting van een bon hebt. Deze staat in de tabel weergegeven. Onderaan de bon staat de tekst "Totaalprijs €14,73". De tekst "Totaalprijs" staat in de eerste kolom. Het bedrag in de tweede. Je kan er dan vrij veilig vanuit gaan dat de tekst "Totaalprijs" altijd voor het bedrag zal blijven staan. En de tekst "Totaalprijs" zal waarschijnlijk ook niet zo vaak wijzigen. In je testscript kan je dan het element met de tekst "Totaalprijs" selecteren. Hierna ga je naar de parent van dit element. Vervolgens ga je dan naar het element van de totaalprijs.
HTML-code = <TR><TD>Totaalprijs</TD><TD>€14,73</TD></TR>
XPath = //TD[contains(text(),'Totaalprijs')]/../TD[2]
Blijf proberen
Als je de HTML-structuur kan lezen en de bovenstaande leerdoelen in de vingers hebt, blijf dan proberen de beste identificatie voor je elementen te vinden. Wanneer je op een bepaalde plek veel moet wijzigen, kijk dan eens of de identificatie anders kan. De belangrijkste algemene tips zijn:
1. Blijf zoveel mogelijk van beschrijvende attributen uitgaan, die een zo klein mogelijke kans op wijzigingen hebben
2. Blijf zo dicht mogelijk bij het element zelf, door zo weinig mogelijk naar een parent te gaan
De oplossing blijft voor elke applicatie anders. Maar er is altijd wel een oplossing.