Bruk Java-klassen "myclass" som vi opprettet i forrige opplæring, og la oss prøve å lage et WebDriver-skript som:
- hente Mercury Tours hjemmeside
- bekreft tittelen
- skriv ut resultatet av sammenligningen
- lukk den før du avslutter hele programmet.
WebDriver-kode
Nedenfor er den faktiske WebDriver-koden for logikken presentert av scenariet ovenfor
Merk: Når du starter Firefox 35, må du bruke gecko-driver opprettet av Mozilla for å bruke Web Driver. Selen 3.0, gecko og firefox har kompatibilitetsproblemer og å sette dem riktig kan bli en oppoverbakkeoppgave. Hvis koden ikke fungerer, kan du nedgradere til Firefox versjon 47 eller eldre. Alternativt kan du kjøre skriptene dine på Chrome. Selen fungerer ut av esken for Chrome. Du trenger bare å endre 3 kodelinjer for å få skriptet til å fungere med Chrome eller Firefox
pakke newproject;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.firefox.FirefoxDriver;// kommenter linjen ovenfor og kommentar under linjen for å bruke Chrome// importer org.openqa.selenium.chrome.ChromeDriver;offentlig klasse PG1 {public static void main (String [] args) {// erklæring og instantiering av objekter / variablerSystem.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-driver = ny FirefoxDriver ();// kommenter de ovennevnte 2 linjene og kommenter under 2 linjer for å bruke Chrome//System.setProperty("webdriver.chrome.driver","G:\\chromedriver.exe ");// WebDriver driver = ny ChromeDriver ();Streng baseUrl = "http://demo.guru99.com/test/newtours/";String expectTitle = "Velkommen: Merkur-turer";String actualTitle = "";// start Fire fox og diriger den til Base URLdriver.get (baseUrl);// få den faktiske verdien av tittelenactualTitle = driver.getTitle ();/ ** Sammenlign den faktiske tittelen på siden med den forventede og skriv ut* resultatet som "Bestått" eller "Mislyktes"* /hvis (actualTitle.contentEquals (forventet tittel)) {System.out.println ("Test bestått!");} annet {System.out.println ("Test mislyktes");}// lukk Brannrevendriver.close ();}}
Forklare koden
Importerer pakker
For å komme i gang, må du importere følgende to pakker:
- org.openqa.selenium. * - inneholder WebDriver-klassen som trengs for å starte en ny nettleser lastet med en bestemt driver
- org.openqa.selenium.firefox.FirefoxDriver - inneholder FirefoxDriver-klassen som trengs for å instantiere en Firefox-spesifikk driver til nettleseren som er instansert av WebDriver-klassen
Hvis testen din trenger mer kompliserte handlinger som å få tilgang til en annen klasse, ta skjermbilder i nettleseren eller manipulere eksterne filer, må du definitivt importere flere pakker.
Instantierende objekter og variabler
Normalt er dette hvordan et driverobjekt blir instantiert.
En FirefoxDriver-klasse uten parametere betyr at standard Firefox-profilen vil bli lansert av vårt Java-program. Standard Firefox-profilen ligner på å starte Firefox i sikker modus (ingen utvidelser er lastet inn).
For enkelhets skyld lagret vi grunn-URL og forventet tittel som variabler.
Starter en nettlesersesjon
WebDrivers get () -metode brukes til å starte en ny leserøkt og dirigerer den til URL-en du angir som parameter.
Få den faktiske sidetittelen
WebDriver-klassen har getTitle () -metoden som alltid brukes til å skaffe sidetittelen til den lastede siden.
Sammenlign forventede og faktiske verdier
Denne delen av koden bruker ganske enkelt en grunnleggende Java if-else-struktur for å sammenligne den faktiske tittelen med den forventede.
Avslutte en nettlesersesjon
Metoden " close () " brukes til å lukke nettleservinduet.
Avslutte hele programmet
Hvis du bruker denne kommandoen uten å lukke alle nettleservinduer først, vil hele Java-programmet ditt avsluttes mens nettleservinduet åpnes.
Kjører testen
Det er to måter å utføre kode i Eclipse IDE.
- På Eclipses menylinje klikker du Kjør> Kjør.
- Trykk Ctrl + F11 for å kjøre hele koden.
Hvis du gjorde alt riktig, ville Eclipse sende ut "Test bestått!"
Finne GUI-elementer
Finne elementer i WebDriver gjøres ved å bruke metoden " findElement (By. Locator ()) ". "Locator" -delen av koden er den samme som noen av locatorene som tidligere ble diskutert i Selenium IDE-kapitlene i denne veiledningen. Faktisk, anbefales det at du finner GUI-elementer ved hjelp av IDE og en gang vellykket identifisert, eksporterer du koden til WebDriver.
Her er en Selen-prøvekode som lokaliserer et element etter id. Facebook brukes som basis-URL.
pakke newproject;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.firefox.FirefoxDriver;offentlig klasse PG2 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-driver = ny 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 brukte metoden getTagName () for å trekke ut taggenavnet til det bestemte elementet hvis id er "e-post". Når den kjøres, skal denne koden kunne identifisere kodenavnet "input" korrekt og vil skrive det ut i Eclipse's Console-vindu.
Sammendrag for lokalisering av elementer
Variasjon | Beskrivelse | Prøve |
---|---|---|
Av. klassenavn | finner elementer basert på verdien av attributtet "class" | findElement (By.className ("someClassName")) |
Av. cssSelector | finner elementer basert på førerens underliggende CSS Selector-motor | findElement (By.cssSelector ("input # email")) |
Av. id | lokaliserer elementer etter verdien av deres "id" -attributt | findElement (By.id ("someId")) |
Av. linkText | finner et koblingselement etter den eksakte teksten den viser | findElement (By.linkText ("REGISTRATION")) |
Av. Navn | lokaliserer elementer etter verdien av "navn" -attributtet | findElement (By.name ("someName")) |
Av. partialLinkText | lokaliserer elementer som inneholder den gitte lenketeksten | findElement (By.partialLinkText ("REG")) |
Av. tagName | lokaliserer elementer etter taggenavnet | findElement (By.tagName ("div")) |
Av. 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 / tabell / tbody / tr [5] ")) |
Merknad om bruk av findElement (By.cssSelector ())
By.cssSelector () støtter ikke "inneholder" -funksjonen . Vurder Selen IDE-koden nedenfor -
I Selen IDE ovenfor besto hele testen. I Selenium WebDriver-skriptet nedenfor genererte den samme testen imidlertid en feil fordi WebDriver ikke støtter "inneholder" nøkkelordet når det brukes i By.cssSelector () -metoden.
Vanlige kommandoer
Instantierende nettelementer
I stedet for å bruke den lange "driver.findElement (By.locator ())" - syntaksen hver gang du får tilgang til et bestemt element, kan vi starte et WebElement-objekt for det. WebElement-klassen er inkludert i pakken "org.openqa.selenium. *".
Klikk på et element
Å klikke er kanskje den vanligste måten å samhandle med webelementer på . Click () -metoden brukes til å simulere klikkingen av et hvilket som helst element. Følgende Selenium Java-eksempel viser hvordan klikk () ble brukt til å klikke på Mercury Tours '"Pålogging" -knapp.
Følgende ting må bemerkes når du bruker click () -metoden.
- Det krever ingen parameter / argument.
- Metoden venter automatisk på at en ny side skal lastes inn hvis det er aktuelt.
- Elementet som skal klikkes på, må være synlig (høyde og bredde må ikke være lik null).
Få kommandoer
Få kommandoer til å hente ulike viktige opplysninger om siden / elementet. Her er noen viktige "get" -kommandoer du må være kjent med.
Kommandoer | Bruk |
---|---|
få () prøvebruk: |
|
getTitle () Eksempel på bruk: |
|
getPageSource () Eksempelbruk: |
|
getCurrentUrl () Eksempel på bruk: |
|
getText () Eksempel på bruk: |
|
Naviger kommandoer
Disse kommandoene lar deg oppdatere, gå inn og veksle frem og tilbake mellom forskjellige websider.
naviger (). til () Eksempelbruk: |
|
naviger (). oppdater () Eksempelbruk: |
|
navigere (). tilbake () Eksempelbruk: |
|
navigere (). fremover () Eksempelbruk: |
|
Lukke og avslutte nettleservinduer
lukk () prøvebruk: |
|
avslutte () prøvebruk: |
|
For å tydelig illustrere forskjellen mellom close () og quit (), prøv å utføre koden nedenfor. Den bruker en webside som automatisk dukker opp et vindu ved sideinnlasting og åpner en ny etter avsluttet.
Legg merke til at bare det overordnede nettleservinduet ble lukket, og ikke de to popup-vinduene.
Men hvis du bruker avslutte (), lukkes alle vinduer - ikke bare den overordnede. Prøv å kjøre koden nedenfor, og du vil legge merke til at de to popup-vinduene ovenfor automatisk også lukkes.
pakke newproject;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.firefox.FirefoxDriver;offentlig klasse PG3 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-driver = ny FirefoxDriver ();driver.get ("http://www.popuptest.com/popuptest2.html");driver.quit (); // ved å bruke QUIT lukkes alle vinduer}}
Bytte mellom rammer
For å få tilgang til GUI-elementer i en ramme, bør vi først lede WebDriver til å fokusere på rammen eller popup-vinduet først før vi får tilgang til elementer i dem. La oss ta for eksempel websiden http://demo.guru99.com/selenium/deprecated.html
Denne siden har 3 rammer hvis "navn" -attributter er angitt ovenfor. Vi ønsker å få tilgang til "Utfaset" -linken omkranset i gult. For å gjøre det, må vi først instruere WebDriver om å bytte til "classFrame" -rammen ved å bruke "switchTo (). Frame ()" -metoden. Vi vil bruke navneattributtet til rammen som parameter for "frame ()" -delen.
pakke newproject;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.firefox.FirefoxDriver;offentlig klasse PG4 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-driver = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/selenium/deprecated.html");driver.switchTo (). frame ("classFrame");driver.findElement (By.linkText ("utdatert")). klikk ();driver.close ();}}
Etter at du har kjørt denne koden, vil du se at "classFrame" -rammen blir ført til siden "Utdatert API", noe som betyr at koden vår var vellykket i stand til å få tilgang til "Utdatert" -lenken.
Bytte mellom popup-vinduer
WebDriver lar popup-vinduer som varsler vises, i motsetning til i Selen IDE. For å få tilgang til elementene i varselet (for eksempel meldingen den inneholder), må vi bruke metoden "switchTo (). Alert ()" . I koden nedenfor bruker vi denne metoden for å få tilgang til varslingsboksen og deretter hente meldingen ved hjelp av "getText ()" -metoden, og lukker deretter varslingsboksen automatisk ved å bruke "switchTo (). Alarm (). Godta () " metode.
Først går du til http://jsbin.com/usidix/1 og klikker manuelt på "Go!" knappen der og se selv meldingen.
La oss se Selenium-eksempelkoden for å gjøre dette-
pakke min pakke;importer org.openqa.selenium.By;importer org.openqa.selenium.WebDriver;importer org.openqa.selenium.firefox.FirefoxDriver;offentlig klasse myclass {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-driver = ny FirefoxDriver ();String alertMessage = "";driver.get ("http://jsbin.com/usidix/1");driver.findElement (By.cssSelector ("input [value = \" Go! \ "]")). klikk ();alertMessage = driver.switchTo (). alert (). getText ();driver.switchTo (). alarm (). godta ();System.out.println (alertMessage);driver.quit ();}}
På Eclipse-konsollen må du merke at den utskrevne varselmeldingen er:
Venter
Det er to typer ventetider.
- Implisitt ventetid - brukes til å angi standard ventetid i hele programmet
- Eksplisitt ventetid - brukes kun til å stille inn ventetiden for en bestemt forekomst
Implisitt Vent
- Det er enklere å kode enn Explicit Waits.
- Det blir vanligvis erklært i koden for instantiering.
- Du trenger bare en ekstra pakke for å importere.
For å begynne å bruke en implisitt ventetid, må du importere denne pakken til koden din.
Deretter legger du til dette på instantieringsdelen av koden din.
Eksplisitt Vent
Eksplisitt venting gjøres ved hjelp av klasser WebDriverWait og ExpectedCondition . For det følgende Selenium WebDriver-eksemplet, må vi vente i opptil 10 sekunder på at et element hvis id er "brukernavn" skal bli synlig før vi fortsetter til neste kommando. Her er trinnene.
Trinn 1
Importer disse to pakkene:
Steg 2
Erklære en WebDriverWait-variabel. I dette eksemplet vil vi bruke "myWaitVar" som navnet på variabelen.
Trinn 3
Bruk myWaitVar med ExpectedConditions på deler der du trenger den eksplisitte ventetiden for å oppstå. I dette tilfellet vil vi bruke eksplisitt venting på "brukernavn" (Mercury Tours HomePage) -inngangen før vi skriver teksten "tutorial" på den.
Forhold
Følgende metoder brukes i betingede og looping operasjoner -
- isEnabled () brukes når du vil kontrollere om et bestemt element er aktivert eller ikke før du utfører en kommando.
- isDisplayed () brukes når du vil kontrollere om et bestemt element vises eller ikke før du utfører en kommando.
- isSelected () brukes når du vil kontrollere om en bestemt avkrysningsrute, alternativknapp eller alternativ i en rullegardin er valgt. Det fungerer ikke på andre elementer.
Bruke ExpectedConditions
ExpectedConditions-klassen tilbyr et bredere sett med betingelser som du kan bruke i forbindelse med WebDriverWait til () -metoden.
Nedenfor er noen av de vanligste ExpectedConditions-metodene.
- alertIsPresent () - venter til en varselboks vises.
- elementToBeClickable () - Venter til et element er synlig og samtidig aktivert. Eksemplet på Selenium-koden nedenfor vil vente til elementet først blir synlig og aktivert før det tildeles elementet som en WebElement-variabel kalt "txtUserName".
- frameToBeAvailableAndSwitchToIt () - Venter til den gitte rammen allerede er tilgjengelig, og bytter deretter automatisk til den.
Fangst unntak
Når du bruker isEnabled (), isDisplayed () og isSelected (), antar WebDriver at elementet allerede finnes på siden. Ellers vil det kaste et NoSuchElementException . For å unngå dette, bør vi bruke en prøvefangerblokk slik at programmet ikke blir avbrutt.
WebElement txtbox_username = driver.findElement (By.id ("brukernavn"));prøve{hvis (txtbox_username.isEnabled ()) {txtbox_username.sendKeys ("tutorial");}}fangst (NoSuchElementException nsee) {System.out.println (nsee.toString ());}
Hvis du bruker eksplisitte venter, er "TimeoutException" typen unntak du bør fange.
Sammendrag
- For å begynne å bruke WebDriver API, må du importere minst disse to pakkene.
- org.openqa.selen. *
- org.openqa.selenium.firefox.FirefoxDriver
- Den get () metoden er tilsvarende selen IDE er "åpen" -kommandoen.
- Finne elementer i WebDriver gjøres ved å bruke metoden findElement () .
- Følgende er de tilgjengelige alternativene for å finne elementer i WebDriver:
- Av. klassenavn
- Av. cssSelector
- Av. id
- Av. linkText
- Av. Navn
- Av. partialLinkText
- Av. tagName
- Av. xpath
- Den By.cssSelector () ikke støtter "inneholder" funksjonen.
- Du kan instansiere et element ved hjelp av WebElement- klassen.
- Å klikke på et element gjøres ved å bruke metoden click () .
- WebDriver gir disse nyttige get-kommandoene :
- få()
- getTitle ()
- getPageSource ()
- getCurrentUrl ()
- getText ()
- WebDriver tilbyr disse nyttige navigasjonskommandoer
- naviger (). fremover ()
- naviger (). tilbake ()
- navigere til()
- naviger (). oppdater ()
- Metodene close () og quit () brukes til å lukke nettleservinduer. Lukk () brukes til å lukke et enkelt vindu; while quit () brukes til å lukke alle vinduer som er tilknyttet foreldrevinduet som WebDriver-objektet kontrollerte.
- Den switchTo (). Ramme () og switchTo (). Alert () metoder brukes til direkte WebDriver fokus på en ramme eller varsel, henholdsvis.
- Implisitte venter brukes til å stille ventetiden gjennom hele programmet, mens eksplisitte venter bare brukes på bestemte porsjoner.
- Du kan bruke isEnabled (), isDisplayed (), isSelected () og en kombinasjon av WebDriverWait og ExpectedConditions- metoder når du verifiserer tilstanden til et element. Imidlertid verifiserer de ikke om elementet ikke eksisterer.
- Når isEnabled (), isDisplayed () eller isSelected () ble kalt mens elementet ikke eksisterte, vil WebDriver kaste et NoSuchElementException .
- Når metodene WebDriverWait og ExpectedConditions ble kalt mens elementet ikke var eksisterende, ville WebDriver kaste et TimeoutException .
Merk:
driver.get (): Det brukes til å gå til det aktuelle nettstedet, men det opprettholder ikke nettleserens historie og informasjonskapsler, så vi kan ikke bruke fremover og bakover-knappen, hvis vi klikker på det, vil siden ikke få tidsplan
driver.navigate (): den brukes til å gå til det aktuelle nettstedet, men den opprettholder nettleserhistorikken og informasjonskapslene, slik at vi kan bruke fremover og bakover-knappen for å navigere mellom sidene under kodingen av Testcase