Guide de sélénium avec JUnit/TestNG

Guide de sélénium avec JUnit / TestNG

1. introduction

Cet article est une introduction rapide et pratique à l'utilisation deSelenium et à l'écriture de tests avecJUnit etTestNG.

2. Intégration de sélénium

Dans cette section, nous allons commencer par un scénario simple: ouvrir une fenêtre de navigateur, accéder à une URL donnée et rechercher le contenu souhaité sur la page.

2.1. Dépendances Maven

Dans le fichierpom.xml, ajoutez la dépendance suivante:


    org.seleniumhq.selenium
    selenium-java
    3.4.0

La dernière version se trouve dans lesMaven Central Repository.

2.2. Configuration du sélénium

Tout d'abord, créez un nouveau fichier de classe Java appeléSeleniumConfig:

public class SeleniumConfig {

    private WebDriver driver;

    //...

}

Étant donné que nous utilisons une version Selenium 3.x, nous devons spécifier le chemin d'un fichier exécutableGeckoDriver (basé sur votre système d'exploitation) en utilisant une propriété système appeléewebdriver.gecko.driver La dernière version de GeckoDriver peut être téléchargé depuisGithub Geckodriver Releases.

Initialisons maintenant lesWebDriver dans le constructeur, nous allons également définir 5 secondes comme délai d'attente pourWebDriver pour attendre qu'un élément de la page apparaisse:

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 "";
}

Cette classe de configuration contient quelques méthodes que nous allons ignorer pour le moment, mais nous en verrons plus à ce sujet dans la deuxième partie de cette série.

Ensuite, nous devrons implémenter une classeSeleniumExample:

public class SeleniumExample {

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

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

    // ...
}

Ici, nous initialiserons lesSeleniumConfig et définirons l'URL souhaitée vers laquelle naviguer. De même, nous allons mettre en œuvre une API simple pour fermer le navigateur et obtenir le titre de la page:

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

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

Pour accéder à la section À propos de example.com, nous devons créer une méthodecloseOverlay() qui vérifie et ferme la superposition sur un chargement de page d'accueil. Ensuite, nous accédons à la page d'exemple À propos en utilisant la méthodegetAboutexamplePage():

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();
}

Nous pouvons vérifier si les informations requises sont disponibles sur la page affichée:

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

Nous allons maintenant tester cette classe avec JUnit et TestNG.

3. Avec JUnit

Créons une nouvelle classe de test en tant queSeleniumWithJUnitLiveTest:

public class SeleniumWithJUnitLiveTest {

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

    // more code goes here...

}

Nous allons utiliser l'annotation@BeforeClass deorg.junit.BeforeClass pour effectuer une configuration initiale. Dans cette méthodesetUp(), nous allons initialiser l'objetSeleniumExample:

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

De la même manière, lorsque notre scénario de test se termine, nous devrions fermer le navigateur récemment ouvert. Nous allons le faire avec l'annotation@AfterClass - pour nettoyer les paramètres lorsque l'exécution du scénario de test est terminée:

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

Veuillez noter le modificateurstatic sur notre variable membreSeleniumExample - car nous devons utiliser cette variable dans les méthodes statiquessetUp() ettearDown() -@BeforeClass et@AfterClass ne peut être invoqué que sur des méthodes statiques.

Enfin, nous pouvons créer notre test complet:

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

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

Cette méthode de test affirme que le titre de la page Web n'est pasnull et est défini comme prévu. De plus, nous vérifions que la page contient les informations attendues.

Lorsque le test est exécuté, il ouvre simplement l’URL dans Firefox, puis le ferme après que le titre de la page Web et le contenu aient été vérifiés.

4. Avec TestNG

Utilisons maintenant TestNG pour exécuter notre scénario / suite de test.

Notez que si vous utilisez Eclipse, le plugin TestNG peut être téléchargé et installé à partir desEclipse Marketplace.

Commençons par créer une nouvelle classe de test:

public class SeleniumWithTestNGLiveTest {

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

    // more code goes here...

}

Nous utiliserons une annotation@BeforeSuite deorg.testng.annotations.BeforeSuite pour instancier nosSeleniumExample class. La méthodesetUp() sera lancée juste avant l'activation de la suite de tests:

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

De même, nous utiliserons l'annotation@AfterSuite deorg.testng.annotations.AfterSuite pour fermer notre navigateur ouvert une fois la suite de tests terminée:

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

Enfin, mettons en œuvre notre test:

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

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

Une fois la suite de tests terminée avec succès, nous trouvons des rapports HTML et XML dans le dossiertest-output du projet. Ces rapports résument les résultats du test.

5. Conclusion

Dans cet article rapide, nous nous sommes concentrés sur une introduction rapide à l'écriture de tests Selenium 3 avec JUnit et TestNG.

Comme toujours, la source de l'article est disponibleover at GitHub.