Selenium WebDriver: TestNG pour la gestion des cas de test et la génération de rapports



Ce didacticiel Selenium WebDriver vous aidera à comprendre la nécessité d'utiliser TestNG avec Selenium pour gérer les cas de test et générer des rapports de test détaillés.

Dans le blog précédent, je vous ai appris comment exécuter votre premier test Selenium WebDriver. Dans ce blog, je couvrirai les concepts avancés de Selenium WebDriver. J'ai déjà mentionné à plusieurs reprises que Selenium WebDriver avait des limitations en ce qui concerne la gestion des cas de test et la génération de rapports de test. Alors, quelle est l'alternative? Un outil aussi populaire que Selenium doit certainement avoir une solution de contournement, non? Bien sûr que oui! Nous pouvons utiliser une combinaison de Selenium et TestNG pour surmonter cette limitation et ce sera le sujet de la discussion de ce blog.

transférer des fichiers vers l'instance Windows ec2

Si vous êtes nouveau sur Selenium et souhaitez une introduction aux concepts de base, vous pouvez commencer votre voyage à partir d'ici: ? Cependant, les autres peuvent démarrer avec TestNG for Selenium à partir de ce blog.Sachez également que les organisations recherchent activement des professionnels avec , ce qui en fait une compétence importante à maîtriser pour les testeurs de logiciels.





Les développeurs de logiciels du monde entier conviendront à l'unanimité que l'écriture de code dans des cas de test économise une bonne partie de leur temps de débogage. Pourquoi? En effet, les scénarios de test aident à créer un code robuste et sans erreur. Comment fait-il cela? En décomposant tout le code en cas de test plus petits, puis en évaluant chacun de ces cas de test en conditions de réussite / échec, nous pouvons créer du code sans erreur. Puisque Selenium ne prend pas en charge l'exécution de code dans les cas de test, nous devons utiliser TestNG pour la même chose. C'est là que TestNG s'inscrit dans le cadre Selenium.

TestNG signifie Testez la nouvelle génération et c'est un framework d'automatisation de test open-source inspiré par JUnit et NUnit. Eh bien, pas seulement inspiré, mais une mise à niveau de ces deux frameworks. Vous pouvez donc demander quelle est la mise à niveau ici?La mise à niveau avec TestNG est qu'elle fournit des fonctionnalités supplémentaires telles que: les annotations de test, le regroupement, la hiérarchisation, le paramétrage et les techniques de séquençage dans le code, ce qui n'était pas possible auparavant.



Outre la gestion des cas de test, même des rapports détaillés de tests peuvent être obtenus en utilisant TestNG. Il y aura un résumé affichant le cas de test qui a échoué, ainsi que le groupe dont il faisait partie et la classe dans laquelle il appartient. Lorsque les bogues peuvent être localisés avec précision de cette manière, ils peuvent être corrigés immédiatement au soulagement des développeurs. L'image ci-dessous illustre le fonctionnement de TestNG.

testng - pilote web sélénium

Alors, comment TestNG fait-il le travail? Cette question sera répondue dansla section suivante de ce blog de tutoriel Selenium WebDriver, où je vais discuter de la façon de gérer divers cas de test à l'aide de TestNG.



Selenium WebDriver avec TestNG

Les cas de test peuvent être définis et gérés de l'une des manières suivantes:

  1. Annotations de test
  2. Priorisation
  3. Désactivation des cas de test
  4. Dépendance de la méthode
  5. Regroupement
  6. Assertions
  7. Génération de rapports

Laisse moi commencer à t'expliquerchacune de ces fonctionnalités.

Annotations de test

Tout d'abord, posons-nous cette question: pourquoi devons-nous utiliser des annotations? Quand pouvons-nous les utiliser? Les annotations dans Selenium sont utilisées pour contrôler la prochaine méthode à exécuter. Les annotations de test sont définies avant chaque méthode dans le code de test. Si une méthode n'est pas précédée d'annotations, cette méthode sera ignorée et ne sera pas exécutée dans le cadre du code de test. Pour les définir, les méthodes doivent être simplement annotées avec ‘ @Tester «. Regardez l'extrait de code ci-dessous par exemple.

package testng import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.testng.annotations.AfterClass import org.testng.annotations.AfterMethod import org.testng.annotations.BeforeClass import org.testng.annotations .BeforeMethod import org.testng.annotations.Test classe publique TestAnnotations {@Test public void myTestMethod () {System.out.println ('Inside method: - myTestMethod') WebDriver driver = new FirefoxDriver () driver.get ('http: //www.seleniumframework.com/Practiceform/ ') String title = driver.getTitle () System.out.println (title) driver.quit ()} @BeforeMethod public void beforeMethod () {System.out.println (' This morceau de code est exécuté avant la méthode: - myTestMethod ') System.setProperty (' webdriver.gecko.driver ',' C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe ')} @AfterMethod public void afterMethod () {System.out.println (' This piece du code est exécuté après la méthode: - myTestMethod ')} @BeforeClass public void beforeClass () {Syste m.out.println ('Ce morceau de code est exécuté avant que la classe ne soit exécutée')} @AfterClass public void afterClass () {System.out.println ('Ce morceau de code est exécuté après l'exécution de la classe')} }

Dans le code ci-dessus, vous auriez remarqué que je n’ai pas défini de méthode «principale». Cependant, j'ai défini 5 autres méthodes. Il s’agit de «myTestMethod», «beforeMethod», «afterMethod», «beforeClass» et «afterClass». Notez également l'ordre de définition des méthodes dans le code car elles ne seront pas exécutées dans ce même ordre.

La méthode «myTestMethod» est annotée avec @Tester , et c'est la méthode principale ou le morceau de code qui doit être exécuté. D'autres méthodes annotées seront exécutées avant et après l'exécution de cette méthode. Étant donné que «beforeMethod» est annoté avec @BeforeMethod , il sera exécuté avant l'exécution de «myTestMethod». De même, 'afterMethod' est annoté avec @AfterMethod , et donc il sera exécuté après ‘myTestMethod’.

Cependant, 'beforeClass' est annoté avec @Avant les cours , ce qui signifie qu'il sera exécuté avant même que la classe elle-même ne soit exécutée. Notre nom de classe ici est TestAnnotations , et donc avant que la classe ne commence à être exécutée, le morceau de code à l’intérieur de ‘beforeClass’ sera exécuté. De même, 'afterClass' est annoté avec @AfterMethod , et sera donc exécuté après la classe TestAnnotations est exécuté.

Si vous avez encore de la confusion concernant l'ordre d'exécution, l'extrait ci-dessous vous aidera certainement.

1. BeforeSuite 2. BeforeTest 3. BeforeClass 4. BeforeMethod 5. Test 6. AfterMethod 7. AfterClass 8. AfterTest 9. AfterSuite

La sortie du code ci-dessus sera:

Ce morceau de code est exécuté avant l'exécution de la classe Ce morceau de code est exécuté avant la méthode: - méthode myTestMethod Inside: - myTestMethod 1493192682118 geckodriver INFO Écoute sur 127.0.0.1:13676 1493192682713 mozprofile :: profile INFO Utilisation du chemin d'accès au profil C: UsersVardhanAppDataLocalTempile ust .wGkcwvwXkl2y 1493192682729 geckodriver :: marionette INFO Démarrage du navigateur C: Program Files (x86) Mozilla Firefoxirefox.exe 1493192682729 geckodriver :: marionette INFO Connexion à Marionette sur localhost: 59792 [GPU 6152] AVERTISSEMENT: erreur de pipe: 109: fichier c: / builds /moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/chromium/src/chrome/common/ipc_channel_win.cc, ligne 346 1493192688316 Marionette INFO Écoute sur le port 59792 26 avril 2017 13:14:49 org. openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialecte détecté: Erreur JavaScript W3C: http://t.dtscout.com/i/?l=http%3A%2F%2Fwww.seleniumframework.com%2FPracticeform%2F&j=, line 1: TypeError: document.getElementsByTagNa me (...) [0] est Selenium Framework non défini | Practiceform 1493192695134 Marionette INFO Les nouvelles connexions ne seront plus acceptées 26 avril 2017 13:14:57 org.openqa.selenium.os.UnixProcess destroy SEVERE: Impossible de tuer le processus avec PID 6724 Ce morceau de code est exécuté après la méthode: - myTestMethod Ce morceau de code est exécuté après l'exécution de la classe PASSED: myTestMethod =================================== ============ Test par défaut Les tests sont exécutés: 1, échecs: 0, sauts: 0 ======================== ======================== ============================ ==================== Suite par défaut Nombre total de tests exécutés: 1, échecs: 0, sauts: 0 =============== =================================

Comme vous pouvez le voir dans la sortie ci-dessus, le nombre de tests exécutés est de 1 et échoué est de 0. Cela signifie que le code a réussi. Même l'ordre d'exécution des méthodes sera dans l'ordrejementionné précédemment.

Lorsque vous exécutez ce code sur votre ordinateur, Selenium WebDriver instancie votre navigateur Firefox, navigue vers le formulaire d’exercice de Selenium Framework, ferme l’instance de navigateur et affiche la même sortie que celle indiquée ci-dessus dans votre IDE Eclipse.

Je n'ai utilisé que 5 annotations différentes dans mon code. Mais il existe de nombreuses autres annotations qui peuvent être utilisées pour contrôler la prochaine méthode à exécuter. La liste complète des annotations est expliquée dans letableau dessous de:

@BeforeSuite - La méthode annotée avec @BeforeSuite s'exécutera avant que tous les tests de la suite ne soient exécutés.

@AfterSuite - La méthode annotée avec @AfterSuite s'exécutera après l'exécution de tous les tests de la suite.

@BeforeTest - La méthode annotée avec @BeforeTest s'exécutera avant l'exécution de toute méthode de test appartenant à une classe.

@AfterTest - La méthode annotée avec @AfterTest s'exécutera après l'exécution de toutes les méthodes de test appartenant à une classe.

@BeforeGroup - La méthode annotée avec @BeforeGroup s'exécutera avant que chaque groupe ne soit exécuté.

@AfterGroup - La méthode annotée avec @AfterGroup s'exécutera après l'exécution de chaque groupe.

@Avant les cours - La méthode annotée avec @Avant les cours s'exécutera une fois avant que la première méthode de test de la classe actuelle ne soit appelée.

@Après les cours - La méthode annotée avec @Après les cours s'exécutera une fois après l'exécution de toutes les méthodes de test de la classe actuelle.

@BeforeMethod - La méthode annotée avec @BeforeMethod s'exécutera avant l'exécution de toute méthode de test à l'intérieur d'une classe.

@AfterMethod - La méthode annotée avec @AfterMethod s'exécutera après l'exécution de chaque méthode de test dans une classe.

@Tester - La méthode annotée avec @Tester est la principale méthode de test dans tout le programme. D'autres méthodes annotées seront exécutées autour de cette méthode.

La capture d'écran du rapport TestNG estprésent ci-dessous: -

Priorisation

Nous avons parlé de la manière dont les différentes méthodes qui peuvent être définies de manière à être exécutées autour du @Tester méthode. Mais que se passe-t-il si vous en avez plus d'un @Tester et vous souhaitez définir l'ordre d'exécution entre eux?

Dans ce cas, nous pouvonsPles redéfinir en attribuant un numéro aux cas de test annotés. Plus le nombre est petit, plus la priorité est élevée. La priorité peut être attribuée en tant que paramètres lors de la définition des cas de test. Mais, si aucune priorité n'est attribuée, les méthodes de test annotées seront exécutées selon l'ordre alphabétique des tests. Regardez les paramètres des annotations de test dans la partie ci-dessous decode.

@Test (Priority = 2) public static void FirstTest () {system.out.println ('Ceci est le cas de test numéro deux à cause de la priorité # 2')} @Test (Priority = 1) public static void SecondTest () { system.out.println ('Ceci est le scénario de test numéro un en raison de la priorité n ° 1')} @Test public static void FinalTest () {system.out.println ('Ceci est le scénario de test final car il n'y a pas de priorité' ' )}

Désactivation des cas de test

Laissez-moi vous montrer quelque chose de plus intéressant. Que faire si vous avez un code couvrant un million de lignes, composé de centaines de cas de test, et que vous ne souhaitez désactiver qu'une seule méthode de test? Vous n'avez pas besoin de supprimer une partie du code, à la place, nous pouvons simplement désactiver cette méthode de test.

que sont les beans en java

L'action de désactiver un cas de test se fait également via des paramètres. Nous pouvons définir le activée attribuer à «faux». Par défaut, tous les cas de test seront activés, nous n'avons donc pas besoin de les définir à chaque fois que nous écrivons un test. Regardez les paramètres des troisième et quatrième méthodes dans la partie ci-dessous decode.

@Test (Priority = 2, enabled = True) public static void FirstTest () {system.out.println ('Ceci est le scénario de test numéro deux à cause de la priorité # 2')} @Test (Priority = 1, enabled = True ) public static void SecondTest () {system.out.println ('Ceci est le cas de test numéro un en raison de la priorité n ° 1')} @Test (enabled = false) public static void SkippedTest () {system.out.println ( 'Ceci est le scénario de test ignoré car il a été désactivé')} @Test (enabled = True) public static void FinalTest () {system.out.println ('Ceci est le scénario de test final, qui est activé et n'a pas de priorité ')}

Dépendance de la méthode

Maintenant, dans le cas où vous avez une situation dans laquelle, vous voulez qu'un morceau de code soit exécuté uniquement s'il satisfait une condition ou seulement si une méthode particulière s'exécute avec succès, nous pouvons le faire en utilisant dependOnMethod (). Il s'agit essentiellement d'une condition de dépendance de méthode où une méthode sera exécutée en fonction d'une autre méthode. Si nous définissons en plus Toujours courir attribut à true, alors la méthode sera exécutée indépendamment de la condition d'échec / réussite de la méthode dépendante. Regardez le code dans l'extrait de code ci-dessous.

@Test public static void FirstTest () {system.out.println ('Ceci est le premier scénario de test à exécuter')} @Test (dependOnMethods = {'FirstTest'}) public static void SecondTest () {system.out. println ('Ceci est le deuxième cas de test à exécuter Ceci est une méthode dépendante')} @Test (dependOnMethods = {'SecondTest'}) public static void FinalTest () {system.out.println ('Ceci est le test final Cas Il sera exécuté de toute façon. ')}

Maintenant, cela nous amène à un autre aspect important du testannotations qui est Regroupement .

Regroupement

À présent, vous devez savoir qu'il y aura un certain nombre de méthodes dans le cadre de notre cas de test dans le code. Supposons qu'il existe 100 cas de test, mais que nous ne voulons exécuter que 20 cas de test lors de notre prochain test. Pensez-vous que nous pouvons le faire? Bien sûr que nous pouvons.

On peut utiliser groupes attribut à cet effet. Nous pouvons attribuer un nom de groupe à un certain nombre de cas de test et choisir plus tard d'exécuter le groupe au lieu du code entier. Regardez l'extrait de code ci-dessous pour comprendrecomment créer des groupes.

@Test (groups = {'MyGroup'}) public static void FirstTest () {system.out.println ('This is a part of the Group: MyGroup')} @Test (groups = {'MyGroup'}) public static void SecondTest () {system.out.println ('Ceci fait également partie du groupe: MyGroup')} @Test public static void ThirdTest () {system.out.println ('Mais, cela ne fait pas partie du Groupe: MyGroup ')}

Assertions TestNG

Cela nous amène maintenant au sujet suivant de TestNG qui est les assertions. Comme son nom l'indique, les assertions peuvent être utilisées dans les méthodes de test pour déterminer la condition réussite / échec d'un test. Selon la condition vrai / faux d'une instruction, les tests réussiront / échoueront.

Dans le code ci-dessous, j'ai inclus 3 méthodes de test, dans lesquelles les première et troisième méthodes ont une condition de réussite et la deuxième méthode aura une condition d'échec. Voyez le code par vous-même.

package testng import org.testng.annotations.Test import org.testng.annotations.BeforeMethod import org.openqa.selenium.WebDriver import org.openqa.selenium.firefox.FirefoxDriver import org.testng.Assert import org.testng.annotations.AfterMethod Assertions de classe publique {@BeforeMethod public void beforeMethod () {System.setProperty ('webdriver.gecko.driver', 'C: UsersVardhanworkspaceSeleniumProjectfilesgeckodriver.exe')} public booléen isEqual (int a, int b) {if (a == b ) {return true} else {return false}} @Test public void testEquality1 () {Assert.assertEquals (true, isEqual (10, 10)) System.out.println ('Ceci est une condition de réussite')} @Test public void testEquality2 () {Assert.assertEquals (true, isEqual (10, 11)) System.out.println ('Ceci est une condition d'échec')} @Test public void getTitle () {Pilote WebDriver = nouveau pilote FirefoxDriver (). get ('https://www.gmail.com') String title = driver.getTitle () Assert.assertEquals (title, 'Gmail') System.out.println ('Ceci est encore une condition de réussite')} }

Lorsque vous regardez le rapport généré après cette exécution, vous remarquerez que sur les trois tests, un a échoué et deux ont réussi. Un autre point important à noter est que lorsqu'une assertion échoue, les autres commandes / lignes de code de ce test seront ignorées. Ce n'est que lorsque l'assertion est réussie que la ligne de code suivante sera exécutée dans ce test. Consultez la sortie ci-dessous où system.out.println a exécuté uniquement pour les première et troisième méthodes.

1493277977348 geckodriver INFO sur écoute 127.0.0.1:47035 1493277977993 mozprofile :: profil INFO chemin de profil à l'aide C: UsersVardhanAppDataLocalTemp ust_mozprofile.Z7X9uFdKODvi 1493277977994 geckodriver :: INFO marionette Démarrage navigateur C: Program Files (x86) Mozilla Firefoxirefox.exe 1493277977998 geckodriver :: INFO marionette Connexion à Marionette sur localhost: 50758 [GPU 6920] AVERTISSEMENT: erreur de canal: 109: fichier c: / builds / moz2_slave / m-rel-w32-00000000000000000000 / build / src / ipc / chromium / src / chrome / common / ipc_channel_win. cc, ligne 346 1493277981742 Marionette INFO Écoute sur le port 50758 27 avril 2017 12:56:22 org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialecte détecté: W3C Ceci est à nouveau une condition de réussite C'est une condition de réussite PASSÉE: getTitle PASSED: testEquality1 FAILED: testEquality2 java.lang.AssertionError: attendu [false] mais trouvé [true] sur org.testng.Assert.fail (Assert.java:93) sur org.testng.Assert.failNotEquals (Assert.java: 512) sur org.testng.Assert.assertE qualsImpl (Assert.java:134) à org.testng.Assert.assertEquals (Assert.java:115) à org.testng.Assert.assertEquals (Assert.java:304) à org.testng.Assert.assertEquals (Assert.java : 314) sur testng.Assertions.testEquality2 (Assertions.java:38) sur sun.reflect.NativeMethodAccessorImpl.invoke0 (méthode native) sur sun.reflect.NativeMethodAccessorImpl.invoke (source inconnue) sur sun.reflect.DelegatingImethod. Source) sur java.lang.reflect.Method.invoke (Source inconnue) sur org.testng.internal.MethodInvocationHelper.invokeMethod (MethodInvocationHelper.java:108) sur org.testng.internal.Invoker.invokeMethod (Invoker.java:661) à org.testng.internal.Invoker.invokeTestMethod (Invoker.java:869) à org.testng.internal.Invoker.invokeTestMethods (Invoker.java:1193) à org.testng.internal.TestMethodWorker.invokeTestMethods12: TestMethodWorker.invokeTestMethods12 ) à org.testng.internal.TestMethodWorker.run (TestMethodWorker.java:109) à org.testng.TestRunner.privateRun (TestRunner.java:744) à org.testng.TestRu nner.run (TestRunner.java:602) à org.testng.SuiteRunner.runTest (SuiteRunner.java:380) à org.testng.SuiteRunner.runSequentially (SuiteRunner.java:375) à org.testng.SuiteRunner.privateRun (SuiteRunner.privateRunner) .java: 340) à org.testng.SuiteRunner.run (SuiteRunner.java:289) à org.testng.SuiteRunnerWorker.runSuite (SuiteRunnerWorker.java:52) à org.testng.SuiteRunnerWorker.run (SuiteRunnerWorker.java:86) à org.testng.TestNG.runSuitesSequentially (TestNG.java:1301) à org.testng.TestNG.runSuitesLocally (TestNG.java:1226) à org.testng.TestNG.runSuites (TestNG.java:1144) à org.testng. TestNG.run (TestNG.java:1115) à org.testng.remote.AbstractRemoteTestNG.run (AbstractRemoteTestNG.java:132) à org.testng.remote.RemoteTestNG.initAndRun (RemoteTestNG.java:230) à org.testng.remote .RemoteTestNG.main (RemoteTestNG.java:76) ====================================== ======== Test par défaut Tests exécutés: 3, échecs: 1, sauts: 0 ============================ =================== ================================ ================ Suite par défaut Nombre total de tests exécutés: 3, échecs: 1, sauts: 0 =================================== ============

C'est donc la fin des concepts liés à la gestion des cas de test. Il nous reste un autre sujet, celui de la génération de rapports. La génération de rapports est le dernier sujet de ce didacticiel Selenium WebDriver car les rapports ne peuvent être générés qu'aprèsles tests sont exécutés.

est de troisième cycle et maîtrise la même chose

Génération de rapports

La chose la plus importante à noter est que le rapport ne sera généré que via un fichier .xml. Cela signifie, que ce soit une méthode, une classe ou un groupe que vous souhaitez tester, ils doivent tous être spécifiés dans le fichier .xml.

Vous pouvez donc d'abord créer un nouveau dossier sous votre projet, créer un nouveau fichier dans ce dossier et donner un nom au fichier et l'enregistrer avec l'extension .xml. Vous pouvez créer le nouveau dossier et fichier en cliquant avec le bouton droit sur l'explorateur de packages. Une fois que vous avez créé le fichier, accédez à l'onglet source en bas de la fenêtre et entrez les configurations comme indiqué dans l'extrait ci-dessous.

 

La première ligne est la définition du type de document XML. Ceci est standard et obligatoire pour tous les rapports de test. Mais, les autres lignes sont assez explicites. J'ai utilisé les balises ouvertes pour la suite, le test, les classes et la classe. La balise Classes peut contenir une ou plusieurs classes. Ainsi, il peut être utilisé si nous voulons générer un rapport où nous testons plusieurs classes. Ceci est particulièrement pratique pour les développeurs qui souhaitent tester un long morceau de code.

Quoi qu'il en soit, pour revenir à notre rapport, vous pouvez nommer chaque suite, test ou classe après avoir ouvert ces balises et n'oubliez pas de fermer toutes les balises que vous ouvrez. J'ai donné le nom de ma suite comme TestNGs , nom du test comme Tester Annotations et le nom de la classe comme testng.TestAnnotations. Notez que le nom de la classe est au format ' packagename.classname » .

Lorsque vous exécutez ce fichier en tant que suite TestNG, l'exécution démarre et vous obtenez les rapports de test détaillés. Vous obtiendrez la sortie du test dans l'onglet de votre console et le résultat de la suite de tests dans l'onglet suivant. Le rapport que j'ai généré pour exécuter mon code estdansla capture d'écran ci-dessous. Vous remarquerez que cette fois, il y a un nom de suite, un nom de test, un nom de classe ainsi que le temps nécessaire pour exécuter chacun d'eux.

Si vous souhaitez afficher le rapport HTML (rapport d'index ou rapport disponible), vous pouvez accéder au test-sortie dossier dans le répertoire du projet dans votre espace de travail. En cliquant dessus, vous pouvez afficher les rapports même à un moment ultérieur. Voici leurs captures d'écran.

Rapport d'index : -

Rapport disponible : -

Cela nous amène donc à la fin de ce blog tutoriel Selenium WebDriver. Il est temps pour vous de configurer eclipse de votre côté, d'installer les différents packages Selenium, d'installer TestNG et de commencer à écrire vos cas de test.

Vous pouvez consulter la vidéo du didacticiel Selenium WebDriver ci-dessous pour assister à une démonstration des différents concepts expliqués dans ce blog.

Formation au sélénium | Framework TestNG pour Selenium | Edureka

Cette vidéo de formation Edureka Selenium vous fera découvrir les détails détaillés de Selenium WebDriver. Ce tutoriel vidéo sur Selenium est idéal pour les débutants et les professionnels qui souhaitent parfaire les bases des commandes WebDriver et apprendre comment TestNG peut être utilisé avec Selenium pour gérer divers cas de test.

Si vous souhaitez apprendre Selenium et bâtir une carrière dans le domaine des tests, consultez notre site interactif en ligne ici, cela vient avec un support 24 * 7 pour vous guider tout au long de votre période d'apprentissage.

Vous avez une question pour nous? Veuillez le mentionner dans la section commentaires et nous vous recontacterons.