Selenium Webdriver Java Programeksempel (eksempelkode)
Selenium Java Eksempel
Brug af Java klasse "myclass", som vi oprettede i den forrige tutorial, lad os prøve at oprette et WebDriver-script, der ville:
Trin 1: hente Mercury Tours' hjemmeside
Trin 2: bekræfte dens titel
Trin 3: udskrive resultatet af sammenligningen
Trin 4: luk den, før du afslutter hele programmet.
Selenium WebDriver eksempelkode
Nedenfor er den faktiske WebDriver-kode for logikken præsenteret af scenariet ovenfor
package newproject; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; //comment the above line and uncomment below line to use Chrome //import org.openqa.selenium.chrome.ChromeDriver; public class PG1 { public static void main(String[] args) { // declaration and instantiation of objects/variables System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); //comment the above 2 lines and uncomment below 2 lines to use Chrome //System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe"); //WebDriver driver = new ChromeDriver(); String baseUrl = "http://demo.guru99.com/test/newtours/"; String expectedTitle = "Welcome: Mercury Tours"; String actualTitle = ""; // launch Fire fox and direct it to the Base URL driver.get(baseUrl); // get the actual value of the title actualTitle = driver.getTitle(); /* * compare the actual title of the page with the expected one and print * the result as "Passed" or "Failed" */ if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); } //close Fire fox driver.close(); } }
Bemærk: Starter Firefox 35, skal du bruge gekko-driver oprettet af Mozilla for at bruge Web Driver. Selenium 3.0, gekko og firefox har kompatibilitetsproblemer, og at indstille dem korrekt kan blive en op ad bakke opgave. Hvis koden ikke virker, nedgrader til Firefox version 47 eller derunder. Alternativt kan du køre dine scripts på Chrome. Selenium fungerer ud af æsken til Chrome. Du skal blot ændre 3 linjer kode for at få dit script til at fungere med Chrome eller Firefox
Forklaring af koden
Import af pakker
For at komme i gang skal du importere følgende to pakker:
- org.openqa.selenium.*– indeholder den WebDriver-klasse, der er nødvendig for at instantiere en ny browser indlæst med en bestemt driver
- org.openqa.selenium.firefox.FirefoxChauffør – indeholder FirefoxDriverklasse er nødvendig for at instantiere en Firefox-specifik driver til browseren instansieret af WebDriver-klassen
Hvis din test har brug for mere komplicerede handlinger, såsom at få adgang til en anden klasse, tage browserskærmbilleder eller manipulere eksterne filer, skal du helt sikkert importere flere pakker.
Instantiering af objekter og variabler
Normalt er det sådan, et driverobjekt instantieres.
WebDriver driver = new FirefoxDriver();
A FirefoxDriverklasse uden parametre betyder, at standarden Firefox profil vil blive lanceret af vores Java program. Standarden Firefox profil ligner lancering Firefox i sikker tilstand (ingen udvidelser er indlæst).
For nemheds skyld gemte vi base-URL'en og den forventede titel som variabler.
Start af en browsersession
WebDrivers få() metode bruges til at starte en ny browsersession og dirigerer den til den URL, du angiver som parameter.
driver.get(baseUrl);
Få den faktiske sidetitel
WebDriver-klassen har getTitle () metode, der altid bruges til at få sidetitlen på den aktuelt indlæste side.
actualTitle = driver.getTitle();
Sammenlign de forventede og faktiske værdier
Denne del af koden bruger simpelthen en grundlæggende Java if-else struktur for at sammenligne den faktiske titel med den forventede.
if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); }
Afslutning af en browsersession
Den "tæt()”-metoden bruges til at lukke browservinduet.
driver.close();
Afslutning af hele programmet
Hvis du bruger denne kommando uden først at lukke alle browservinduer, vil hele din Java programmet afsluttes, mens browservinduet forbliver åbent.
System.exit(0);
Kører testen
Der er to måder at udføre kode på Eclipse SDI.
- On Eclipses menulinje, klik Kør > Kør.
- Presse Ctrl + F11 at køre hele koden.
Hvis du gjorde alt rigtigt, Eclipse ville udsende "Test bestået!"
Lokalisering af GUI-elementer
Lokalisering af elementer i WebDriver udføres ved at bruge "findElement(Af.locator())” metode. "Lokator"-delen af koden er den samme som enhver af lokalisatorerne, der tidligere er diskuteret i Selenium IDE kapitler i disse selvstudier. Faktisk anbefales det, at du finder GUI-elementer ved hjælp af IDE og eksporterer koden til WebDriver, når de er identificeret.
Her er en Selenium eksempelkode, der lokaliserer et element ved dets id. Facebook bruges som basis-URL.
package newproject; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG2 { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); String baseUrl = "http://www.facebook.com"; String tagName = ""; driver.get(baseUrl); tagName = driver.findElement(By.id("email")).getTagName(); System.out.println(tagName); driver.close(); System.exit(0); } }
Vi brugte getTagName() metode til at udtrække tagnavnet på det pågældende element, hvis id er "e-mail". Når den køres, skulle denne kode være i stand til korrekt at identificere tagnavnet "input" og vil udskrive det på Eclipse's konsolvindue.
Sammenfatning for lokalisering af elementer
Variation | Description | Prøve |
---|---|---|
Efter.klassenavn | finder elementer baseret på værdien af "class"-attributten | findElement(By.className(“nogetKlassenavn”)) |
By.cssSelector | finder elementer baseret på førerens underliggende CSS Selector-motor | findElement(By.cssSelector(“input#email”)) |
Af.id | lokaliserer elementer ud fra værdien af deres "id"-attribut |
findElement(By.id(“someId”)) |
By.linkText | finder et linkelement ved den nøjagtige tekst, det viser |
findElement(By.linkText(“REGISTRERING”)) |
Ved navn | lokaliserer elementer efter værdien af "name"-attributten |
findElement(By.name(“noget Navn”)) |
By.partialLinkText | lokaliserer elementer, der indeholder den givne linktekst |
findElement(By.partialLinkText(“REG”)) |
By.tagName | lokaliserer elementer ved deres tagnavn |
findElement(By.tagName(“div”)) |
Af.xpath | lokaliserer elementer via XPath |
findElement(By.xpath(“//html/body/div/table/tbody/tr/td[2]/table/ tbody/tr[4]/td/table/tbody/tr/td[2]/table/tbody/tr[2]/td[3]/ form/table/tbody/tr[5]”)) |
Bemærk om brug af findElement(By.cssSelector())
By.cssSelector()
understøtter ikke funktionen "indeholder". Overvej Selenium IDE-kode nedenfor -
In Selenium IDE ovenfor bestod hele testen. Dog i Selenium WebDriver-scriptet nedenfor, den samme test genererede en fejl, fordi WebDriver ikke understøtter nøgleordet "contains", når det bruges i By.cssSelector()-metoden.
Almindelige kommandoer
Instantiering af webelementer
I stedet for at bruge den lange "driver.findElement(By.locator())"-syntaks, hver gang du får adgang til et bestemt element, kan vi instansiere et WebElement-objekt for det. WebElement-klassen er indeholdt i pakken "org.openqa.selenium.*".
Klik på et element
Klik er måske den mest almindelige måde at interagere med webelementer på. Det click()
metode bruges til at simulere klik på ethvert element. Følgende Selenium Java eksempel viser hvordan click()
blev brugt til at klikke på Mercury Tours' "Log ind"-knap.
Følgende ting skal noteres, når du bruger click()-metoden.
- Det kræver ikke nogen parameter/argument.
- Metoden venter automatisk på, at en ny side indlæses, hvis det er relevant.
- Elementet, der skal klikkes på, skal være synligt (højde og bredde må ikke være lig nul).
Få kommandoer
Hent kommandoer henter forskellige vigtige oplysninger om siden/elementet. Her er nogle vigtige "hent"-kommandoer, du skal være bekendt med.
Kommandoer | Brug |
---|---|
få()
Eksempel på brug: |
|
getTitle ()
Eksempel på brug: |
|
getPageSource()
Eksempel på brug: |
|
getCurrentUrl()
Eksempel på brug: |
|
getText ()
Eksempel på brug: |
|
Naviger i kommandoer
Disse kommandoer giver dig mulighed for at opdatere, gå ind i og skifte frem og tilbage mellem forskellige websider.
naviger().to()
Eksempel på brug: |
|
navigate().refresh()
Eksempel på brug: |
|
naviger().tilbage()
Eksempel på brug: |
|
navigate().forward()
Eksempel på brug: |
|
Lukning og afslutning af browser Windows
tæt()
Eksempel på brug: |
|
Afslut()
Eksempel på brug: |
|
For tydeligt at illustrere forskellen mellem close()
og quit()
, prøv at udføre koden nedenfor. Den bruger en webside, der automatisk dukker et vindue op ved sideindlæsning og åbner et andet efter at have afsluttet.
Bemærk, at kun det overordnede browservindue blev lukket og ikke de to pop op-vinduer.
Men hvis du bruger quit(), lukkes alle vinduer - ikke kun det overordnede. Prøv at køre koden nedenfor, og du vil bemærke, at de to pop-ups ovenfor automatisk også vil blive lukket.
package newproject; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG3 { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("http://www.popuptest.com/popuptest2.html"); driver.quit(); // using QUIT all windows will close } }
Skift mellem rammer
For at få adgang til GUI-elementer i en Frame, bør vi først bede WebDriver om at fokusere på rammen eller pop op-vinduet, før vi kan få adgang til elementer i dem. Lad os for eksempel tage websiden http://demo.guru99.com/selenium/deprecated.html
Denne side har 3 rammer, hvis "navn"-attributter er angivet ovenfor. Vi ønsker at få adgang til linket "Forældet" omkranset ovenfor med gult. For at gøre det skal vi først instruere WebDriver om at skifte til "classFrame"-rammen ved hjælp af "switchTo().frame()" metode. Vi bruger rammens name-attribut som parameter for "frame()"-delen.
package newproject; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class PG4 { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("http://demo.guru99.com/selenium/deprecated.html"); driver.switchTo().frame("classFrame"); driver.findElement(By.linkText("Deprecated")).click(); driver.close(); } }
Efter at have udført denne kode, vil du se, at "classFrame"-rammen føres til siden "Deprecated API", hvilket betyder, at vores kode med succes kunne få adgang til "Deprecated"-linket.
Skift mellem pop-up Windows
WebDriver tillader pop-up-vinduer som advarsler at blive vist, i modsætning til i Selenium IDE. For at få adgang til elementerne i advarslen (såsom meddelelsen, den indeholder), skal vi bruge "switchTo().alert()"
metode. I koden nedenfor vil vi bruge denne metode til at få adgang til advarselsboksen og derefter hente dens besked ved hjælp af "getText()"
metode, og luk derefter automatisk advarselsboksen ved hjælp af "switchTo().alert().accept()"
fremgangsmåde.
Gå først over til https://output.jsbin.com/usidix/1 og klik manuelt på "Go!" knappen der og se selv beskedteksten.
Lad os se Selenium eksempelkode til at gøre dette-
package mypackage; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class myclass { public static void main(String[] args) { System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); String alertMessage = ""; driver.get("http://jsbin.com/usidix/1"); driver.findElement(By.cssSelector("input[value=\"Go!\"]")).click(); alertMessage = driver.switchTo().alert().getText(); driver.switchTo().alert().accept(); System.out.println(alertMessage); driver.quit(); } }
På Eclipse konsol, bemærk, at den udskrevne advarselsmeddelelse er:
Venter
Der er to slags ventetider.
- Implicit ventetid – bruges til at indstille standardventetiden gennem hele programmet
- Eksplicit ventetid – bruges kun til at indstille ventetiden for et bestemt tilfælde
Implicit Vent
- Det er lettere at kode end Explicit Waits.
- Det er normalt erklæret i instansieringsdelen af koden.
- Du skal kun bruge én ekstra pakke for at importere.
For at begynde at bruge en implicit ventetid, skal du importere denne pakke til din kode.
Tilføj derefter dette i instansieringsdelen af din kode.
Eksplicit Vent
Eksplicitte ventetider udføres ved hjælp af klasserne WebDriverWait og ExpectedCondition. Til det følgende Selenium WebDriver-eksempel, vi skal vente op til 10 sekunder på, at et element, hvis id er "brugernavn", bliver synligt, før vi fortsætter til den næste kommando. Her er trinene.
Trin 1:
Importer disse to pakker:
Trin 2:
Deklarer en WebDriverWait-variabel. I dette eksempel vil vi bruge "myWaitVar" som navnet på variablen.
Trin 3:
Brug myWaitVar med ExpectedConditions på portioner, hvor du har brug for den eksplicitte ventetid. I dette tilfælde vil vi bruge eksplicit ventetid på "brugernavnet" (Mercury Tours HomePage), før vi skriver teksten "tutorial" på den.
Betingelser
Følgende metoder bruges i betingede og looping-operationer -
- isEnabled() bruges, når du vil kontrollere, om et bestemt element er aktiveret eller ej, før du udfører en kommando.
- vises() bruges, når du vil kontrollere, om et bestemt element vises eller ej, før du udfører en kommando.
- isSelected() bruges, når du vil verificere, om en bestemt afkrydsningsfelt, alternativknap eller mulighed i en rullemenu er valgt. Det virker ikke på andre elementer.
Brug af ExpectedConditions
ExpectedConditions-klassen tilbyder et bredere sæt betingelser, som du kan bruge sammen med WebDriverWaits indtil()-metode.
Nedenfor er nogle af de mest almindelige ExpectedConditions-metoder.
- alertIsPresent() – venter, indtil en advarselsboks vises.
- elementToBeClickable() – Venter, indtil et element er synligt og samtidig aktiveret. Prøven Selenium Koden nedenfor vil vente, indtil elementet med id=”brugernavn” bliver synligt og aktiveret først, før det element tildeles som en WebElement-variabel med navnet “txtUserName”.
- frameToBeAvailableAndSwitchToIt() – Venter, indtil den givne ramme allerede er tilgængelig, og skifter derefter automatisk til den.
Fangst undtagelser
Når du bruger isEnabled(), isDisplayed() og isSelected(), antager WebDriver, at elementet allerede findes på siden. Ellers vil det kaste en NoSuchElementException. For at undgå dette bør vi bruge en try-catch-blok, så programmet ikke bliver afbrudt.
WebElement txtbox_username = driver.findElement(By.id("username")); try{ if(txtbox_username.isEnabled()){ txtbox_username.sendKeys("tutorial"); } } catch(NoSuchElementException nsee){ System.out.println(nsee.toString()); }
Hvis du bruger eksplicitte ventetider, er den type undtagelse, du skal fange, "TimeoutException".
Resumé
- For at begynde at bruge WebDriver API skal du importere mindst disse to pakker.
- org.openqa.selenium.*
- org.openqa.selenium.firefox.FirefoxChauffør
-
get()
metode svarer til Selenium IDE's "åbn" kommando. - Lokalisering af elementer i WebDriver udføres ved at bruge
findElement()
fremgangsmåde. - Følgende er de tilgængelige muligheder for at lokalisere elementer i WebDriver:
- Efter.klassenavn
- By.cssSelector
- Af.id
- By.linkText
- Ved navn
- By.partialLinkText
- By.tagName
- Af.xpath
- By.cssSelector() ikke støtte "indeholder" funktion.
- Du kan instansiere et element ved hjælp af WebElement-klassen.
- Klik på et element gøres ved at bruge
click()
fremgangsmåde. - WebDriver giver disse nyttige get-kommandoer:
- få()
- getTitle ()
- getPageSource()
- getCurrentUrl()
- getText ()
- WebDriver giver disse nyttige navigationskommandoer
- navigate().forward()
- naviger().tilbage()
- naviger().to()
- navigate().refresh()
- Close() og quit() metoderne bruges til at lukke browservinduer.
Close()
bruges til at lukke et enkelt vindue; mensquit()
bruges til at lukke alle vinduer, der er knyttet til det overordnede vindue, som WebDriver-objektet kontrollerede. -
switchTo().frame()
ogswitchTo().alert()
metoder bruges til at rette WebDrivers fokus på henholdsvis en frame eller advarsel. Implicit waits
bruges til at indstille ventetiden gennem hele programmet, mensexplicit waits
bruges kun på bestemte portioner.- Du kan bruge isEnabled(), isDisplayed(),isSelected() og en kombination af WebDriverWait og Forventede betingelser metoder til at verificere et elements tilstand. De verificerer dog ikke, om elementet ikke eksisterer.
- Når isEnabled(), isDisplayed(), eller isSelected() blev kaldt, mens elementet ikke eksisterede, vil WebDriver kaste en NoSuchElementException.
- Når metoderne WebDriverWait og ExpectedConditions blev kaldt, mens elementet ikke eksisterede, ville WebDriver kaste en
TimeoutException
.
Bemærk:
driver.get()
: Denne metode bruges til at navigere til et bestemt websted. Den opretholder dog ikke browserhistorik eller cookies. Som et resultat vil frem- og tilbageknapperne ikke fungere, og at klikke på dem planlægger ikke sidenavigationen.
driver.navigate()
: Denne metode bruges også til at navigere til et bestemt websted, men den vedligeholder browserhistorik og cookies. Dette gør det muligt at bruge frem- og tilbage-knapperne til at navigere mellem sider, mens du koder en testcase.