Formation Selenium

Vous trouverez ci-dessous le code source des différents Travaux Pratiques de la formation Selenium 4 dispensée par Progideo.

2.3 Mon premier script

package ProBook;

//Nous devons importer les packages Selenium nécessaires pour notre script.
//La class WebDriver permet d'invoquer un nouveau navigateur.
import org.openqa.selenium.WebDriver;
//La class FirefoxDriver permet d'invoquer le driver du navigateur Firefox
import org.openqa.selenium.firefox.FirefoxDriver;
//Dans ce script, on utilisera également la méthode By (voir plus loin)
import org.openqa.selenium.By;

public class Login {

	public static void main(String[] args) {
		// Déclaration des variables que nous allons utiliser dans ce script.
        String url = "http://probook.progideo.com";
        String expectedTitle1 = "Fil d'actualités - ProBook";
        String actualTitle1 = null;
        String username = "progideo";
        String password = "progideo";
        String expectedTitle2 = "(6) Fil d'actualités - ProBook";
        String actualTitle2 = null;

        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        WebDriver driver = new FirefoxDriver();
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);

        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On récupère le titre de la page actuelle
        actualTitle1 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login page title : expected value is "+expectedTitle1+" actual value is "+actualTitle1);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle1.contentEquals(expectedTitle1)) {
            System.out.println("Test Failed");
        }

        // On saisit le username et le password
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();
        
        // On vérifie le titre de la page suite à la tentative de connexion
        actualTitle2 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login result : expected value is "+expectedTitle2+" actual value is "+actualTitle2);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle2.contentEquals(expectedTitle2)) {
            System.out.println("Test Failed");
        }

        // On ferme Firefox
        driver.close();
    }
}

2.5 Scripts avancés

Login.java avec wait

package ProBook;

//Nous devons importer les packages Selenium nécessaires pour notre script.
//La class WebDriver permet d'invoquer un nouveau navigateur.
import org.openqa.selenium.WebDriver;
//La class FirefoxDriver permet d'invoquer le driver du navigateur Firefox
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

//Dans ce script, on utilisera également la méthode By (voir plus loin)
import org.openqa.selenium.By;

public class Login {

	public static void main(String[] args) {
		// Déclaration des variables que nous allons utiliser dans ce script.
        String url = "http://probook.progideo.com";
        String expectedTitle1 = "Fil d'actualités - ProBook";
        String actualTitle1 = null;
        String username = "progideo";
        String password = "progideo";
        String expectedTitle2 = "(6) Fil d'actualités - ProBook";
        String actualTitle2 = null;

        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        WebDriver driver = new FirefoxDriver();
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);

        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On récupère le titre de la page actuelle
        actualTitle1 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login page title : expected value is "+expectedTitle1+" actual value is "+actualTitle1);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle1.contentEquals(expectedTitle1)) {
            System.out.println("Test Failed");
        }

        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("login_username")));

        // On saisit le username et le password
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();
        
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-dropdown-link")));
        
        // On vérifie le titre de la page suite à la tentative de connexion
        actualTitle2 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login result : expected value is "+expectedTitle2+" actual value is "+actualTitle2);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle2.contentEquals(expectedTitle2)) {
            System.out.println("Test Failed");
        }

        // On ferme Firefox
        driver.close();
    }
}

8 méthodes de recherche

package ProBook;

//Nous devons importer les packages Selenium nécessaires pour notre script.
//La class WebDriver permet d'invoquer un nouveau navigateur.
import org.openqa.selenium.WebDriver;
//La class FirefoxDriver permet d'invoquer le driver du navigateur Firefox
import org.openqa.selenium.firefox.FirefoxDriver;

//Dans ce script, on utilisera également la méthode By (voir plus loin)
import org.openqa.selenium.By;

public class SearchMethods {

	public static void main(String[] args) {
		// Déclaration des variables que nous allons utiliser dans ce script.
        String url = "http://www.testingtoolsguide.net";

        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        WebDriver driver = new FirefoxDriver();
        // Ouvrir la page "http://www.testingtoolsguide.net".
        driver.get(url);

        System.out.println("Nom du site : "+driver.findElement(By.className("header-logo")).getText());
        System.out.println("Nom du lien d'ajout d'un nouvel outil : "+driver.findElement(By.cssSelector("a[href*=create-new-submission]")).getText());
        System.out.println("Filigrane du champ de recherche : "+driver.findElement(By.id("s")).getAttribute("placeholder"));
        System.out.println("Lien associé au terme feedback : "+driver.findElement(By.linkText("feedback")).getAttribute("href"));
        System.out.println("Identifiant du champ keyword : "+driver.findElement(By.name("keyword")).getAttribute("id"));
        System.out.println("Adresse complète du lien pour s'enregistrer : "+driver.findElement(By.partialLinkText("register")).getAttribute("href"));
        System.out.println("Adresse du premier lien : "+driver.findElement(By.tagName("a")).getAttribute("href"));
        System.out.println("Nom du permier outil dans la liste aléatoire : "+driver.findElement(By.xpath("/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[3]/div[1]/div[1]/div[1]/div[1]/div[1]/span[1]/a[1]")).getText());

        // On ferme Firefox
        driver.close();
    }
}

Parcourir le Random Listing sur www.testingtoolsguide.net

package ProBook;

//Nous devons importer les packages Selenium nécessaires pour notre script.
//La class WebDriver permet d'invoquer un nouveau navigateur.
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
//La class FirefoxDriver permet d'invoquer le driver du navigateur Firefox
import org.openqa.selenium.firefox.FirefoxDriver;

import java.util.ArrayList;
import java.util.List;

//Dans ce script, on utilisera également la méthode By (voir plus loin)
import org.openqa.selenium.By;

public class RandomListing {

	public static void main(String[] args) {
		// Déclaration des variables que nous allons utiliser dans ce script.
        String url = "http://www.testingtoolsguide.net";

        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        WebDriver driver = new FirefoxDriver();
        // Ouvrir la page "http://www.testingtoolsguide.net".
        driver.get(url);

        List<WebElement> link = driver.findElements(By.xpath("//span[@class='listing-box-title']/a"));
        ArrayList<String> toolsList = new ArrayList<String>();
        ArrayList<String> linkList = new ArrayList<String>();
        for (WebElement element:link) {
            toolsList.add(element.getText());
            linkList.add(element.getAttribute("href"));
        }
        int i = 0;
		for (String tool:toolsList) {
            System.out.println("Test du lien vers : "+tool);
            driver.get(linkList.get(i));
            System.out.println("Le nom de la page est : "+driver.getTitle());
            i++;
        }
        
        // On ferme Firefox
        driver.close();
    }
}

Page contact sur www.testingtoolsguide.net

package ProBook;

//Nous devons importer les packages Selenium nécessaires pour notre script.
//La class WebDriver permet d'invoquer un nouveau navigateur.
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
//La class FirefoxDriver permet d'invoquer le driver du navigateur Firefox
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.interactions.Actions;
//Dans ce script, on utilisera également la méthode By (voir plus loin)
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ContactPage {

	public static void main(String[] args) {
		// Déclaration des variables que nous allons utiliser dans ce script.
        String url = "http://www.testingtoolsguide.net";
        String expectedTitle1 = "Software Testing Tools Guide - Contact";
        String actualTitle1 = null;

        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        WebDriver driver = new FirefoxDriver();
        // Ouvrir la page "http://www.testingtoolsguide.net".
        driver.get(url);

        // On déplace la souris sur le lien "Pages"
        WebElement element = driver.findElement(By.xpath("//a[contains(text(),'Pages')]"));
        Actions action = new Actions(driver);
        action.moveToElement(element).perform();

        // On clique sur le lien "Contact"
        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.linkText("Contact")));
        driver.findElement(By.linkText("Contact")).click();
        
        // On récupère le titre de la page actuelle
        actualTitle1 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Contact page title : expected value is "+expectedTitle1+" actual value is "+actualTitle1);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle1.contentEquals(expectedTitle1)) {
            System.out.println("Test Failed");
        }        

        // On ferme Firefox
        driver.close();
    }
}

Création d’un nouvel espace

package ProBook;

//Nous devons importer les packages Selenium nécessaires pour notre script.
//La class WebDriver permet d'invoquer un nouveau navigateur.
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
//La class FirefoxDriver permet d'invoquer le driver du navigateur Firefox
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.util.concurrent.TimeUnit;

//Dans ce script, on utilisera également la méthode By (voir plus loin)
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;

public class CreateNewSpace {

	public static void main(String[] args) throws InterruptedException {
		// Déclaration des variables que nous allons utiliser dans ce script.
        String url = "http://probook.progideo.com";
        String username = "progideo";
        String password = "progideo";
        String spaceName = "CROUIGNEAU";
        String expectedTitle1 = "(6) CROUIGNEAU - ProBook";
        String actualTitle1 = null;
        WebElement element;

        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        WebDriver driver = new FirefoxDriver();
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);

        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        WebDriverWait wait = new WebDriverWait(driver, 10);
        
        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On saisit le username et le password
        wait.until(ExpectedConditions.elementToBeClickable(By.id("login_username")));
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();

        Thread.sleep(2000);
        // On clique sur le menu "Mes espaces"
        driver.findElement(By.id("space-menu")).click();
        // On clique sur le bouton "Créer un espace"
        driver.findElement(By.linkText("Créer un espace")).click();
        // On saisie un nom
        wait.until(ExpectedConditions.elementToBeClickable(By.id("space-name")));
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        executor.executeScript("document.getElementById('space-name').value='"+spaceName+"'");
        // On définie des paramètres avancés
        element = driver.findElement(By.id("access-settings-link"));
        executor.executeScript("arguments[0].click();", element);
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='space-visibility']/div[1]/label[1]")));
        driver.findElement(By.xpath("//div[@id='space-visibility']/div[1]/label[1]")).click();
        driver.findElement(By.xpath("//div[@id='space-join_policy']/div[3]/label[1]")).click();
        // On passe à l'étape suivante
        driver.findElement(By.xpath("//button[text()='Suivant']")).click();
        // On sélectionn les modules que l'on veut activer
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='media-body']/a[1]")));
        driver.findElement(By.xpath("//div[@class='media-body']/a[contains(@data-action-url,'cfiles')]")).click();
        driver.findElement(By.xpath("//div[@class='media-body']/a[contains(@data-action-url,'custom')]")).click();
        driver.findElement(By.xpath("//div[@class='media-body']/a[contains(@data-action-url,'tasks')]")).click();
        // On passe à l'étape suivante
        driver.findElement(By.linkText("Suivant")).click();
        // On termine la création
        driver.findElement(By.linkText("Terminé")).click();
        
        // On vérifie le titre de la page suite à la création de l'espace
        actualTitle1 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login result : expected value is "+expectedTitle1+" actual value is "+actualTitle1);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle1.contentEquals(expectedTitle1)) {
            System.out.println("Test Failed");
        }

        // On ferme Firefox
        driver.close();
	}

}

Lister les membres de l’espace

package ProBook;

//Nous devons importer les packages Selenium nécessaires pour notre script.
//La class WebDriver permet d'invoquer un nouveau navigateur.
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
//La class FirefoxDriver permet d'invoquer le driver du navigateur Firefox
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.util.List;
import java.util.concurrent.TimeUnit;

//Dans ce script, on utilisera également la méthode By (voir plus loin)
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;

public class CheckMembers {

	public static void main(String[] args) throws InterruptedException {
		// Déclaration des variables que nous allons utiliser dans ce script.
        String url = "http://probook.progideo.com";
        String username = "progideo";
        String password = "progideo";
        String spaceName = "CROUIGNEAU";
        WebElement element;

        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        WebDriver driver = new FirefoxDriver();
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);

        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        WebDriverWait wait = new WebDriverWait(driver, 10);
        
        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On saisit le username et le password
        wait.until(ExpectedConditions.elementToBeClickable(By.id("login_username")));
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();
        
        Thread.sleep(2000);
        // On clique sur le menu "Mes espaces"
        driver.findElement(By.id("space-menu")).click();
        // On ouvre notre espace
        wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//strong[@class='space-name'][contains(text(),'"+spaceName+"')]")));
        driver.findElement(By.xpath("//strong[@class='space-name'][contains(text(),'"+spaceName+"')]")).click();
        // On ouvre le menu de configuration
        JavascriptExecutor executor = (JavascriptExecutor) driver;
        element = driver.findElement(By.xpath("//div[@class='btn-group dropdown-navigation']//button[@type='button']"));
        executor.executeScript("arguments[0].click();", element);
        // On sélectionne l'option Membres
        element = driver.findElement(By.xpath("//a/span[contains(text(),'Membres')]"));
        executor.executeScript("arguments[0].click();", element);
        // On liste les membres de l'espace
        List<WebElement> rows = driver.findElements(By.cssSelector("[class='table table-hover'] tr"));
        for (int i = 1; i <= rows.size()-2; i++){
           	System.out.println("Ligne "+i+" : "+driver.findElement(By.xpath("//table[@class='table table-hover']/tbody/tr["+i+"]/td[2]")).getText());
        }

        // On ferme Firefox
        driver.close();
	}

}

Utilisation de Java Robot pour uploader un fichier

package ProBook;

//Nous devons importer les packages Selenium nécessaires pour notre script.
//La class WebDriver permet d'invoquer un nouveau navigateur.
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;

//Nous devons également importer les class Java Robot
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import java.awt.event.KeyEvent;

public class UploadFile {
	enum Action {
	    WIN, MAC, LINUX, SEND_KEYS;
	}

	public static void setClipboardData(String string) {
		   StringSelection stringSelection = new StringSelection(string);
		   Toolkit.getDefaultToolkit().getSystemClipboard().setContents(stringSelection, null);
	}
	
	public static boolean FileUpload(WebDriver driver, String locator, String filePath, Action type) {
	    WebDriverWait explicitWait = new WebDriverWait(driver, 10);
	    WebElement element = explicitWait.until(ExpectedConditions.elementToBeClickable(By.xpath(locator)));

	    if (type == Action.SEND_KEYS) {
	        element.sendKeys(filePath);
	        return true;
	    } else {
	        try {
	            // Clique sur l'élément ouvrant la fenêtre d'upload
	            JavascriptExecutor executor = (JavascriptExecutor) driver;
	            element = driver.findElement(By.xpath(locator));
	            Actions ob = new Actions(driver);
	            ob.moveToElement(element).click().build().perform();
	            executor.executeScript("arguments[0].click();", element);

	            Thread.sleep(5000);

	            // Copier le chemin du fichier dans le presse-papiers
	            setClipboardData(filePath);

	            // Intéragir avec la fenêtre grâce au framework Robot
	            Robot robot = new Robot();
	            if (type == Action.MAC) {

	                // “Go To Folder” sur Mac - Touches Command+Shift+G dans la fenêtre Finder.
	                robot.keyPress(KeyEvent.VK_META);
	                robot.keyPress(KeyEvent.VK_SHIFT);
	                robot.keyPress(KeyEvent.VK_G);
	                robot.keyRelease(KeyEvent.VK_G);
	                robot.keyRelease(KeyEvent.VK_SHIFT);
	                robot.keyRelease(KeyEvent.VK_META);

	                // Coller le contenu du presse-papiers - Command ⌘ + V.
	                robot.keyPress(KeyEvent.VK_META);
	                robot.keyPress(KeyEvent.VK_V);
	                robot.keyRelease(KeyEvent.VK_V);
	                robot.keyRelease(KeyEvent.VK_META);
	            } else if (type == Action.WIN || type == Action.LINUX) {
	                // Coller le contenu du presse-papiers - Ctrl + V.
	                robot.keyPress(KeyEvent.VK_CONTROL);
	                robot.keyPress(KeyEvent.VK_V);
	                robot.keyRelease(KeyEvent.VK_V);
	                robot.keyRelease(KeyEvent.VK_CONTROL);
	            }

	            robot.delay(4000);

	            // Valider le chargement - Enter.
	            robot.keyPress(KeyEvent.VK_ENTER);
	            robot.keyRelease(KeyEvent.VK_ENTER);
	            return true;
	        } catch (AWTException e) {
	            e.printStackTrace();
	        } catch (InterruptedException e) {
	            e.printStackTrace();
	        }
	    }
	    return false;
	}
	
}

2.6 Travailler avec des bases de données

Exemple de script

package ProBook;

import  java.sql.Connection;		
import  java.sql.Statement;		
import  java.sql.ResultSet;		
import  java.sql.DriverManager;		
import  java.sql.SQLException;		

public class DatabaseAccess {
	public static void  main(String[] args) throws  ClassNotFoundException, SQLException {													
			// URL de la base de donnée au format : "jdbc:mysql://ipaddress:portnumber/db_name"
            String dbUrl = "jdbc:mysql://localhost:3306/tutorialDB";					
			// Database Username
			String username = "DBuser";	
 			// Database Password
			String password = "DBpassword";				
			// Requête SQL à exécuter
			String query = "SELECT * FROM users;";	
            
     	    // Chargement du driver
       	    Class.forName("com.mysql.jdbc.Driver");			
       		// Connexion à la base de données
        	Connection con = DriverManager.getConnection(dbUrl, username, password);
      
      		// Création de la requête
        	Statement stmt = con.createStatement();					
   			// Exécution de la requête		
     		ResultSet result = stmt.executeQuery(query);							
     
     		// Affichage des données récupérées grâce à la requête
			while (result.next()){
		        		String name = result.getString(1);								        
                        String age = result.getString(2);					                               
                        System. out.println(name+"  "+age+" ans");		
                }	
			
  			// Fermeture de la connexion à la base de données
  			con.close();			
	}
}

2.7 Ajax et Javascript

	public static boolean waitForJSandJQueryToLoad(WebDriver driver) {

	    WebDriverWait wait = new WebDriverWait(driver, 30);

	    // wait for jQuery to load
	    ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
	      @Override
	      public Boolean apply(WebDriver driver) {
	        try {
	          return ((Long)((JavascriptExecutor)driver).executeScript("return jQuery.active") == 0);
	        }
	        catch (Exception e) {
	          // no jQuery present
	          return true;
	        }
	      }
	    };

	    // wait for Javascript to load
	    ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
	      @Override
	      public Boolean apply(WebDriver driver) {
	        return ((JavascriptExecutor)driver).executeScript("return document.readyState")
	        .toString().equals("complete");
	      }
	    };

	  return wait.until(jQueryLoad) && wait.until(jsLoad);
	}

3.2 Mon premier script TestNG

package TestNG;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterMethod;

public class Login {
	// Déclaration des variables que nous allons utiliser dans ce script.
    String url = "http://probook.progideo.com";
    String expectedTitle1 = "Fil d'actualités - ProBook";
    String actualTitle1 = null;
    String username = "progideo";
    String password = "progideo";
    String expectedTitle2 = "(6) Fil d'actualités - ProBook";
    String actualTitle2 = null;
    WebDriver driver;

	@Test
	public void test() {
        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On récupère le titre de la page actuelle
        actualTitle1 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login page title : expected value is "+expectedTitle1+" actual value is "+actualTitle1);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle1.contentEquals(expectedTitle1)) {
            System.out.println("Test Failed");
        }

        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("login_username")));

        // On saisit le username et le password
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();
        
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-dropdown-link")));
        
        // On vérifie le titre de la page suite à la tentative de connexion
        actualTitle2 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login result : expected value is "+expectedTitle2+" actual value is "+actualTitle2);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle2.contentEquals(expectedTitle2)) {
            System.out.println("Test Failed");
        }
	}
	
	@BeforeMethod
	public void beforeMethod() {
        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        driver = new FirefoxDriver();
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);
	}
	
	@AfterMethod
	public void afterMethod() {
        // On ferme Firefox
        driver.close();
	}

}

3.2 Suite de tests

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Ma première suite de test">
	<test name="Mon premier test">
    		<classes>
      			<class name="TestNG.Login"/>
    		</classes>
  	</test>
</suite>

3.4 Annotations

package TestNG;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.openqa.selenium.By;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.AfterMethod;

public class LoginDataProvider {
	// Déclaration des variables que nous allons utiliser dans ce script.
    String url = "http://probook.progideo.com";
    String expectedTitle1 = "Fil d'actualités - ProBook";
    String actualTitle1 = null;
    String actualTitle2 = null;
    WebDriver driver;
    
    @DataProvider (name="Data")
    public static Object[][] data() {
    	return new Object[][] {
    		{"jbcrouigneau", "**********", "(3) Fil d'actualités - ProBook"},
    		{"baduser", "**********", "Fil d'actualités - ProBook"},
    		{"jbcrouigneau", "badpassword", "Fil d'actualités - ProBook"},
    	};
    }
    
	@Test (dataProvider = "Data")
	public void test(String username, String password, String expectedTitle2) throws InterruptedException {
        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On récupère le titre de la page actuelle
        actualTitle1 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login page title : expected value is "+expectedTitle1+" actual value is "+actualTitle1);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle1.contentEquals(expectedTitle1)) {
            System.out.println("Test Failed");
        }

        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("login_username")));

        // On saisit le username et le password
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();
        
        try {
            wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-dropdown-link")));
        } catch(TimeoutException ex) {
        }
        
        // On vérifie le titre de la page suite à la tentative de connexion
        actualTitle2 = driver.getTitle();
        // On affiche dans le log un message d'information
        System.out.println("Login result : expected value is "+expectedTitle2+" actual value is "+actualTitle2);
        // Si le test échoue, on affiche un message d'erreur 
        if (!actualTitle2.contentEquals(expectedTitle2)) {
            System.out.println("Test Failed");
        }
	}
	
	@BeforeMethod
	public void beforeMethod() {
        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        driver = new FirefoxDriver();
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);
	}
	
	@AfterMethod
	public void afterMethod() {
        // On ferme Firefox
        driver.close();
	}

}

3.5 Listeners

package TestNG;

import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener;
import org.testng.ISuite;
import org.testng.ISuiteListener;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.Reporter;

public class Listener implements ITestListener, ISuiteListener, IInvokedMethodListener {

	@Override
	public void onStart(ISuite arg0) {
		Reporter.log("About to begin executing Suite " + arg0.getName(), true);
	}

	@Override
	public void onFinish(ISuite arg0) {
		Reporter.log("About to end executing Suite " + arg0.getName(), true);
	}

	public void onStart(ITestContext arg0) {
		Reporter.log("About to begin executing Test " + arg0.getName(), true);
	}

	public void onFinish(ITestContext arg0) {
		Reporter.log("Completed executing test " + arg0.getName(), true);
	}

	public void onTestSuccess(ITestResult arg0) {
		printTestResults(arg0);
	}

	public void onTestFailure(ITestResult arg0) {
		printTestResults(arg0);
	}

	public void onTestStart(ITestResult arg0) {
		System.out.println("The execution of the main test starts now");
	}

	public void onTestSkipped(ITestResult arg0) {
		printTestResults(arg0);
	}

	public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) {

	}

	private void printTestResults(ITestResult result) {
		Reporter.log("Test Method resides in " + result.getTestClass().getName(), true);
		if (result.getParameters().length != 0) {
			String params = null;
			for (Object parameter : result.getParameters()) {
				params += parameter.toString() + ",";
			}
			Reporter.log("Test Method had the following parameters : " + params, true);
		}

		String status = null;
		switch (result.getStatus()) {
		case ITestResult.SUCCESS:
			status = "Pass";
			break;
		case ITestResult.FAILURE:
			status = "Failed";
			break;
		case ITestResult.SKIP:
			status = "Skipped";
		}

		Reporter.log("Test Status: " + status, true);
	}

	public void beforeInvocation(IInvokedMethod arg0, ITestResult arg1) {
		String textMsg = "About to begin executing following method : " + returnMethodName(arg0.getTestMethod());
		Reporter.log(textMsg, true);
	}

	public void afterInvocation(IInvokedMethod arg0, ITestResult arg1) {
		String textMsg = "Completed executing following method : " + returnMethodName(arg0.getTestMethod());
		Reporter.log(textMsg, true);
	}

	private String returnMethodName(ITestNGMethod method) {
		return method.getRealClass().getSimpleName() + "." + method.getMethodName();
	}

}

3.6 Rapports

Rapports TestNG

package TestNG;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.openqa.selenium.By;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;

@Listeners (TestNG.Listener.class)
public class LoginDataProvider {
	// Déclaration des variables que nous allons utiliser dans ce script.
    String url = "http://probook.progideo.com";
    String expectedTitle1 = "Fil d'actualités - ProBook";
    String actualTitle1 = null;
    String actualTitle2 = null;
    WebDriver driver;
    
    @DataProvider (name="Data")
    public static Object[][] data() {
    	return new Object[][] {
    		{"jbcrouigneau", "**********", "(3) Fil d'actualités - ProBook"},
    		{"baduser", "**********", "Fil d'actualités - ProBook"},
    		{"jbcrouigneau", "badpassword", "Fil d'actualités - ProBook"},
    	};
    }
    
	@Test (dataProvider = "Data")
	public void test(String username, String password, String expectedTitle2) throws InterruptedException {
        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On récupère le titre de la page actuelle
        actualTitle1 = driver.getTitle();
        // On vértifie le titre de la page
        Assert.assertEquals(actualTitle1, expectedTitle1);

        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("login_username")));

        // On saisit le username et le password
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();
        
        try {
            wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-dropdown-link")));
        } catch(TimeoutException ex) {
        }
        
        // On vérifie le titre de la page suite à la tentative de connexion
        actualTitle2 = driver.getTitle();
        // On vértifie le titre de la page
        Assert.assertEquals(actualTitle2, expectedTitle2);
	}
	
	@BeforeMethod
	public void beforeMethod() {
        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        driver = new FirefoxDriver();
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);
	}
	
	@AfterMethod
	public void afterMethod() {
        // On ferme Firefox
        driver.close();
	}

}

Class ExtentReportClass

package TestNG;

import org.testng.Assert;
import org.testng.ITestResult;
import org.testng.SkipException;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
 
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.Status;
import com.aventstack.extentreports.markuputils.ExtentColor;
import com.aventstack.extentreports.markuputils.MarkupHelper;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
import com.aventstack.extentreports.reporter.configuration.Theme;

public class ExtentReportsClass {
	 ExtentHtmlReporter htmlReporter;
	 ExtentReports extent;
	 ExtentTest logger;

	 @BeforeTest
	 public void startReport() {
		 htmlReporter = new ExtentHtmlReporter(System.getProperty("user.dir") +"/test-output/ExtentReport.html");
		 extent = new ExtentReports ();
		 extent.attachReporter(htmlReporter);
		 extent.setSystemInfo("Host Name", "Progideo");
		 extent.setSystemInfo("Environment", "Formation Selenium");
		 extent.setSystemInfo("User Name", "Jean-Baptiste CROUIGNEAU");
	 
		 htmlReporter.config().setDocumentTitle("Titre du rapport");
		 htmlReporter.config().setReportName("Nom du rapport");
		 htmlReporter.config().setTheme(Theme.STANDARD);
	 }
	 
	 @Test
	 public void passTest() {
		 logger = extent.createTest("passTest");
		 Assert.assertTrue(true);
		 logger.log(Status.PASS, MarkupHelper.createLabel("Test Case passTest status is passed", ExtentColor.GREEN));
	 }
	 
	 @Test
	 public void failTest() {
		 logger = extent.createTest("failTest");
		 Assert.assertTrue(false);
		 logger.log(Status.FAIL, "Test Case failTest status is failed");
		 logger.log(Status.FAIL, MarkupHelper.createLabel("Test Case failTest status is failed", ExtentColor.RED));
	 }
	 
	 @Test
	 public void skipTest() {
		 logger = extent.createTest("skipTest");
		 throw new SkipException("Skipping - This is not ready for testing ");
	 }
	 
	 @AfterMethod
	 public void getResult(ITestResult result) {
		 if(result.getStatus() == ITestResult.FAILURE) {
			 logger.log(Status.FAIL, MarkupHelper.createLabel(result.getName() + " - Test Case Failed", ExtentColor.RED));
			 logger.log(Status.FAIL, MarkupHelper.createLabel(result.getThrowable() + " - Test Case Failed", ExtentColor.RED));
		 } else if(result.getStatus() == ITestResult.SKIP) {
			 logger.log(Status.SKIP, MarkupHelper.createLabel(result.getName() + " - Test Case Skipped", ExtentColor.ORANGE)); 
		 }
	 }

	 @AfterTest
	 public void endReport() {
		 extent.flush();
	 }
}

Fichier extent-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<extentreports>
    <configuration>
        <!-- report theme -->
        <!-- standard, dark -->
        <theme>standard</theme>
    
        <!-- document encoding -->
        <!-- defaults to UTF-8 -->
        <encoding>UTF-8</encoding>
        
        <!-- protocol for script and stylesheets -->
        <!-- defaults to https -->
        <protocol>https</protocol>
        
        <!-- title of the document -->
        <documentTitle>Rapport de test</documentTitle>
        
        <!-- report name - displayed at top-nav -->
        <reportName>Démonstration Extent Reports</reportName>
        
        <!-- location of charts in the test view -->
        <!-- top, bottom -->
        <testViewChartLocation>bottom</testViewChartLocation>
		
        <!-- custom javascript -->
        <scripts>
            <![CDATA[
                $(document).ready(function() {
                    
                });
            ]]>
        </scripts>
        
        <!-- custom styles -->
        <styles>
            <![CDATA[
                
            ]]>
        </styles>
    </configuration>
</extentreports>

3.7 Exécution en parallèle

Script de test

package TestNG;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Parameters;
import org.openqa.selenium.By;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;

@Listeners (TestNG.Listener.class)
public class LoginDataProvider {
	// Déclaration des variables que nous allons utiliser dans ce script.
    String url = "http://probook.progideo.com";
    String expectedTitle1 = "Fil d'actualités - ProBook";
    String actualTitle1 = null;
    String actualTitle2 = null;
    WebDriver driver;
    
    @DataProvider (name="Data")
    public static Object[][] data() {
    	return new Object[][] {
    		{"jbcrouigneau", "**********", "(3) Fil d'actualités - ProBook"},
    		{"baduser", "**********", "Fil d'actualités - ProBook"},
    		{"jbcrouigneau", "badpassword", "Fil d'actualités - ProBook"},
    	};
    }
    
	@Test (dataProvider = "Data")
	public void test(String username, String password, String expectedTitle2) throws InterruptedException {
        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On récupère le titre de la page actuelle
        actualTitle1 = driver.getTitle();
        // On vértifie le titre de la page
        Assert.assertEquals(actualTitle1, expectedTitle1);
        
        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("login_username")));

        // On saisit le username et le password
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();
        
        try {
            wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-dropdown-link")));
        } catch(TimeoutException ex) {
        }
        
        // On vérifie le titre de la page suite à la tentative de connexion
        actualTitle2 = driver.getTitle();
        // On vértifie le titre de la page
        Assert.assertEquals(actualTitle2, expectedTitle2);
	}
	
	@Parameters ("browser")
	@BeforeMethod
	public void beforeMethod(String browser) {
		if (browser.equalsIgnoreCase("firefox")) {
	        // Chemin vers le driver Gecko (pour Firefox uniquement)
	        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
	        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
	        driver = new FirefoxDriver();
	} else if (browser.equalsIgnoreCase("chrome")) {
			// Chemin vers le driver Chrome
	        System.setProperty("webdriver.chrome.driver","/home/progideo/eclipse/drivers/chromedriver/chromedriver");
	        // Invocation du navigateur Chrome, qui sera identifié avec le nom "driver".
	        driver = new ChromeDriver();
		}
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);
	}
	
	@AfterMethod
	public void afterMethod() {
        // On ferme Firefox
        driver.close();
	}

}

Exécution en séquence

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Ma première suite de test" parallel="none">
	<test name="Test avec Firefox">
		<parameter name="browser" value="firefox" />
    	<classes>
      		<class name="TestNG.LoginDataProvider"/>
    	</classes>
  	</test>
	<test name="Test avec Chrome">
		<parameter name="browser" value="chrome" />
    	<classes>
      		<class name="TestNG.LoginDataProvider"/>
    	</classes>
  	</test>
</suite>

Exécution en parallèle

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Ma première suite de test" parallel="tests">
	<test name="Test avec Firefox">
		<parameter name="browser" value="firefox" />
    	<classes>
      		<class name="TestNG.LoginDataProvider"/>
    	</classes>
  	</test>
	<test name="Test avec Chrome">
		<parameter name="browser" value="chrome" />
    	<classes>
      		<class name="TestNG.LoginDataProvider"/>
    	</classes>
  	</test>
</suite>

4.2 Projet Maven

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>mavenPackage</groupId>
	<artifactId>MavenProject</artifactId>
	<version>0.0.1-SNAPSHOT</version>
  
	<dependencies>
	  	<!-- Selenium -->
	  	<dependency>
	     	<groupId>org.seleniumhq.selenium</groupId>
	     	<artifactId>selenium-java</artifactId>
	     	<version>3.12.0</version>
	  	</dependency>
		
	 	<!-- TestNG -->
	  	<dependency>
	     	<groupId>org.testng</groupId>
	     	<artifactId>testng</artifactId>
	     	<version>6.14.2</version>
	     	<scope>test</scope>
	  	</dependency>	
	</dependencies>

</project>

Script

package ProBook;

import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.Assert;
import org.testng.ITestResult;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.io.FileHandler;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class LoginTest {
	// Déclaration des variables que nous allons utiliser dans ce script.
    String url = "http://probook.progideo.com";
    String expectedTitle1 = "Fil d'actualités - ProBook";
    String actualTitle1 = null;
    String username = "jbcrouigneau";
    String password = "********";
    String expectedTitle2 = "(3) Fil d'actualités - ProBook";
    String actualTitle2 = null;
    WebDriver driver;

	@Test
	public void f() {
        // On clique sur le lien "Se connecter / s'inscrire".
        driver.findElement(By.linkText("Se connecter / s'inscrire")).click();
        // On récupère le titre de la page actuelle
        actualTitle1 = driver.getTitle();
        // On affiche dans le log un message d'information
        Assert.assertEquals(actualTitle1, expectedTitle1);

        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("login_username")));

        // On saisit le username et le password
        driver.findElement(By.id("login_username")).sendKeys(username);
        driver.findElement(By.id("login_password")).sendKeys(password);
        // On clique sur le bouton "Sign in"
        driver.findElement(By.id("loginBtn")).click();
        
        WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("account-dropdown-link")));
        
        // On vérifie le titre de la page suite à la tentative de connexion
        actualTitle2 = driver.getTitle();
        // On affiche dans le log un message d'information
        Assert.assertEquals(actualTitle2, expectedTitle2);
	}
	
	@BeforeMethod
	public void beforeMethod() {
        // Chemin vers le driver Gecko (pour Firefox uniquement)
        System.setProperty("webdriver.gecko.driver","/home/progideo/eclipse/drivers/geckodriver/geckodriver");
        // Invocation du navigateur Firefox, qui sera identifié avec le nom "driver".
        driver = new FirefoxDriver();
        // Ouvrir la page "http://probook.progideo.com".
        driver.get(url);
	}
	
	@AfterMethod
	public void afterMethod(ITestResult result) throws IOException {
		int status = result.getStatus();
		// Si le test est un échec, on prend une capture d'écra
		if (status == ITestResult.FAILURE) {
			File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
			Date date = new Date();
		    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
			FileHandler.copy(scrFile, new File("./screenshots/" + result.getName() + "_" + dateFormat.format(date) + ".png" ));
		}
        // On ferme Firefox
        driver.close();
	}

}

testng.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Suite de test Maven" parallel="false">
	<test name="Login">
    	<classes>
      		<class name="ProBook.LoginTest"/>
    	</classes>
  	</test>
</suite>