Vous trouverez ci-dessous le code source des différents Travaux Pratiques de la formation Selenium 4 dispensée par Progideo.
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();
}
}
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;
}
}
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();
}
}
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);
}
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();
}
}
<!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>
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();
}
}
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();
}
}
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>
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>
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>