Leitfaden für Selen mit JUnit/TestNG

Leitfaden für Selen mit JUnit / TestNG

1. Einführung

Dieser Artikel ist eine schnelle, praktische Einführung in die Arbeit mitSelenium und das Schreiben von Tests mitJUnit undTestNG.

2. Selen-Integration

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

Fügen Sie in der Dateipom.xml die folgende Abhängigkeit hinzu:


    org.seleniumhq.selenium
    selenium-java
    3.4.0

Die neueste Version finden Sie inMaven Central Repository.

2.2. Selen-Konfiguration

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

public class SeleniumConfig {

    private WebDriver driver;

    //...

}

Da wir eine Selenium 3.x-Version verwenden, müssen wir den Pfad einer ausführbarenGeckoDriver-Datei (basierend auf Ihrem Betriebssystem) mithilfe einer Systemeigenschaft namenswebdriver.gecko.driverangeben. Die neueste Version von GeckoDriver ist möglicherweise verfügbar vonGithub Geckodriver Releases heruntergeladen werden.

Initialisieren wir nun dieWebDriver im Konstruktor. Außerdem legen wir 5 Sekunden als Zeitüberschreitung fürWebDriver fest, um auf das Erscheinen eines Elements auf der Seite zu warten:

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 im zweiten Teil dieser Serie werden wir mehr darüber erfahren.

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

public class SeleniumExample {

    private SeleniumConfig config;
    private String url = "http://www.example.com/";

    public SeleniumExample() {
        config = new SeleniumConfig();
        config.getDriver().get(url);
    }

    // ...
}

Hier initialisieren wirSeleniumConfig 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 abzurufen:

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

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

Um zum Abschnitt "Info" von example.com zu navigieren, müssen wir einecloseOverlay()-Methode erstellen, die das Overlay beim Laden einer Homepage überprüft und schließt. Danach navigieren wir mit dergetAboutexamplePage()-Methode zur Info-Beispielseite:

public void getAboutexamplePage() {
    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() {
    this.config.getDriver().findElement(By.partialLinkText("About")).click();
}

private void clickAboutUsLink() {
    Actions builder = new Actions(config.getDriver());
    WebElement element = this.config.getDriver()
      .findElement(By.partialLinkText("About example."));
    builder.moveToElement(element)
      .build()
      .perform();
}

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

public boolean isAuthorInformationAvailable() {
    return this.config.getDriver()
      .findElement(By.cssSelector("article > .row > div"))
      .isDisplayed();
}

Als Nächstes testen wir diese Klasse mit JUnit und TestNG.

3. Mit JUnit

Erstellen wir eine neue Testklasse alsSeleniumWithJUnitLiveTest:

public class SeleniumWithJUnitLiveTest {

    private static SeleniumExample seleniumExample;
    private String expectedTitle = "example | Java, Spring and Web Development tutorials";

    // more code goes here...

}

Wir werden die Annotation@BeforeClassvonorg.junit.BeforeClass verwenden, um eine Ersteinrichtung durchzuführen. In diesersetUp()-Methode werden wir dasSeleniumExample-Objekt initialisieren:

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

In ähnlicher Weise sollten wir den neu geöffneten Browser schließen, wenn unser Testfall abgeschlossen ist. Wir werden dies mit der Annotation von@AfterClasstun, um die Einstellungen zu bereinigen, wenn die Testfallausführung abgeschlossen ist:

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

Bitte beachten Sie den Modifikatorstatic in unserer MitgliedsvariablenSeleniumExample- da wir diese Variable in den statischen MethodensetUp() undtearDown()verwenden müssen -@BeforeClass und@AfterClass kann nur mit statischen Methoden aufgerufen werden.

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

@Test
public void whenAboutexampleIsLoaded_thenAboutEugenIsMentionedOnPage() {
    seleniumExample.getAboutexamplePage();
    String actualTitle = seleniumExample.getTitle();

    assertNotNull(actualTitle);
    assertEquals(expectedTitle, actualTitle);
    assertTrue(seleniumExample.isAuthorInformationAvailable());
}

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

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

4. Mit TestNG

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

Beachten Sie, dass bei Verwendung von Eclipse das TestNG-Plugin möglicherweise vonEclipse Marketplaceheruntergeladen und installiert wird.

Erstellen wir zunächst eine neue Testklasse:

public class SeleniumWithTestNGLiveTest {

    private SeleniumExample seleniumExample;
    private String expectedTitle = "example | Java, Spring and Web Development tutorials";

    // more code goes here...

}

Wir verwenden eine@BeforeSuite-Annotation vonorg.testng.annotations.BeforeSuite, um unsereSeleniumExample class zu instanziieren. DiesetUp()-Methode wird unmittelbar vor der Aktivierung der Testsuite gestartet:

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

In ähnlicher Weise verwenden wir die Annotation@AfterSuitevonorg.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 abschließend unseren Test implementieren:

@Test
public void whenAboutexampleIsLoaded_thenAboutEugenIsMentionedOnPage() {
    seleniumExample.getAboutexamplePage();
    String actualTitle = seleniumExample.getTitle();

    assertNotNull(actualTitle);
    assertEquals(expectedTitle, actualTitle);
    assertTrue(seleniumExample.isAuthorInformationAvailable());
}

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

5. Fazit

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 Artikelover at GitHub. verfügbar