Laten we, met behulp van de Java-klasse "myclass" die we in de vorige zelfstudie hebben gemaakt, proberen een WebDriver-script te maken dat:
- haal de startpagina van Mercury Tours op
- controleer de titel
- print het resultaat van de vergelijking
- sluit het voordat u het hele programma beëindigt.
WebDriver-code
Hieronder vindt u de feitelijke WebDriver-code voor de logica die wordt gepresenteerd door het bovenstaande scenario
Opmerking: als u Firefox 35 start, moet u een door Mozilla gemaakte gekko-driver gebruiken om Web Driver te gebruiken. Selenium 3.0, gekko en firefox hebben compatibiliteitsproblemen en het correct instellen ervan kan een zware taak worden. Als de code niet werkt, downgrade dan naar Firefox-versie 47 of lager. U kunt uw scripts ook in Chrome uitvoeren. Selenium werkt standaard voor Chrome. U hoeft slechts 3 regels code te wijzigen om uw script met Chrome of Firefox te laten werken
pakket nieuwproject;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.firefox.FirefoxDriver;// becommentarieer de bovenstaande regel en verwijder commentaar onder de regel om Chrome te gebruiken// importeer org.openqa.selenium.chrome.ChromeDriver;openbare klasse PG1 {public static void main (String [] args) {// declaratie en concretisering van objecten / variabelenSystem.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-stuurprogramma = nieuwe FirefoxDriver ();// becommentarieer de bovenstaande 2 regels en verwijder de commentaren onder de 2 regels om Chrome te gebruiken//System.setProperty("webdriver.chrome.driver","G:\\ Chromedriver.exe ");// WebDriver-stuurprogramma = nieuwe ChromeDriver ();String baseUrl = "http://demo.guru99.com/test/newtours/";String verwachteTitle = "Welkom: Mercury Tours";String actualTitle = "";// start Fire fox en leid het naar de basis-URLdriver.get (baseUrl);// haal de werkelijke waarde van de titel opactualTitle = driver.getTitle ();* vergelijk de werkelijke titel van de pagina met de verwachte en druk deze af* het resultaat als ‘Geslaagd’ of ‘Mislukt’if (actualTitle.contentEquals (verwachteTitle)) {System.out.println ("Test geslaagd!");} anders {System.out.println ("Test mislukt");// sluit Vuurvosdriver.close ();
De code uitleggen
Pakketten importeren
Om te beginnen, moet u de volgende twee pakketten importeren:
- org.openqa.selenium. * - bevat de WebDriver-klasse die nodig is om een nieuwe browser te starten die is geladen met een specifiek stuurprogramma
- org.openqa.selenium.firefox.FirefoxDriver - bevat de FirefoxDriver-klasse die nodig is om een Firefox-specifiek stuurprogramma te instantiëren naar de browser die is gestart door de WebDriver-klasse
Als je test meer gecompliceerde acties nodig heeft, zoals toegang tot een andere klasse, browserschermafbeeldingen maken of externe bestanden manipuleren, zul je zeker meer pakketten moeten importeren.
Instanties van objecten en variabelen
Normaal gesproken is dit de manier waarop een stuurprogramma-object wordt geïnstantieerd.
Een FirefoxDriver-klasse zonder parameters betekent dat het standaard Firefox-profiel wordt gestart door ons Java-programma. Het standaard Firefox-profiel is vergelijkbaar met het starten van Firefox in de veilige modus (er worden geen extensies geladen).
Voor het gemak hebben we de basis-URL en de verwachte titel als variabelen opgeslagen.
Een browsersessie starten
De methode get () van WebDriver wordt gebruikt om een nieuwe browsersessie te starten en stuurt deze naar de URL die u opgeeft als parameter.
Verkrijg de werkelijke paginatitel
De klasse WebDriver heeft de methode getTitle () die altijd wordt gebruikt om de paginatitel van de momenteel geladen pagina op te halen.
Vergelijk de verwachte en werkelijke waarden
Dit deel van de code gebruikt gewoon een eenvoudige Java if-else-structuur om de daadwerkelijke titel te vergelijken met de verwachte titel.
Een browsersessie beëindigen
De " close () " - methode wordt gebruikt om het browservenster te sluiten.
Beëindiging van het volledige programma
Als u deze opdracht gebruikt zonder eerst alle browservensters te sluiten, wordt uw hele Java-programma beëindigd terwijl het browservenster open blijft.
De test uitvoeren
Er zijn twee manieren om code uit te voeren in Eclipse IDE.
- Klik op de menubalk van Eclipse op Uitvoeren> Uitvoeren.
- Druk op Ctrl + F11 om de volledige code uit te voeren.
Als je alles correct hebt gedaan, zou Eclipse "Test geslaagd!" Weergeven.
GUI-elementen lokaliseren
Het lokaliseren van elementen in WebDriver wordt gedaan met behulp van de " findElement (By. Locator ()) " - methode. Het "locator" -gedeelte van de code is hetzelfde als alle locators die eerder zijn besproken in de Selenium IDE-hoofdstukken van deze tutorials. Sterker nog, het wordt aanbevolen om GUI-elementen te lokaliseren met behulp van IDE en eenmaal succesvol geïdentificeerd de code naar WebDriver te exporteren.
Hier is een Selenium-voorbeeldcode die een element lokaliseert op basis van zijn ID. Facebook wordt gebruikt als de basis-URL.
pakket nieuwproject;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.firefox.FirefoxDriver;openbare klasse PG2 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-stuurprogramma = nieuwe 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);
We hebben de methode getTagName () gebruikt om de tagnaam te extraheren van dat specifieke element waarvan de id "e-mail" is. Wanneer deze code wordt uitgevoerd, zou deze de tagnaam "input" correct moeten kunnen identificeren en deze zal afdrukken in het consolevenster van Eclipse.
Samenvatting voor het lokaliseren van elementen
Variatie | Omschrijving | Monster |
---|---|---|
Door. naam van de klasse | vindt elementen op basis van de waarde van het attribuut "class" | findElement (By.className ("someClassName")) |
Door. cssSelector | vindt elementen op basis van de onderliggende CSS Selector-engine van het stuurprogramma | findElement (By.cssSelector ("input # email")) |
Door. ID kaart | lokaliseert elementen op basis van de waarde van hun "id" -attribuut | findElement (By.id ("someId")) |
Door. verbind tekst | vindt een linkelement door de exacte tekst die het weergeeft | findElement (By.linkText ("REGISTRATION")) |
Door. naam | lokaliseert elementen op basis van de waarde van het kenmerk "naam" | findElement (By.name ("someName")) |
Door. gedeeltelijkeLinkText | lokaliseert elementen die de gegeven linktekst bevatten | findElement (By.partialLinkText ("REG")) |
Door. tagName | lokaliseert elementen op hun tagnaam | findElement (By.tagName ("div")) |
Door. xpath | lokaliseert elementen 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] ")) |
Opmerking over het gebruik van findElement (By.cssSelector ())
By.cssSelector () ondersteunt de "bevat" -functie niet . Beschouw de Selenium IDE-code hieronder -
In Selenium IDE hierboven is de hele test geslaagd. In het onderstaande Selenium WebDriver-script genereerde dezelfde test echter een fout omdat WebDriver het sleutelwoord "bevat" niet ondersteunt bij gebruik in de methode By.cssSelector ().
Gemeenschappelijke opdrachten
Instanties van webelementen
In plaats van de lange syntaxis "driver.findElement (By.locator ())" te gebruiken elke keer dat u een bepaald element opent, kunnen we er een WebElement-object voor instantiëren. De klasse WebElement bevindt zich in het pakket "org.openqa.selenium. *".
Klikken op een element
Klikken is misschien wel de meest gebruikelijke manier om met webelementen om te gaan . De methode click () wordt gebruikt om het klikken van een element te simuleren. Het volgende Selenium Java-voorbeeld laat zien hoe click () werd gebruikt om op de "Sign-In" -knop van Mercury Tours te klikken.
De volgende zaken moeten in acht worden genomen wanneer u de methode click () gebruikt.
- Er zijn geen parameters / argumenten voor nodig.
- De methode wacht automatisch op het laden van een nieuwe pagina, indien van toepassing.
- Het element waarop moet worden geklikt, moet zichtbaar zijn (hoogte en breedte mogen niet gelijk zijn aan nul).
Krijg opdrachten
Get-opdrachten halen verschillende belangrijke informatie over de pagina / het element op. Hier zijn enkele belangrijke "get" -opdrachten waarmee u bekend moet zijn.
Commando's | Gebruik |
---|---|
get () Voorbeeldgebruik: |
|
getTitle () Voorbeeldgebruik: |
|
getPageSource () Voorbeeldgebruik: |
|
getCurrentUrl () Voorbeeldgebruik: |
|
getText () Voorbeeldgebruik: |
|
Navigeer door opdrachten
Met deze opdrachten kunt u verschillende webpagina's vernieuwen, openen en heen en weer schakelen tussen verschillende webpagina's.
navigeer (). naar () Voorbeeldgebruik: |
|
navigeren (). refresh () Voorbeeldgebruik: |
|
navigeren (). terug () Voorbeeldgebruik: |
|
navigeren (). vooruit () Voorbeeldgebruik: |
|
Browser-vensters sluiten en afsluiten
close () Voorbeeldgebruik: |
|
quit () Voorbeeldgebruik: |
|
Probeer de onderstaande code uit te voeren om het verschil tussen close () en quit () duidelijk te illustreren. Het gebruikt een webpagina die automatisch een venster opent bij het laden van de pagina en een ander opent na het afsluiten.
Merk op dat alleen het bovenliggende browservenster was gesloten en niet de twee pop-upvensters.
Maar als u quit () gebruikt, worden alle vensters gesloten, niet alleen het bovenliggende venster. Probeer de onderstaande code uit te voeren en u zult merken dat de twee bovenstaande pop-ups automatisch ook worden gesloten.
pakket nieuwproject;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.firefox.FirefoxDriver;openbare klasse PG3 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-stuurprogramma = nieuwe FirefoxDriver ();driver.get ("http://www.popuptest.com/popuptest2.html");driver.quit (); // met QUIT worden alle vensters gesloten
Schakelen tussen frames
Om toegang te krijgen tot GUI-elementen in een frame, moeten we WebDriver eerst vragen om zich eerst op het frame of pop-upvenster te concentreren voordat we toegang kunnen krijgen tot de elementen erin. Laten we bijvoorbeeld de webpagina http://demo.guru99.com/selenium/deprecated.html nemen
Deze pagina heeft 3 frames waarvan de "naam" -attributen hierboven zijn aangegeven. We willen de link "Verouderd" openen die hierboven in geel is omcirkeld. Om dat te doen, moeten we WebDriver eerst instrueren om over te schakelen naar het "classFrame" -frame met behulp van de "switchTo (). Frame ()" - methode. We zullen het name-attribuut van het frame gebruiken als de parameter voor het "frame ()" -gedeelte.
pakket nieuwproject;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.firefox.FirefoxDriver;openbare klasse PG4 {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-stuurprogramma = nieuwe FirefoxDriver ();driver.get ("http://demo.guru99.com/selenium/deprecated.html");driver.switchTo (). frame ("classFrame");driver.findElement (By.linkText ("Deprecated")). click ();driver.close ();
Na het uitvoeren van deze code, zult u zien dat het "classFrame" -frame naar de "Deprecated API" -pagina wordt geleid, wat betekent dat onze code met succes toegang kon krijgen tot de "Deprecated" -link.
Schakelen tussen pop-upvensters
Met WebDriver kunnen pop-upvensters zoals waarschuwingen worden weergegeven, in tegenstelling tot Selenium IDE. Om toegang te krijgen tot de elementen in de waarschuwing (zoals het bericht dat het bevat), moeten we de "switchTo (). Alert ()" - methode gebruiken. In de onderstaande code gebruiken we deze methode om toegang te krijgen tot het waarschuwingsvenster en vervolgens het bericht op te halen met de methode "getText ()" , en vervolgens automatisch het waarschuwingsvenster te sluiten met de "switchTo (). Alert (). Accept () " methode.
Ga eerst naar http://jsbin.com/usidix/1 en klik handmatig op "Go!" knop daar en zie zelf de berichttekst.
Laten we de Selenium-voorbeeldcode bekijken om dit te doen-
pakket mijnpakket;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.firefox.FirefoxDriver;openbare klas myclass {public static void main (String [] args) {System.setProperty ("webdriver.gecko.driver", "C: \\ geckodriver.exe");WebDriver-stuurprogramma = nieuwe FirefoxDriver ();String alertMessage = "";driver.get ("http://jsbin.com/usidix/1");driver.findElement (By.cssSelector ("input [value = \" Go! \ "]")). klik ();alertMessage = driver.switchTo (). alert (). getText ();driver.switchTo (). alert (). accept ();System.out.println (alertMessage);driver.quit ();
Merk op dat op de Eclipse-console het afgedrukte waarschuwingsbericht is:
Wacht
Er zijn twee soorten wachttijden.
- Impliciet wachten - wordt gebruikt om de standaard wachttijd voor het hele programma in te stellen
- Expliciet wachten - wordt gebruikt om de wachttijd alleen voor een bepaald exemplaar in te stellen
Impliciet wachten
- Het is eenvoudiger te coderen dan Explicit Waits.
- Het wordt meestal gedeclareerd in het instantiatiegedeelte van de code.
- U heeft slechts één extra pakket nodig om te importeren.
Om een impliciete wachttijd te gebruiken, moet u dit pakket in uw code importeren.
Voeg dit vervolgens toe aan het instantiatiegedeelte van uw code.
Expliciet wachten
Expliciete wachttijden worden gedaan met behulp van de klassen WebDriverWait en ExpectedCondition . Voor het volgende Selenium WebDriver-voorbeeld zullen we tot 10 seconden wachten voordat een element waarvan de id "gebruikersnaam" is zichtbaar wordt voordat we verder gaan met het volgende commando. Hier zijn de stappen.
Stap 1
Importeer deze twee pakketten:
Stap 2
Declareer een WebDriverWait-variabele. In dit voorbeeld gebruiken we "myWaitVar" als de naam van de variabele.
Stap 3
Gebruik myWaitVar met ExpectedConditions op gedeelten waar u expliciet moet wachten. In dit geval zullen we expliciet wachten op de "gebruikersnaam" (Mercury Tours HomePage) invoer voordat we de tekst "tutorial" erop typen.
Voorwaarden
De volgende methoden worden gebruikt in voorwaardelijke bewerkingen en lusbewerkingen:
- isEnabled () wordt gebruikt als u wilt controleren of een bepaald element is ingeschakeld of niet voordat u een opdracht uitvoert.
- isDisplayed () wordt gebruikt als u wilt controleren of een bepaald element wordt weergegeven of niet voordat u een opdracht uitvoert.
- isSelected () wordt gebruikt als u wilt controleren of een bepaald selectievakje, keuzerondje of optie in een vervolgkeuzelijst is geselecteerd. Het werkt niet op andere elementen.
Met behulp van verwachte voorwaarden
De klasse ExpectedConditions biedt een bredere reeks voorwaarden die u kunt gebruiken in combinatie met de methode tot () van WebDriverWait.
Hieronder staan enkele van de meest voorkomende ExpectedConditions-methoden.
- alertIsPresent () - wacht totdat een waarschuwingsvenster wordt weergegeven.
- elementToBeClickable () - Wacht totdat een element zichtbaar is en tegelijkertijd ingeschakeld. De onderstaande voorbeeldseleniumcode wacht tot het element met zichtbaar wordt en eerst wordt ingeschakeld, voordat dat element wordt toegewezen als een WebElement-variabele met de naam "txtUserName".
- frameToBeAvailableAndSwitchToIt () - Wacht totdat het opgegeven frame al beschikbaar is, en schakelt er dan automatisch naar over.
Uitzonderingen opvangen
Wanneer isEnabled (), isDisplayed () en isSelected () wordt gebruikt, gaat WebDriver ervan uit dat het element al op de pagina bestaat. Anders genereert het een NoSuchElementException . Om dit te voorkomen, moeten we een try-catch-blok gebruiken, zodat het programma niet wordt onderbroken.
WebElement txtbox_username = driver.findElement (By.id ("gebruikersnaam"));proberen{if (txtbox_username.isEnabled ()) {txtbox_username.sendKeys ("tutorial");catch (NoSuchElementException nsee) {System.out.println (nsee.toString ());
Als u expliciete wachttijden gebruikt, is het type uitzondering dat u moet opvangen de "TimeoutException".
Overzicht
- Om de WebDriver API te kunnen gebruiken, moet u ten minste deze twee pakketten importeren.
- org.openqa.selenium. *
- org.openqa.selenium.firefox.FirefoxDriver
- De methode get () is het equivalent van het "open" -commando van Selenium IDE.
- Het lokaliseren van elementen in WebDriver wordt gedaan met behulp van de methode findElement () .
- Hieronder volgen de beschikbare opties voor het lokaliseren van elementen in WebDriver:
- Door. naam van de klasse
- Door. cssSelector
- Door. ID kaart
- Door. verbind tekst
- Door. naam
- Door. gedeeltelijkeLinkText
- Door. tagName
- Door. xpath
- De By.cssSelector () geen ondersteuning voor de "bevat" functie.
- U kunt een element instantiëren met de klasse WebElement .
- Het klikken op een element wordt gedaan met behulp van de click () methode.
- WebDriver biedt deze handige get-opdrachten :
- krijgen()
- getTitle ()
- getPageSource ()
- getCurrentUrl ()
- getText ()
- WebDriver biedt deze handige navigatieopdrachten
- navigeren (). vooruit ()
- navigeren (). terug ()
- navigeren naar()
- navigeren (). vernieuwen ()
- De methoden close () en quit () worden gebruikt om browservensters te sluiten. Close () wordt gebruikt om een enkel venster te sluiten; while quit () wordt gebruikt om alle vensters te sluiten die zijn gekoppeld aan het bovenliggende venster dat door het WebDriver-object werd bestuurd.
- De methoden switchTo (). Frame () en switchTo (). Alert () worden gebruikt om de focus van WebDriver respectievelijk op een frame of waarschuwing te richten.
- Impliciete wachttijden worden gebruikt om de wachttijd in het hele programma in te stellen, terwijl expliciete wachttijden alleen voor specifieke delen worden gebruikt.
- U kunt de methoden isEnabled (), isDisplayed (), isSelected () en een combinatie van WebDriverWait- en ExpectedConditions- methoden gebruiken bij het verifiëren van de status van een element. Ze controleren echter niet of het element niet bestaat.
- Wanneer isEnabled (), isDisplayed () of isSelected () werd aangeroepen terwijl het element niet bestond, zal WebDriver een NoSuchElementException genereren .
- Wanneer de methoden WebDriverWait en ExpectedConditions werden aangeroepen terwijl het element niet bestond, zou WebDriver een TimeoutException genereren .
Notitie:
driver.get (): het wordt gebruikt om naar de specifieke website te gaan, maar het houdt de browsergeschiedenis en cookies niet bij, dus we kunnen de knop vooruit en achteruit niet gebruiken, als we erop klikken, krijgt de pagina geen schema
driver.navigate (): het wordt gebruikt om naar de specifieke website te gaan, maar het houdt de browsergeschiedenis en cookies bij, dus we kunnen de vooruit- en achteruitknop gebruiken om tussen de pagina's te navigeren tijdens het coderen van Testcase