Leitfaden zu Selen mit JUnit / TestNG

1. Einleitung

Dieser Artikel ist eine schnelle, praktische Einführung in die Arbeit mit Selen und das Schreiben von Tests mit JUnit und TestNG.

2. Selenintegration

In diesem Abschnitt beginnen wir mit einem einfachen Szenario: Öffnen eines Browserfensters, Navigieren zu einer bestimmten URL und Suchen nach gewünschten Inhalten auf der Seite.

2.1. Maven-Abhängigkeiten

In der pom.xml - Datei die folgende Abhängigkeit:

 org.seleniumhq.selenium selenium-java 3.4.0 

Die neueste Version finden Sie im Maven Central Repository.

2.2. Selen-Konfiguration

Erstellen Sie zunächst eine neue Java-Klassendatei mit dem Namen SeleniumConfig :

public class SeleniumConfig { private WebDriver driver; //... }

Da wir eine Selenium 3.x-Version verwenden, müssen wir den Pfad einer ausführbaren GeckoDriver- Datei (basierend auf Ihrem Betriebssystem) mithilfe einer Systemeigenschaft namens webdriver.gecko.driver angeben. Die neueste Version des GeckoDriver kann von Github heruntergeladen werden Geckodriver-Veröffentlichungen.

Lassen Sie uns nun den WebDriver im Konstruktor initialisieren. Außerdem legen wir 5 Sekunden als Zeitüberschreitung fest , damit WebDriver auf das Erscheinen eines Elements auf der Seite wartet:

public SeleniumConfig() { Capabilities capabilities = DesiredCapabilities.firefox(); driver = new FirefoxDriver(capabilities); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); } static { System.setProperty("webdriver.gecko.driver", findFile("geckodriver.mac")); } static private String findFile(String filename) { String paths[] = {"", "bin/", "target/classes"}; for (String path : paths) { if (new File(path + filename).exists()) return path + filename; } return ""; }

Diese Konfigurationsklasse enthält einige Methoden, die wir vorerst ignorieren werden, aber wir werden im zweiten Teil dieser Serie mehr darüber erfahren.

Als nächstes müssen wir eine SeleniumExample- Klasse implementieren :

public class SeleniumExample { private SeleniumConfig config; private String url = "//www.baeldung.com/"; public SeleniumExample() { config = new SeleniumConfig(); config.getDriver().get(url); } // ... }

Hier initialisieren wir die SeleniumConfig und legen die gewünschte URL für die Navigation fest. Ebenso implementieren wir eine einfache API, um den Browser zu schließen und den Titel der Seite zu erhalten:

public void closeWindow() { this.config.getDriver().close(); } public String getTitle() { return this.config.getDriver().getTitle(); }

Um zum Abschnitt "Info" von baeldung.com zu navigieren, müssen wir eine closeOverlay () -Methode erstellen , die das Overlay beim Laden einer Homepage überprüft und schließt. Danach navigieren wir mit der Methode getAboutBaeldungPage () zur Seite "Über Baeldung" :

public void getAboutBaeldungPage() { closeOverlay(); clickAboutLink(); clickAboutUsLink(); } private void closeOverlay() { List webElementList = this.config.getDriver() .findElements(By.tagName("a")); if (webElementList != null) { webElementList.stream() .filter(webElement -> "Close".equalsIgnoreCase(webElement.getAttribute("title"))) .filter(WebElement::isDisplayed) .findAny() .ifPresent(WebElement::click); } } private void clickAboutLink() { Actions actions = new Actions(config.getDriver()); WebElement aboutElement = this.config.getDriver() .findElement(By.id("menu-item-6138")); actions.moveToElement(aboutElement).perform(); } private void clickAboutUsLink() { WebElement element = this.config.getDriver() .findElement(By.partialLinkText("About Baeldung.")); element.click(); }

Wir können überprüfen, ob die erforderlichen Informationen auf der angezeigten Seite verfügbar sind:

public boolean isAuthorInformationAvailable() { return this.config.getDriver() .getPageSource() .contains("Hey ! I'm Eugen"); }

Als nächstes werden wir diese Klasse sowohl mit JUnit als auch mit TestNG testen.

3. Mit JUnit

Erstellen wir eine neue Testklasse als SeleniumWithJUnitLiveTest:

public class SeleniumWithJUnitLiveTest  private static SeleniumExample seleniumExample; private String expectedTitle = "About Baeldung 

Wir werden die @ BeforeClass- Annotation von org.junit.BeforeClass verwenden , um eine Ersteinrichtung durchzuführen . In dieser setUp () -Methode werden wir das SeleniumExample- Objekt initialisieren :

@BeforeClass public static void setUp() { seleniumExample = new SeleniumExample(); }

In ähnlicher Weise sollten wir nach Abschluss unseres Testfalls den neu geöffneten Browser schließen. Wir werden dies mit der @ AfterClass- Annotation tun , um die Einstellungen zu bereinigen, wenn die Testfallausführung abgeschlossen ist:

@AfterClass public static void tearDown() { seleniumExample.closeWindow(); }

Bitte beachten Sie den statischen Modifikator in unserer SeleniumExample- Mitgliedsvariablen, da wir diese Variable in den statischen Methoden setUp () und tearDown () verwenden müssen. @BeforeClass und @AfterClass können nur für statische Methoden aufgerufen werden.

Schließlich können wir unseren vollständigen Test erstellen:

@Test public void whenAboutBaeldungIsLoaded_thenAboutEugenIsMentionedOnPage() { seleniumExample.getAboutBaeldungPage(); String actualTitle = seleniumExample.getTitle(); assertNotNull(actualTitle); assertEquals(expectedTitle, actualTitle); assertTrue(seleniumExample.isAuthorInformationAvailable()); }

Diese Testmethode bestätigt, dass der Titel der Webseite nicht null ist und wie erwartet festgelegt wird. Außerdem überprüfen wir, ob die Seite die erwarteten Informationen enthält.

Wenn der Test ausgeführt wird, wird die URL in Firefox einfach geöffnet und anschließend geschlossen, nachdem der Titel der Webseite und der Inhalt überprüft wurden.

4. Mit TestNG

Verwenden wir jetzt TestNG, um unseren Testfall / unsere Suite auszuführen.

Beachten Sie, dass bei Verwendung von Eclipse das TestNG-Plugin möglicherweise vom Eclipse Marketplace heruntergeladen und installiert werden kann.

Erstellen wir zunächst eine neue Testklasse:

public class SeleniumWithTestNGLiveTest  private SeleniumExample seleniumExample; private String expectedTitle = "About Baeldung 

Wir werden eine @ BeforeSuite- Annotation von org.testng.annotations.BeforeSuite verwenden , um unsere SeleniumExample-Klasse zu instanziieren . Die setUp () -Methode wird unmittelbar vor der Aktivierung der Testsuite gestartet:

@BeforeSuite public void setUp() { seleniumExample = new SeleniumExample(); }

In ähnlicher Weise verwenden wir die Annotation @AfterSuite von org.testng.annotations.AfterSuite , um unseren geöffneten Browser zu schließen, sobald die Testsuite abgeschlossen ist:

@AfterSuite public void tearDown() { seleniumExample.closeWindow(); }

Lassen Sie uns zum Schluss unseren Test implementieren:

@Test public void whenAboutBaeldungIsLoaded_thenAboutEugenIsMentionedOnPage() { seleniumExample.getAboutBaeldungPage(); String actualTitle = seleniumExample.getTitle(); assertNotNull(actualTitle); assertEquals(expectedTitle, actualTitle); assertTrue(seleniumExample.isAuthorInformationAvailable()); }

Nach erfolgreichem Abschluss der Testsuite finden wir HTML- und XML-Berichte im Testausgabeordner des Projekts. Diese Berichte fassen die Testergebnisse zusammen.

5. Schlussfolgerung

In diesem kurzen Artikel haben wir uns auf eine kurze Einführung in das Schreiben von Selenium 3-Tests mit JUnit und TestNG konzentriert.

Wie immer ist die Quelle für den Artikel bei GitHub verfügbar.