Back to QA Automation
Selenium & WebDriver
Vad är Page Object Model (POM)?
Ett designmönster där varje sida i applikationen representeras av en klass. Klassen innehåller element (lokaliserare) och metoder för att interagera med dem, vilket separerar testlogik från UI-detaljer.
Förklara Implicit vs Explicit vs Fluent Wait.
Implicit: Standard väntetid för alla element. Explicit: Väntar på ett specifikt villkor (t.ex. synlighet). Fluent: Explicit väntan med polling-intervall och ignorerade undantag.
Vilka olika lokaliserare finns i Selenium?
ID, Name, Class Name, Tag Name, Link Text, Partial Link Text, CSS Selector, XPath.
Skillnad mellan driver.close() och driver.quit()?
close() stänger det nuvarande fokuserade fönstret. quit() stänger alla fönster och avslutar WebDriver-sessionen.Vilka är de grundläggande CSS-selektorerna för att hitta element?
Via id (
#submit-btn), klass (.btn-primary), tagg (button) och kombinerade för specificitet (button.btn-primary, form#login-form). En bra testselektor är stabil (överlever layoutändringar), unik (matchar exakt ett element) och läsbar.Varför är data-testid-attribut den föredragna lokaliseraren?
data-testid-attribut läggs till specifikt för testning, så de ändras inte när stil eller layout ändras — till skillnad från CSS-klasser eller genererade klassnamn. Rekommenderad prioritet: data-testid, sedan aria-label/role, sedan ett stabilt #id, sedan semantiska attribut som [name], och positionsbaserade selektorer endast som sista utväg.Hur hjälper CSS-kombinatorer och pseudoklasser i testselektorer?
Kombinatorer uttrycker relationer: ättling (
form input), direkt barn (ul > li), intilliggande syskon (label + input). Pseudoklasser riktar in sig på tillstånd och position: input:checked, button:not(:disabled), li:first-child, tr:nth-child(2). Föredra tillstånds-/relationsselektorer framför absoluta positioner, som går sönder när DOM ändras.När bör man använda XPath i stället för CSS-selektorer?
Använd XPath när du behöver välja på synlig text (
//button[text()='Login']), navigera till en förälder eller förfader (/.., parent::), eller uttrycka komplexa logiska villkor (and/or/not). CSS är enklare och något snabbare men kan inte välja på text eller gå uppåt i trädet. I Selenium/Playwright är prestandan i praktiken likvärdig.Hur fungerar XPath-predikat och positioner?
Predikat filtrerar inom hakparenteser:
//input[@id='email'], //*[@data-testid='login-btn']. Positioner är 1-baserade, inte 0-baserade: //li[1] är den första, //li[last()] den sista, //tr[position()>1] hoppar över en rubrikrad. Föredra attributpredikat framför positionsbaserade för stabilitet.Vilka XPath-funktioner är mest användbara för testning?
text() väljer på exakt text, contains() gör delvis matchning på text eller attribut (//div[contains(@class,'error')]), starts-with() matchar attributprefix, och normalize-space() ignorerar omgivande blanksteg. Kombinera med and/or/not för precisa och tåliga lokaliserare.Vad är XPath-axlar och när behöver man dem?
Axlar navigerar DOM-trädet relativt en nod:
parent:: (eller /..), ancestor::, descendant::, following-sibling::, preceding-sibling::. De är centrala för kontextbaserad lokalisering, t.ex. hitta en label via text och sedan dess input: //label[text()='Email']/following-sibling::input, eller en knapp i raden som innehåller 'Alice': //tr[td[text()='Alice']]//button.Hur skriver man robusta lokaliserare för dynamiska element?
När id:n och klasser är autogenererade (
id='input-7f83b', class='btn-a3f2'), förankra i stabila relationer och innehåll i stället: lokalisera via synlig text eller en närliggande label och navigera till målet (//label[text()='Användarnamn']/following-sibling::input), eller avgränsa via en rads innehåll (//tr[.//td[text()='Alice']]//button). Attributen aria-label och role är också stabila ankare.Vilka lokaliserar-antimönster bör man undvika?
Undvik absoluta sökvägar (
/html/body/div[2]/form), djupa sköra kedjor (div > div > div > span), genererade klassnamn (.sc-bdfxgf, .btn-78sf32), ramverksinterna klasser (.MuiButton-root) och hårda positionsindex (li:nth-child(4)) som går sönder när ett element läggs till. Föredra semantiska, avsiktsavslöjande lokaliserare som [data-testid] eller [aria-label].