Dans ce nouveau billet, nous verrons quelques fonctionnalités de Selenium WebDrive. Nous allons également écrire le code permettant de tester notre application ASP.NET MVC.
Description des fonctionnalités de Selenium
Selenium offre l’API WebDriver pour permettre au développeur d’interagir avec le navigateur et tester son application Web.
L’interface IWebDriver définit les propriétés permettant d’obtenir les informations sur la page active, dont le titre ou encore l’URL*:
IwebDriver hérite de IsearchContext, qui dispose des méthodes FindElement() et FindElements(). Elles retournent des objets de type IwebElement, qui représentent les éléments que l’on peut trouver sur une page Web : zone de saisie, bouton, image, texte, etc.
Les méthodes FindElement() et FindElements() prennent en paramètre un critère de recherche qui va permettre d’identifier l’élément que vous recherchez. Le critère de recherche peut être l’Id d’un champ de saisie, le nom de la classe css qui est appliquée à un texte, le nom d’un champ de formulaire, etc.
Pour rechercher par exemple une zone de saisie à partir de son ID, nous pouvons procéder comme :
| Code c# : | Sélectionner tout |
IWebElement element = _driverChrome.FindElement(By.Id("Nom"));
| Code c# : | Sélectionner tout |
element.SendKeys("Pascal");
| Code c# : | Sélectionner tout |
element.Submit();
Passons maintenant à un exemple concret, qui permettra de tester les fonctionnalités de notre application Web.
Ajoutez un nouveau fichier TestEtudiant.cs à votre projet de test (clic droit sur le projet de test, puis sur Ajouter, ensuite sur Nouvel élément. Dans la fenêtre, sélectionner Test dans le menu à gauche, puis cliquer sur Basic Unit Test et saisir le nom du test).
Déclarez le driver et ajoutez la méthode d’initialisation de la classe*:
| Code c# : | Sélectionner tout |
1 2 3 4 5 6 | private static IWebDriver _driverChrome; [ClassInitialize] public static void Init(TestContext context) { _driverChrome = new ChromeDriver(); } |
| Code c# : | Sélectionner tout |
1 2 3 4 5 | [TestMethod] public void TestAjoutEtudiant() { } |
| Code c# : | Sélectionner tout |
_driverChrome.Navigate().GoToUrl("http://localhost:64446/");
| Code c# : | Sélectionner tout |
_driverChrome.FindElement(By.LinkText("Nouvel Etudiant")).Click();
| Code c# : | Sélectionner tout |
1 2 3 | _driverChrome.FindElement(By.Id("Nom")).SendKeys("Jean"); _driverChrome.FindElement(By.Id("Prenom")).SendKeys("Bernard"); _driverChrome.FindElement(By.Id("Email")).SendKeys("j.bernard@gmail.com"); |
| Code c# : | Sélectionner tout |
_driverChrome.FindElement(By.XPath("//input[@value='Homme']")).Click();
Cependant, un simple :
| Code c# : | Sélectionner tout |
_driverChrome.FindElement(By.Id("DateNais")).SendKeys("1995-05-03");
| Code c# : | Sélectionner tout |
1 2 | IJavaScriptExecutor js = _driverChrome as IJavaScriptExecutor; js.ExecuteScript("document.getElementById('DateNais').value='1992-03-02'"); |
| Code c# : | Sélectionner tout |
_driverChrome.FindElement(By.Id("Enregistrer")).Submit();
| Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [TestMethod] public void TestAjoutEtudiant() { _driverChrome.Navigate().GoToUrl("http://localhost:64446/"); _driverChrome.FindElement(By.LinkText("Nouvel Etudiant")).Click(); _driverChrome.FindElement(By.Id("Nom")).SendKeys("Jean"); _driverChrome.FindElement(By.Id("Prenom")).SendKeys("Bernard"); _driverChrome.FindElement(By.Id("Email")).SendKeys("j.bernard@gmail.com"); _driverChrome.FindElement(By.XPath("//input[@value='Homme']")).Click(); IJavaScriptExecutor js = _driverChrome as IJavaScriptExecutor; js.ExecuteScript("document.getElementById('DateNais').value='1992-03-02'"); _driverChrome.FindElement(By.Id("Enregistrer")).Submit(); } |
Votre test s’exécute correctement. Que les informations soient enregistrées ou pas, le test sera toujours marqué comme “réussi”. Pour remédier à cela, vous allez ajouter une assertion à votre méthode de test.
Lorsque les informations sont enregistrées correctement, nous constatons une redirection vers la liste des étudiants, avec le nouvel enregistrement. Notre assertion va vérifier si le nouvel enregistrement figure dans la liste. Si c’est le cas, le test réussi. Sinon, le test échoue.
Pour effectuer cela, nous allons écrire la méthode suivante pour vérifier que le nouvel enregistrement est présent sur la page :
| Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | public Boolean VerifElement(string valueToFind) { try { _driverChrome.FindElement(By.LinkText(valueToFind)); return true; } catch (NoSuchElementException ex) { return false; } } |
| Code c# : | Sélectionner tout |
Assert.IsTrue(VerifElement("j.bernard@gmail.com"));
| Code c# : | Sélectionner tout |
1 2 3 4 | public void CaptureEcran(string fileName) { Screenshot ss = ((ITakesScreenshot)_driverChrome).GetScreenshot(); ss.SaveAsFile(fileName+"_"+ DateTime.Now.ToString("yyyy-mm-dd-HHmmss")+".png", ImageFormat.Png); } |
| Code c# : | Sélectionner tout |
CaptureEcran("echec_ajoutetudiant");
Lors de vos tests, vous allez vous rendre compte que la fenêtre du navigateur Chrome lancé par le driver Selenium ne sera pas fermée à la fin des opérations. En effet, il nous manque une méthode qui devra s’exécuter à la fin des tests pour disposer le driver et fermer la fenêtre associée. Cette méthode doit être décorée de l’attribut [ClassCleanup]. Son code est le suivant :
| Code c# : | Sélectionner tout |
1 2 3 4 5 6 | [ClassCleanup] public static void Cleanup() { if (_driverChrome != null) _driverChrome.Quit(); } |
| Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | [TestClass] public class TestEtudiant { private static IWebDriver _driverChrome; [ClassInitialize] public static void Init(TestContext context) { _driverChrome = new ChromeDriver(); } [TestMethod] public void TestAjoutEtudiant() { _driverChrome.Navigate().GoToUrl("http://localhost:64446/"); _driverChrome.FindElement(By.LinkText("Nouvel Etudiant")).Click(); _driverChrome.FindElement(By.Id("Nom")).SendKeys("Jean"); _driverChrome.FindElement(By.Id("Prenom")).SendKeys("Bernard"); _driverChrome.FindElement(By.Id("Email")).SendKeys("j.bernard@gmail.com"); _driverChrome.FindElement(By.XPath("//input[@value='Homme']")).Click(); IJavaScriptExecutor js = _driverChrome as IJavaScriptExecutor; js.ExecuteScript("document.getElementById('DateNais').value='1992-03-02'"); _driverChrome.FindElement(By.Id("Enregistrer")).Submit(); Assert.IsTrue(VerifElement("j.bernard@gmail.com")); } public Boolean VerifElement(string valueToFind) { try { _driverChrome.FindElement(By.LinkText(valueToFind)); return true; } catch (NoSuchElementException e) { CaptureEcran("echec_ajoutetudiant"); return false; } } public void CaptureEcran(string fileName) { Screenshot ss = ((ITakesScreenshot)_driverChrome).GetScreenshot(); ss.SaveAsFile(fileName+"_"+ DateTime.Now.ToString("yyyy-mm-dd-HHmmss")+".png", ImageFormat.Png); } [ClassCleanup] public static void Cleanup() { if (_driverChrome != null) _driverChrome.Quit(); } } |
Vous avez lu gratuitement 1 435 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.