Selenium Webstuurprogramma Java Programmavoorbeeld
Selenium Java Voorbeeld
De Java class “myclass” die we in de vorige tutorial hebben gemaakt, laten we proberen een WebDriver-script te maken dat:
Stap 1: halen Mercury De startpagina van Tours
Stap 2: verifieer de titel ervan
Stap 3: druk het resultaat van de vergelijking af
Stap 4: sluit het voordat u het hele programma beëindigt.
Selenium WebDriver-voorbeeldcode
Hieronder vindt u de daadwerkelijke WebDriver-code voor de logica die in het bovenstaande scenario wordt gepresenteerd
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(); } }
Opmerking: starten Firefox 35, moet u het door Mozilla gemaakte gekko-stuurprogramma gebruiken om Web Driver te gebruiken. Selenium 3.0, gecko en firefox hebben compatibiliteitsproblemen en het correct instellen ervan kan een lastige opgave worden. Als de code niet werkt, downgrade dan naar Firefox versie 47 of lager. Als alternatief kunt u uw scripts uitvoeren in Chrome. Selenium werkt out of the box voor Chrome. U hoeft slechts 3 regels code te wijzigen om uw script te laten werken met Chrome of Firefox
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 instantiëren die is geladen met een specifiek stuurprogramma
- org.openqa.selenium.firefox.Firefoxbestuurder - bevat de FirefoxBestuurdersklasse die nodig is om a te instantiëren Firefox-specifiek stuurprogramma naar de browser die wordt geïnstantieerd door de WebDriver-klasse
Als uw test ingewikkelder acties vereist, zoals toegang krijgen tot een andere klasse, browserscreenshots maken of externe bestanden manipuleren, zult u zeker meer pakketten moeten importeren.
Objecten en variabelen instantiëren
Normaal gesproken is dit de manier waarop een driverobject wordt geïnstantieerd.
WebDriver driver = new FirefoxDriver();
A FirefoxStuurprogrammaklasse zonder parameters betekent dat de standaard Firefox profiel wordt gelanceerd door onze Java programma. De standaard Firefox profiel is vergelijkbaar met lanceren Firefox in de veilige modus (er zijn geen extensies geladen).
Voor het gemak hebben we de basis-URL en de verwachte titel als variabelen opgeslagen.
Een browsersessie starten
WebDrivers krijgen() methode wordt gebruikt om een nieuwe browsersessie te starten en deze naar de URL te leiden die u als parameter opgeeft.
driver.get(baseUrl);
Haal de werkelijke paginatitel op
De WebDriver-klasse heeft de getTitle () methode die altijd wordt gebruikt om de paginatitel van de momenteel geladen pagina te verkrijgen.
actualTitle = driver.getTitle();
Vergelijk de verwachte en werkelijke waarden
Dit gedeelte van de code gebruikt eenvoudigweg een basis Java if-else-structuur om de werkelijke titel te vergelijken met de verwachte titel.
if (actualTitle.contentEquals(expectedTitle)){ System.out.println("Test Passed!"); } else { System.out.println("Test Failed"); }
Een browsersessie beëindigen
De "dichtbij()”-methode wordt gebruikt om het browservenster te sluiten.
driver.close();
Het hele programma beëindigen
Als u deze opdracht gebruikt zonder eerst alle browservensters te sluiten, wordt uw hele Java het programma eindigt terwijl het browservenster open blijft.
System.exit(0);
De test uitvoeren
Er zijn twee manieren om code uit te voeren Eclipse IDE.
- On Eclipse's menubalk, klik op Uitvoeren > Uitvoeren.
- Media Ctrl + F11 om de volledige code uit te voeren.
Als je alles goed hebt gedaan, Eclipse zou "Test geslaagd!" weergeven
GUI-elementen lokaliseren
Het lokaliseren van elementen in WebDriver gebeurt met behulp van de “findElement(door.locator())methode. Het “locator”-gedeelte van de code is hetzelfde als elk van de locators die eerder zijn besproken in de Selenium IDE hoofdstukken van deze tutorials. In feite wordt aanbevolen dat u GUI-elementen lokaliseert met behulp van IDE en, zodra deze succesvol zijn geïdentificeerd, de code naar WebDriver exporteert.
Hier is een Selenium voorbeeldcode die een element lokaliseert op basis van zijn ID. Facebook wordt gebruikt als 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); } }
We gebruikten de getTagNaam() methode om de tagnaam van dat specifieke element te extraheren waarvan de id "email" is. Wanneer deze code wordt uitgevoerd, zou deze de tagnaam "input" correct moeten kunnen identificeren en deze op het scherm moeten kunnen afdrukken. Eclipse's Consolevenster.
Samenvatting voor het lokaliseren van elementen
Variatie | Beschrijving | Sample |
---|---|---|
By.className | 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 | lokaliseert elementen op basis van de waarde van hun 'id'-attribuut |
findElement(By.id(“someId”)) |
Door.linkText | vindt een linkelement op basis van de exacte tekst die het weergeeft |
findElement(By.linkText(“REGISTRATIE”)) |
Bij naam | lokaliseert elementen op basis van de waarde van het attribuut “name”. |
findElement(By.name(“eenNaam”)) |
Door.gedeeltelijkeLinkText | lokaliseert elementen die de gegeven linktekst bevatten |
findElement(By.partialLinkText(“REG”)) |
Op.tagnaam | lokaliseert elementen op basis van 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 functie "bevat" niet. Houd rekening met de Selenium IDE-code hieronder –
In Selenium IDE hierboven, de hele test is geslaagd. Echter in de Selenium WebDriver-script hieronder genereerde dezelfde test een fout omdat WebDriver het trefwoord “bevat” niet ondersteunt bij gebruik in de methode By.cssSelector().
Gemeenschappelijke commando's
Webelementen instantiëren
In plaats van de lange syntaxis "driver.findElement(By.locator())" te gebruiken elke keer dat u een bepaald element wilt benaderen, kunnen we een WebElement-object hiervoor instantiëren. De WebElement-klasse is opgenomen in het pakket "org.openqa.selenium.*".
Klikken op een element
Klikken is misschien wel de meest gebruikelijke manier van interactie met webelementen. De click()
methode wordt gebruikt om het klikken op een element te simuleren. De volgende Selenium Java voorbeeld laat zien hoe click()
werd gebruikt om op te klikken Mercury De knop 'Inloggen' van Tours.
Bij het gebruik van de click()-methode moet u op de volgende zaken letten.
- Er zijn geen parameters/argumenten voor nodig.
- De methode wacht automatisch tot er een nieuwe pagina wordt geladen, indien van toepassing.
- Het op te klikken element 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 |
---|---|
krijgen()
Voorbeeld gebruik: |
|
getTitle ()
Voorbeeld gebruik: |
|
getPageSource()
Voorbeeld gebruik: |
|
getCurrentUrl()
Voorbeeld gebruik: |
|
getText ()
Voorbeeld gebruik: |
|
Navigeer door opdrachten
Met deze opdrachten kunt u verschillende webpagina's vernieuwen, openen en heen en weer schakelen.
navigeren naar()
Voorbeeld gebruik: |
|
navigeren().vernieuwen()
Voorbeeld gebruik: |
|
navigeren().terug()
Voorbeeld gebruik: |
|
navigeren().vooruit()
Voorbeeld gebruik: |
|
Browser sluiten en afsluiten Windows
dichtbij()
Voorbeeld gebruik: |
|
quit ()
Voorbeeld gebruik: |
|
Om het verschil tussen duidelijk te illustreren close()
en quit()
, probeer de onderstaande code uit te voeren. Het maakt gebruik van 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 werd 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 pop-ups hierboven ook automatisch worden gesloten.
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 } }
Schakelen tussen frames
Om toegang te krijgen tot GUI-elementen in een frame, moeten we WebDriver eerst opdracht geven zich eerst op het frame of het pop-upvenster te concentreren voordat we toegang krijgen tot elementen daarin. Laten we bijvoorbeeld de webpagina nemen https://demo.guru99.com/selenium/deprecated.html
Deze pagina heeft 3 frames waarvan de “naam”-attributen hierboven zijn aangegeven. We willen toegang krijgen tot de link 'Verouderd' die hierboven in het geel is omcirkeld. Om dat te doen, moeten we WebDriver eerst de opdracht geven om over te schakelen naar het “classFrame”-frame met behulp van de “schakelNaar().frame()” methode. We zullen het naamattribuut van het frame gebruiken als de parameter voor het gedeelte “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(); } }
Na het uitvoeren van deze code zult u zien dat het ‘classFrame’-frame naar de pagina ‘Verouderde API’ wordt gebracht, wat betekent dat onze code met succes toegang heeft gekregen tot de link ‘Verouderd’.
Schakelen tussen pop-ups Windows
WebDriver maakt het mogelijk om pop-upvensters weer te geven die lijken op waarschuwingen, in tegenstelling tot Selenium IDE. Om toegang te krijgen tot de elementen binnen de waarschuwing (zoals het bericht dat deze bevat), moeten we de "switchTo().alert()"
methode. In de onderstaande code gebruiken we deze methode om toegang te krijgen tot het waarschuwingsvenster en vervolgens het bericht op te halen met behulp van de "getText()"
methode, en sluit vervolgens automatisch het waarschuwingsvenster met behulp van de "switchTo().alert().accept()"
methode.
Ga eerst naar https://output.jsbin.com/usidix/1 en klik handmatig op de knop "Go!" knop daar en bekijk zelf de berichttekst.
Laten we eens kijken Selenium voorbeeldcode om dit te doen-
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(); } }
Op de Eclipse console, merk op dat het afgedrukte waarschuwingsbericht het volgende is:
Wacht
Er zijn twee soorten wachttijden.
- Impliciet wachten – wordt gebruikt om de standaardwachttijd voor het hele programma in te stellen
- Expliciet wachten – wordt gebruikt om de wachttijd alleen voor een bepaald exemplaar in te stellen
Impliciete wachttijd
- 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 gaan gebruiken, moet u dit pakket in uw code importeren.
Voeg dit vervolgens toe aan het instantiatiegedeelte van uw code.
Expliciete wachttijd
Expliciete wachttijden worden uitgevoerd met behulp van de klassen WebDriverWait en ExpectedCondition. Voor de volgende Selenium WebDriver zullen we bijvoorbeeld maximaal 10 seconden wachten totdat een element met de id “gebruikersnaam” zichtbaar wordt voordat we doorgaan met de volgende opdracht. 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 voor gedeelten waar u expliciet moet wachten. In dit geval gebruiken we expliciet wachten op de “gebruikersnaam” (Mercury Tours HomePage) invoer voordat we de tekst “tutorial” erop typen.
Klachten
De volgende methoden worden gebruikt bij voorwaardelijke en lusbewerkingen:
- is ingeschakeld() wordt gebruikt wanneer u wilt verifiëren of een bepaald element is ingeschakeld of niet voordat u een opdracht uitvoert.
- wordt weergegeven() wordt gebruikt als u wilt controleren of een bepaald element wordt weergegeven voordat u een opdracht uitvoert.
- is geselecteerd() wordt gebruikt wanneer u wilt verifiëren of een bepaalde selectievakje, keuzerondje of optie in een vervolgkeuzelijst is geselecteerd. Op andere elementen werkt het niet.
Verwachte voorwaarden gebruiken
De klasse ExpectedConditions biedt een bredere set voorwaarden die u kunt gebruiken in combinatie met de methode until() van WebDriverWait.
Hieronder staan enkele van de meest voorkomende ExpectedConditions-methoden.
- alertIsAanwezig() – wacht totdat er een waarschuwingsvenster wordt weergegeven.
- elementToBeClickable() – Wacht tot een element zichtbaar en tegelijkertijd ingeschakeld is. Het voorbeeld Selenium De onderstaande code wacht totdat het element met id=”username” eerst zichtbaar en ingeschakeld wordt voordat dat element wordt toegewezen als een WebElement-variabele met de naam “txtUserName”.
- frameToBeAvailableAndSwitchToIt() – Wacht tot het opgegeven frame al beschikbaar is en schakelt er vervolgens automatisch naar over.
Uitzonderingen opvangen
Bij gebruik van isEnabled(), isDisplayed() en isSelected() gaat WebDriver ervan uit dat het element al op de pagina bestaat. Anders zal het een Geen DergelijkElementUitzondering. Om dit te voorkomen, moeten we een try-catch-blok gebruiken, zodat het programma niet wordt onderbroken.
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()); }
Als u expliciete wachttijden gebruikt, is het type uitzondering dat u moet opvangen de “TimeoutException”.
Samenvatting
- Om de WebDriver API te kunnen gebruiken, moet u minimaal deze twee pakketten importeren.
- org.openqa.selenium.*
- org.openqa.selenium.firefox.Firefoxbestuurder
- Uw partner voor
get()
methode is het equivalent van Selenium IDE's "open" -commando. - Het lokaliseren van elementen in WebDriver gebeurt met behulp van de
findElement()
methode. - Hieronder staan de beschikbare opties voor het lokaliseren van elementen in WebDriver:
- By.className
- Door.cssSelector
- Door.id
- Door.linkText
- Bij naam
- Door.gedeeltelijkeLinkText
- Op.tagnaam
- Door.xpath
- De By.cssSelector() niet steun het “bevat” kenmerk.
- U kunt een element instantiëren met behulp van de klasse WebElement.
- Klikken op een element doe je 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; terwijlquit()
wordt gebruikt om alle vensters te sluiten die gekoppeld zijn aan het bovenliggende venster dat door het WebDriver-object werd bestuurd. - Uw partner voor
switchTo().frame()
enswitchTo().alert()
Er worden methoden gebruikt om de focus van WebDriver op respectievelijk een frame of waarschuwing te richten. Implicit waits
worden gebruikt om de wachttijd gedurende het hele programma in te stellen, terwijlexplicit waits
worden alleen op specifieke porties gebruikt.- U kunt isEnabled(), isDisplayed(), isSelected() en een combinatie van gebruiken WebDriverWacht en Verwachte omstandigheden methoden bij het verifiëren van de toestand van een element. Ze verifiëren echter niet of het element niet bestaat.
- Wanneer isEnabled(), isDisplayed() of isSelected() werd aangeroepen terwijl het element niet bestond, zal WebDriver een foutmelding geven. Geen DergelijkElementUitzondering.
- Wanneer de methoden WebDriverWait en ExpectedConditions werden aangeroepen terwijl het element niet bestond, gooide WebDriver een
TimeoutException
.
Opmerking:
driver.get()
: Deze methode wordt gebruikt om naar een bepaalde website te navigeren. Het houdt echter geen browsergeschiedenis of cookies bij. Als gevolg hiervan werken de vooruit- en achteruitknoppen niet en wordt de paginanavigatie niet gepland als u erop klikt.
driver.navigate()
: Deze methode wordt ook gebruikt om naar een bepaalde website te navigeren, maar het onderhoudt de browsergeschiedenis en cookies. Hierdoor kunnen de vooruit- en achteruitknoppen worden gebruikt voor navigatie tussen pagina's tijdens het coderen van een testcase.