Selenium Webdriver Java Primjer programa
Selenium Java Primjer
Korištenje Java klase “myclass” koju smo stvorili u prethodnom vodiču, pokušajmo stvoriti skriptu WebDriver koja bi:
Korak 1: donijeti Mercury Početna stranica Tours
Korak 2: potvrdite njegov naslov
Korak 3: ispisati rezultat usporedbe
Korak 4: zatvorite prije završetka cijelog programa.
Selenium WebDriver primjer koda
Ispod je stvarni WebDriver kod za logiku predstavljenu gornjim scenarijem
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 = "https://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(); } }
Napomena: Počinje Firefox 35, trebate koristiti gecko driver koji je izradila Mozilla da biste koristili Web Driver. Selenium 3.0, gecko i firefox imaju problema s kompatibilnošću i njihovo ispravno postavljanje moglo bi postati težak zadatak. Ako kod ne radi, vratite se na Firefox verzija 47 ili niža. Alternativno, svoje skripte možete pokrenuti na Chromeu. Selenium radi izvan okvira za Chrome. Trebate samo promijeniti 3 retka koda kako bi vaša skripta radila s Chromeom ili Firefox
Objašnjavajući šifru
Uvoz paketa
Za početak morate uvesti sljedeća dva paketa:
- org.openqa.selenium.*– sadrži klasu WebDriver potrebnu za instanciranje novog preglednika učitanog s određenim upravljačkim programom
- org.openqa.selenium.firefox.Firefoxvozač – sadrži FirefoxKlasa vozača potrebna za instanciranje a Firefox-specifični upravljački program na preglednik koji instancira klasa WebDriver
Ako vaš test zahtijeva kompliciranije radnje kao što je pristup drugoj klasi, snimanje zaslona preglednika ili manipuliranje vanjskim datotekama, svakako ćete morati uvesti više paketa.
Instanciranje objekata i varijabli
Obično se ovako instancira pogonski objekt.
WebDriver driver = new FirefoxDriver();
A FirefoxKlasa vozača bez parametara znači da je zadana Firefox profil će pokrenuti naš Java program. Zadana vrijednost Firefox profil je sličan pokretanju Firefox u sigurnom načinu rada (nisu učitana proširenja).
Radi praktičnosti, spremili smo osnovni URL i očekivani naslov kao varijable.
Pokretanje sesije preglednika
WebDriver's dobiti() koristi se za pokretanje nove sesije preglednika i usmjerava je na URL koji navedete kao njegov parametar.
driver.get(baseUrl);
Dobijte stvarni naslov stranice
Klasa WebDriver ima getTitle() metoda koja se uvijek koristi za dobivanje naslova trenutno učitane stranice.
actualTitle = driver.getTitle();
Usporedite očekivane i stvarne vrijednosti
Ovaj dio koda jednostavno koristi osnovni Java strukturu if-else za usporedbu stvarnog naslova s očekivanim.
if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); }
Prekid sesije preglednika
"Zatvoriti()” koristi se za zatvaranje prozora preglednika.
driver.close();
Prekid cijelog programa
Ako koristite ovu naredbu bez prethodnog zatvaranja svih prozora preglednika, cijeli Java program će završiti dok je prozor preglednika otvoren.
System.exit(0);
Izvođenje testa
Postoje dva načina za izvršavanje koda Eclipse SDI.
- On Eclipsena traci izbornika, kliknite Trči > Trči.
- Press Ctrl + F11 za pokretanje cijelog koda.
Ako ste sve napravili kako treba, Eclipse ispisao bi "Test prošao!"
Lociranje GUI elemenata
Lociranje elemenata u WebDriver-u vrši se pomoću "pronađiElement(Po.lokator())” metoda. Dio koda "lokator" isti je kao bilo koji od lokatora o kojima se prethodno raspravljalo u Selenium IDE poglavlja ovih udžbenika. Zapravo, preporučuje se da locirate GUI elemente pomoću IDE-a i nakon uspješne identifikacije izvezete kod u WebDriver.
Ovdje je Selenium primjer koda koji locira element prema njegovom ID-u. Facebook se koristi kao osnovni 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); } }
Koristili smo getTagName() metoda za izdvajanje naziva oznake tog određenog elementa čiji je ID "e-pošta". Kada se pokrene, ovaj kod bi trebao moći ispravno identificirati naziv oznake "input" i ispisati ga EclipseProzor konzole korisnika.
Sažetak za lociranje elemenata
varijacija | Description | Uzorak |
---|---|---|
By.className | pronalazi elemente na temelju vrijednosti atributa “class”. | findElement(By.className(“someClassName”)) |
By.cssSelector | pronalazi elemente na temelju pogonskog CSS Selector motora | findElement(By.cssSelector(“input#email”)) |
By.id | locira elemente prema vrijednosti njihovog "id" atributa |
findElement(By.id(“someId”)) |
By.linkText | pronalazi element veze prema točnom tekstu koji prikazuje |
findElement(By.linkText(“REGISTRACIJA”)) |
Imenom | locira elemente prema vrijednosti atributa “name”. |
findElement(By.name(“someName”)) |
By.partialLinkText | locira elemente koji sadrže zadani tekst veze |
findElement(By.partialLinkText(“REG”)) |
By.tagName | locira elemente prema njihovom nazivu oznake |
findElement(By.tagName(“div”)) |
By.xpath | locira elemente putem XPath-a |
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]”)) |
Napomena o korištenju findElement(By.cssSelector())
By.cssSelector()
ne podržava značajku "sadrži". Razmotrite Selenium IDE kod ispod –
In Selenium IDE iznad, cijeli je test prošao. Međutim u Selenium WebDriver skripta u nastavku, isti je test generirao pogrešku jer WebDriver ne podržava ključnu riječ "contains" kada se koristi u metodi By.cssSelector().
Uobičajene naredbe
Instanciranje web elemenata
Umjesto korištenja duge sintakse "driver.findElement(By.locator())" svaki put kada pristupite određenom elementu, možemo instancirati WebElement objekt za njega. Klasa WebElement sadržana je u paketu “org.openqa.selenium.*”.
Klikom na element
Klikanje je možda najčešći način interakcije s web elementima. The click()
Metoda se koristi za simulaciju klika bilo kojeg elementa. Sljedeće Selenium Java primjer pokazuje kako click()
koristio se za klikanje Mercury Toursov gumb “Prijava”.
Kada koristite metodu click(), potrebno je obratiti pozornost na sljedeće stvari.
- Ne uzima nikakav parametar/argument.
- Metoda automatski čeka da se učita nova stranica ako je primjenjiva.
- Element na koji se klikne mora biti vidljiv (visina i širina ne smiju biti jednake nuli).
Nabavite naredbe
Naredbe Get dohvaćaju razne važne informacije o stranici/elementu. Evo nekoliko važnih naredbi "get" s kojima morate biti upoznati.
Naredbe | Upotreba |
---|---|
dobiti()
Primjer upotrebe: |
|
getTitle()
Primjer upotrebe: |
|
getPageSource()
Primjer upotrebe: |
|
getCurrentUrl()
Primjer upotrebe: |
|
getText()
Primjer upotrebe: |
|
Navigacijske naredbe
Ove vam naredbe omogućuju osvježavanje, ulaženje i prebacivanje između različitih web stranica.
navigacija().do()
Primjer upotrebe: |
|
navigacija().refresh()
Primjer upotrebe: |
|
navigacija().natrag()
Primjer upotrebe: |
|
navigacija().naprijed()
Primjer upotrebe: |
|
Zatvaranje i izlazak iz preglednika Windows
Zatvoriti()
Primjer upotrebe: |
|
prestati()
Primjer upotrebe: |
|
Da bi se jasno ilustrirala razlika između close()
međutim quit()
, pokušajte izvršiti kod u nastavku. Koristi web stranicu koja automatski iskače prozor nakon učitavanja stranice i otvara drugi nakon izlaska.
Primijetite da je zatvoren samo nadređeni prozor preglednika, a ne dva skočna prozora.
Ali ako koristite quit(), zatvorit će se svi prozori – ne samo nadređeni. Pokušajte pokrenuti kod u nastavku i primijetit ćete da će se dva skočna prozora iznad automatski zatvoriti.
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 } }
Prebacivanje između okvira
Da bismo pristupili GUI elementima u Frameu, prvo trebamo uputiti WebDriver da se fokusira na okvir ili skočni prozor prije nego što možemo pristupiti elementima unutar njih. Uzmimo, na primjer, web stranicu https://demo.guru99.com/selenium/deprecated.html
Ova stranica ima 3 okvira čiji su atributi "naziv" navedeni gore. Želimo pristupiti vezi "Zastarjelo" koja je gore zaokružena žutom bojom. Da bismo to učinili, prvo moramo uputiti WebDriver da se prebaci na okvir "classFrame" koristeći “switchTo().frame()” metoda. Koristit ćemo atribut name okvira kao parametar za dio "frame()".
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("https://demo.guru99.com/selenium/deprecated.html"); driver.switchTo().frame("classFrame"); driver.findElement(By.linkText("Deprecated")).click(); driver.close(); } }
Nakon izvršavanja ovog koda, vidjet ćete da je okvir “classFrame” prebačen na stranicu “Deprecated API”, što znači da je naš kod uspješno mogao pristupiti vezi “Deprecated”.
Prebacivanje između skočnih prozora Windows
WebDriver omogućuje prikazivanje skočnih prozora poput upozorenja, za razliku od Selenium IDE. Za pristup elementima unutar upozorenja (kao što je poruka koju sadrži), moramo koristiti "switchTo().alert()"
metoda. U donjem kodu koristit ćemo ovu metodu za pristup okviru s upozorenjem i zatim dohvatiti njegovu poruku pomoću "getText()"
način, a zatim automatski zatvorite okvir s upozorenjem pomoću "switchTo().alert().accept()"
metoda.
Prvo prijeđite na https://output.jsbin.com/usidix/1 i ručno kliknite "Kreni!" i sami pogledajte tekst poruke.
Da vidimo Selenium primjer koda za ovo-
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(); } }
Na Eclipse konzole, primijetite da je ispisana poruka upozorenja:
čeka
Postoje dvije vrste čekanja.
- Implicitno čekanje – koristi se za postavljanje zadanog vremena čekanja kroz cijeli program
- Eksplicitno čekanje – koristi se za postavljanje vremena čekanja samo za određenu instancu
Implicitno čekanje
- Jednostavnije ga je kodirati nego eksplicitna čekanja.
- Obično se deklarira u instancijskom dijelu koda.
- Trebat će vam samo jedan dodatni paket za uvoz.
Da biste počeli koristiti implicitno čekanje, morali biste uvesti ovaj paket u svoj kod.
Zatim u dijelu vašeg koda za instanciranje dodajte ovo.
Eksplicitno čekanje
Eksplicitna čekanja provode se pomoću klasa WebDriverWait i ExpectedCondition. Za sljedeće Selenium Primjer WebDriver-a, pričekat ćemo do 10 sekundi da element čiji je ID "korisničko ime" postane vidljiv prije nego što pređemo na sljedeću naredbu. Evo koraka.
Korak 1:
Uvezite ova dva paketa:
Korak 2:
Deklarirajte varijablu WebDriverWait. U ovom primjeru koristit ćemo "myWaitVar" kao naziv varijable.
Korak 3:
Upotrijebite myWaitVar s ExpectedConditions na dijelovima gdje je potrebno eksplicitno čekanje. U ovom slučaju koristit ćemo eksplicitno čekanje na "korisničko ime" (Mercury Tours HomePage) unos prije nego što na njega upišemo tekst "tutorial".
Uvjeti
Sljedeće se metode koriste u uvjetnim operacijama i operacijama petlje —
- isEnabled() se koristi kada želite provjeriti je li određeni element omogućen ili ne prije izvršavanja naredbe.
- isDisplayed() koristi se kada želite provjeriti je li određeni element prikazan ili ne prije izvršenja naredbe.
- isSelected() koristi se kada želite provjeriti je li određena potvrdni okvir, radio gumb ili opciju u padajućem okviru je odabrano. Ne radi na drugim elementima.
Korištenje ExpectedConditions
Klasa ExpectedConditions nudi širi skup uvjeta koje možete koristiti u kombinaciji s WebDriverWait metodom until().
Ispod su neke od najčešćih metoda ExpectedConditions.
- alertIsPresent() – čeka dok se ne prikaže okvir upozorenja.
- elementToBeClickable() – Čeka dok element ne bude vidljiv i, u isto vrijeme, omogućen. Uzorak Selenium Kod u nastavku čekat će dok element s id=”username” ne postane vidljiv i najprije omogućen prije nego što dodijeli taj element kao varijablu WebElement pod nazivom “txtUserName”.
- frameToBeAvailableAndSwitchToIt() – Čeka dok zadani okvir već bude dostupan, a zatim se automatski prebacuje na njega.
Hvatanje iznimaka
Kada koristite isEnabled(), isDisplayed() i isSelected(), WebDriver pretpostavlja da element već postoji na stranici. U suprotnom, izbacit će a NoSuchElementException. Da bismo to izbjegli, trebali bismo koristiti blok try-catch kako program ne bi bio prekinut.
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()); }
Ako koristite eksplicitna čekanja, vrsta iznimke koju biste trebali uhvatiti je "TimeoutException".
Rezime
- Da biste počeli koristiti WebDriver API, morate uvesti barem ova dva paketa.
- org.openqa.selenium.*
- org.openqa.selenium.firefox.Firefoxvozač
- The
get()
metoda je ekvivalent Selenium IDE naredba “otvori”. - Lociranje elemenata u WebDriver-u vrši se pomoću
findElement()
metoda. - Sljedeće su dostupne opcije za lociranje elemenata u WebDriveru:
- By.className
- By.cssSelector
- By.id
- By.linkText
- Imenom
- By.partialLinkText
- By.tagName
- By.xpath
- By.cssSelector() ne podržati "sadrži" značajka.
- Element možete instancirati pomoću klase WebElement.
- Klik na element vrši se pomoću
click()
metoda. - WebDriver pruža ove korisne naredbe za dobivanje:
- dobiti()
- getTitle()
- getPageSource()
- getCurrentUrl()
- getText()
- WebDriver pruža ove korisne navigacijske naredbe
- navigacija().naprijed()
- navigacija().natrag()
- navigacija().do()
- navigacija().refresh()
- Metode close() i quit() koriste se za zatvaranje prozora preglednika.
Close()
koristi se za zatvaranje jednog prozora; dokquit()
koristi se za zatvaranje svih prozora povezanih s nadređenim prozorom koji je kontrolirao objekt WebDriver. - The
switchTo().frame()
međutimswitchTo().alert()
metode se koriste za usmjeravanje fokusa WebDrivera na okvir ili upozorenje. Implicit waits
koriste se za postavljanje vremena čekanja tijekom programa, dokexplicit waits
koriste se samo na određenim dijelovima.- Možete koristiti isEnabled(), isDisplayed(),isSelected() i kombinaciju WebDriverWait međutim ExpectedConditions metode pri provjeri stanja elementa. Međutim, oni ne provjeravaju ako element ne postoji.
- Kada je isEnabled(), isDisplayed() ili isSelected() pozvan dok element nije postojao, WebDriver će izbaciti NoSuchElementException.
- Kada su metode WebDriverWait i ExpectedConditions pozvane dok element nije postojao, WebDriver bi izbacio
TimeoutException
.
Bilješka:
driver.get()
: Ova se metoda koristi za navigaciju do određene web stranice. Međutim, ne održava povijest preglednika niti kolačiće. Kao rezultat toga, gumbi naprijed i natrag neće raditi, a klik na njih neće zakazati navigaciju stranicom.
driver.navigate()
: Ova se metoda također koristi za navigaciju do određene web stranice, ali održava povijest preglednika i kolačiće. To omogućuje korištenje gumba naprijed i natrag za navigaciju između stranica tijekom kodiranja testnog slučaja.