• Selenium 2: tester vos interfaces graphiques

    Pour automatiser vos tests UI, la suite Selenium offre de grande possibilité. Supportant mutile langage C#, php, python et bien évidement Java, la suite propose également un plugin firefox ( Selenium IDE)  pour enregistrer, à la façon des macros excels,  toutes les actions utilisateur ( clics, drag and drop, saisie etc…).  Ces actions seront ensuite exporter sous forme de TestCase qu’il suffira d’importer dans vos projets. Certaines actions ne sont malheureusement pas enregistrable par le plugin: gestion des pop up, authentification par basic form ( la fameuse fenêtre Authentification Required) par exemple.

     

    • Dependance Maven
    
    <?xml version="1.0" encoding="UTF-8"?>
    <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>fr.cadjee.testUI</groupId>
    	<artifactId>CadjeeSelenium</artifactId>
    	<version>1.0</version>
    
    	<build>
    	<plugins>
    		<plugin>
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-surefire-plugin</artifactId>
    			<configuration>
    				<testFailureIgnore>true</testFailureIgnore>
    			</configuration>
    		</plugin>
    	</plugins>
    </build>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.seleniumhq.selenium</groupId>
    			<artifactId>selenium-java</artifactId>
    			<version>2.46.0</version>
    		</dependency>
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>4.11</version>
    			<scope>test</scope>
    		</dependency>
    	</dependencies>
    </project>
    
    

     

    • Selenium IDE 

    Toutes les actions sont enregistrées puis exportable via le Menu File > Export Test Case As …> Java Junit 4 / Web Driver. Les autres options (WebDriver Backed…ect ) seront bientôt obsolètes. Ils sont la uniquement pour assurer la rétro comptabilité entre la version selenium 1 RC et selenium 2 WebDriver.

    seleniumIDE

     

    Les classes java sont  à importer dans votre projet sous forme de test ou main exécutable. La forme ‘testCase’ permet d’automatiser plus naturellement votre application avec Maven et Jenkins.

     

    • Forcer Selenium à utiliser un autre navigateur différent du navigateur par défaut 

    Les test UI peuvent s’exécuter sur différent navigateurs sachant que le navigateur par défaut de Selenium est FireFox. Pour cela il va chercher dans le Path de votre OS le chemin vers votre FireFox. Dans mon cas je veux plutôt utiliser un FireFoxPortable ( donc non présent dans le PATH):

    </pre>
    public class SeleniumForFirefoxCase {
    
    protected static WebDriver driver;
    protected static String baseUrl;
    protected boolean acceptNextAlert = true;
    protected static StringBuffer verificationErrors = new StringBuffer();
    private static final String URL_EXE_FIREOX = "C:\\Documents\\selenium\\FirefoxPortable\\FirefoxPortable.exe";
    
    ...
    
    @BeforeClass
    public static void init() {
    File pathToBinary = new File(URL_EXE_FIREOX);
    FirefoxBinary ffBinary = new FirefoxBinary(pathToBinary);
    FirefoxProfile firefoxProfile = new FirefoxProfile();
    driver = new FirefoxDriver(ffBinary, firefoxProfile);
    }
    
    }
    

    J’ai déclarer le driver en static afin d’avoir une seule instance du firefox pour mes tests. Cela évite d’ouvrir plusieurs fenêtres de fireFox. Je peux ainsi enchaîner mes tests sur la même fenêtre.
    Pour info il est possible d’exécuter les tests sur IE, Chrome, Safari…Ect et même en mode non graphique via le driver HtmlUnitDriver.

     

    • Form Based Authentication : Fenêtre d’authentification 

    Ces fenêtres vous demandent de vous authentifier pour accéder à une page donnée. Souvent l’oeuvre d’un JAAS ou Valve défini au sein de votre application:

    authen

     

    L’IDE ne sait pas enregistrer cette action. Il va falloir passer par programmation. L’astuce est simple: ajouter dans l’url le  mot de passe et le login :

    
    public class SeleniumForFirefoxCase {
    ...
    protected static String baseUrl;
    
    ...
    
    @BeforeClass
    public static void init()
    {
    ...
    baseUrl = "http://login:motDePasse@localhost:8080/monAppli/";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    driver.get(baseUrl);
    
    ...
    }
    
    • Gestion des pop up 

    Pour gérer la pop up il faut indiquer au driver de switcher de fenêtre car par défaut  c’est toujours la fenêtre principale qui est prise en compte:

    @Test
    public void Scenario1_OuverturePopUp() throws Exception {
    
    // ouverture de la pop up
    
    driver.findElement(By.xpath("//a[contains(@href, \"lienPopUp')\")]")).click();
    
    // On recupere l'id des fenetres actives
    Set<String> windowId = driver.getWindowHandles();
    
    Iterator<String> itererator = windowId.iterator();
    
    //1er fenetre
    String mainWinID = itererator.next();
    System.out.println(mainWinID);
    //2de fenetre le pop up
    String popUpID = itererator.next();
    System.out.println(popUpID);
    
    //On switch de fenetre
    driver.switchTo().window(popUpID);
    System.out.println(driver.getTitle());
    Assert.assertEquals("Refus demande", driver.getTitle());
    driver.findElement(By.name("commentaire")).clear();
    
    //envoie d'une valeur dans la zone de texte de la pop up
    driver.findElement(By.name("commentaireRefus")).sendKeys("test pop up selenium");
    
    • Conclusion

    L’intégration par Maven permet l’exécution des tests de la même façon q’un test unitaire classique. Mais ne nous y méprenons pas, Selenium n’a pas vocation à remplacer un TU et vis versa!

    Pour aller un peu plus loin, il est même conseillé d’utiliser une base mémoire tel que H2. On peux également utiliser un serveur Jetty plus léger et plus rapide. Enfin Une connaissance de Xpath est obligatoire pour mener à bien votre intégration de Selenium.

     

     

    Categories: Java, Selenium

    Étiquettes : , , ,

    Comments are currently closed.

    One thought on “Selenium 2: tester vos interfaces graphiques

    • http://www.paysages-tschirhart.fr dit :

      Avec cet article, je vais prйsenter Selenium, un outil qui nous permettra de tester l’interface utilisateur des applications Web, comment йcrire des tests simples а l’aide du pattern Page Object, et comment automatiser ces tests avec Maven.