handling iframes using selenium webdriver switchto method
algorithme apriori dans l'exploration de données avec exemple
Manipulation des iFrames à l'aide de Selenium WebDriver: didacticiel pratique avec des exemples pratiques
iFrame (cadre en ligne) est un document HTML incorporé dans un autre document HTML.
Les iFrames sont les plus couramment utilisés pour afficher des publicités dans une page Web. Les iFrames sont explicitement mentionnés sur le document HTML à l'aide de la balise HTML
Ce tutoriel vous expliquera tout sur la gestion des iframes dans Selenium ainsi que les exemples de code concernés pour une compréhension facile.
=> Lisez la série de formations Easy Selenium.
Ce que vous apprendrez:
- Manipulation des iFrames avec Selenium
- MISE À JOUR en mars 2020
- Conclusion
Manipulation des iFrames avec Selenium
Un iframe dans une page Web peut être identifié dans le navigateur Firefox si l'option nommée «Ce cadre» est affichée sur les options de clic droit comme indiqué ci-dessous.
Alternativement, nous pouvons également valider si une page Web a des iframes en regardant le code source et en recherchant le tag
List iframes = driver.findElements(By.tagName(“iframe”));
Méthodes fournies par Selenium pour la gestion des iFrames
Selenium fournit les méthodes intégrées suivantes pour basculer entre les iframes.
- switchTo.frame (int frameNumber)
- switchTo.frame (chaîne frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Cette méthode permet aux utilisateurs de passer à une trame particulière en utilisant l'ID de trame.
- Le numéro d'image est une valeur d'index de base zéro, ce qui signifie que la première image de la page Web a l'index 0, la deuxième image a l'index 1 et la troisième image a l'index 3 et ainsi de suite.
- Le numéro de trame peut également être identifié à l'aide de l'ID de trame de l'élément. Cela peut être fait par Faites un clic droit -> Inspectez l'élément et recherchez l'iFrame. Validez si l'une des iFrames a un attribut ID.
Un exemple d'élément iframe sur le code source ressemblerait à celui mentionné ci-dessous.
Une fois l'identifiant de l'iFrame identifié, nous pouvons l'utiliser pour basculer vers le cadre comme ci-dessous.
Exemples:
driver.switchTo.frame ('a077aa5e');
driver.switchTo.frame (0);
- Cette méthode lève NoSuchFrameException lorsque le cadre requis n'est pas trouvé sur la page Web actuelle.
# 2) switchTo.frame (chaîne frameName)
- Cette méthode permet aux utilisateurs de basculer vers un cadre particulier en utilisant le nom du cadre défini par le développeur.
- Le nom du cadre doit être placé entre guillemets pour être considéré comme un paramètre String.
- Cette méthode lève NoSuchFrameException lorsque le cadre requis n'est pas trouvé sur la page Web actuelle.
Exemple:
Dans le code mentionné ci-dessus, l'ID de trame et le nom de trame détiennent la même valeur. Le passage au cadre peut être effectué en utilisant le nom du cadre comme ci-dessous:
driver.switchTo.frame ('a077aa5e');
# 3) switchTo.frame (WebElement frameElement)
- Cette méthode permet aux utilisateurs de basculer vers un cadre en fonction de l'emplacement de l'élément Web.
- Cette méthode lève NoSuchFrameException lorsque le cadre requis n'est pas présent sur la page Web et StaleElementReferenceException si le cadre affiché sur la page Web n'est pas actif.
Exemple:
WebElement frameElement = driver.findElement (By.id ('a077aa5e'));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Le basculement entre les iframes et la page parent peut être réalisé en utilisant la méthode driver.switchTo (). DefaultContent ().
- Veuillez noter qu'il existe une méthode similaire dans Selenium pour basculer entre les cadres nommés méthode driver.switchTo (). ParentFrame ().
- La différence entre driver.switchTo (). DefaultContent () et driver.switchTo (). ParentFrame () est que la première méthode bascule le contrôle vers la page Web principale quel que soit le nombre de cadres dans la page Web, tandis que la deuxième méthode bascule le contrôle sur l'image parente de l'image actuelle.
Exemple:
Supposons qu'il y ait trois cadres nommés i1, i2 et i3 dans la page Web parent p1. Les images i1, i2 et i3 dépendent l'une de l'autre, ce qui signifie qu'une image sera le parent d'une autre.
En utilisant la méthode driver.switchTo (). DefaultContent () sur l'image i3, le contrôle du pilote Web se déplace vers la page parente, p1. Alors que la méthode driver.switchTo (). ParentFrame () sur l'image i3 ramène le contrôle à l'image i2 et ainsi de suite.
Exemple de code source:
Voici le scénario de test à automatiser en utilisant des iframes en sélénium:
- Ouvrez le site Web SoftwareTestingHelp.com.
- Trouvez tous les éléments HTML avec la balise iframe, comptez le nombre d'occurrences de l'iFrame et imprimez-le sur une console.
- Basculez vers un cadre valide sur la page Web à l'aide de l'identifiant du cadre et imprimez le code source du cadre.
- Fermez la fenêtre actuelle du navigateur.
package Demo; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class iFramesDemo { public static void main(String() args) throws InterruptedException { System.setProperty('webdriver.gecko.driver','D:\Data_Personal\Demo \geckodriver-v0.23.0-win64\geckodriver.exe'); WebDriver driver = new FirefoxDriver(); driver.get('https://www.softwaretestinghelp.com/'); //Finding all iframe tags on a web page List elements = driver.findElements(By.tagName('iframe')); int numberOfTags = elements.size(); System.out.println('No. of Iframes on this Web Page are: ' +numberOfTags); // Switch to the frame using the frame id System.out.println('Switching to the frame'); driver.switchTo().frame('aswift_0'); // Print the frame source code System.out.println('Frame Source' +driver.getPageSource()); // Switch back to main web page driver.switchTo().defaultContent(); driver.quit(); } }
Sortie de code:
Ouvrez le site Web: https://www.softwaretestinghelp.com
Basculez vers le cadre nommé aswift_0.
Imprimez le nombre d'iframes sur la page Web dans la fenêtre de la console eclipse.
Imprimez le code source du cadre sur la console Eclipse après le passage au cadre.
Explication du code:
- Nous initialisons un objet du pilote gecko à l'aide de la méthode System.setProperty pour pointer vers le chemin du fichier geckodriver.exe sur la machine locale.
- Nous instancions ensuite un objet du pilote FireFox via l'interface WebDriver.
- À l'aide de l'objet pilote Firefox, la page Web suivante: https://www.softwaretestinghelp.com s'ouvre.
- Dans l'étape suivante, nous identifions le nombre d'éléments iframe affichés sur la page Web, en les comptant et en affichant le nombre iframe sur la console eclipse.
- En utilisant l'identifiant du cadre, nous passons au cadre sur la page Web. Dans le cas ci-dessus, l’identifiant de la trame est «aswift_0».
- Une fois que nous avons réussi le passage au cadre, nous imprimons le code source du cadre sur la console éclipse.
- Nous retournons ensuite à la page Web parente à l'aide de l'instruction driver.switchTo (). DefaultContent () et fermons finalement l'instance du pilote Web à l'aide de la méthode driver.quit.
Différence entre Frame et iFrame dans Selenium
- Un cadre est utilisé pour diviser une page en plusieurs sections, avec un nouveau contenu sur chaque section.
- Un iFrame est utilisé pour intégrer le contenu des sites Web externes dans la page Web, afin d'éviter les problèmes de script intersite.
- Un iFrame est considéré comme moins sécurisé qu'un cadre, car iFrame permet aux développeurs d'intégrer du contenu à partir de sites Web tiers. Ainsi, un iframe oblige un développeur à faire confiance au contenu qu'il a intégré dans l'iframe.
- La plupart des applications Web développées aujourd'hui n'utilisent pas de cadres pour diviser la page, mais utilisent plutôt des iframes pour intégrer du contenu externe tel que des publicités dans la page Web.
Gestion des cadres dynamiques dans Selenium
- Dans certaines pages Web, les propriétés du cadre telles que l'identifiant et le nom du cadre peuvent changer de manière dynamique sur une page Web, mais la position du cadre reste la même. Dans un tel cas, nous ne pouvons pas nous fier à l’ID ou au nom de l’image pour identifier de manière unique une image.
- Nous pouvons utiliser le index de trame dans un tel cas, pour identifier de manière unique le cadre sur la base de la position du cadre.
- Dans certains cas, la valeur de l'ID du cadre change à chaque fois que la page est chargée, mais avec un texte statique qui ne change pas. Par exemple , considérez le code ci-dessous pour les iframes.
Dans l'exemple ci-dessus, le texte «frame_» reste constant tandis que la valeur numérique change à chaque chargement de page.
- Nous pouvons identifier le cadre ci-dessus uniquement en utilisant le ci-dessous XPath
// iframe (contient (@ id, ’frame’))
MISE À JOUR en mars 2020
Comment localiser les éléments à l'intérieur du cadre
Dans Selenium, pour accéder aux éléments présents à l'intérieur du cadre, nous devons d'abord basculer à l'intérieur du cadre, puis identifier les éléments comme nous le faisons normalement en utilisant différents localisateurs Selenium. Votre code Selenium ne peut pas localiser vos éléments, sans basculer dans IFrame.
La capture d'écran ci-dessous montre comment les cadres sont intégrés dans un code HTML:
Différentes façons de passer à une IFrame à l'aide de sélénium
# 1) Utilisation du nom ou de l'identifiant du cadre
Basculez vers IFrame en utilisant le nom de la trame ou l'identifiant de la trame, parfois le nom ou l'identifiant de la trame ou les deux seront présents dans un code.
Syntaxe:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Utilisation de l'index d'image
Localisez le cadre à l'aide de l'index de cadre si disponible.
Syntaxe:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Utilisation de l'élément Web
Localisez le cadre à l'aide des localisateurs Selenium .
Syntaxe:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Autres opérations utilisant Frame
# 1) Revenir au cadre parent ou ancêtre
Revenir de l'image 3 à l'image 2 à l'aide de la commande «switchTo.parentFrame» .
Syntaxe:
driver.switchTo().parentFrame();
# 2) Passer à n'importe quel autre cadre
Si vous souhaitez passer de l'image 3 à l'image 1 ou à l'image par défaut, utilisez la commande «switchTo.defaultContent».
Syntaxe:
driver.switchTo().defaultContent();
Dans le code ci-dessous, nous localisons une zone de texte de nom présente à l'intérieur d'un cadre.
Et si nous essayons de le localiser directement sans basculer dans le cadre?
Voyons le résultat:
Le code a échoué avec la raison 'Impossible de localiser l'élément: {' method ':' xpath ',' selector ':' // input (@ name = 'name') '}
Passez maintenant à l'intérieur du cadre en utilisant Web Element ou dites en utilisant le localisateur Selenium et localisez le champ de zone de texte.
Vous trouverez ci-dessous le code complet pour basculer à l'intérieur du cadre:
package com.wordpress.pages; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class Frame { static WebDriver driver; @Test public void Test(){ System.setProperty('webdriver.chrome.driver', 'D:\Srinivas\New folder\exe\chromedriver.exe'); driver = new ChromeDriver(); driver.get('http://www.dwuser.com/education/content/the-magical-iframe-tag-an-introduction/'); //identifying the frame using locator or say using webelement driver.switchTo().frame(driver.findElement(By.xpath('//div(@id='eduFooterWrap')//iframe(1)'))); driver.findElement(By.xpath('//input(@name='name')')).sendKeys('SoftwareTestingHelp.com'); } }
Production:
C'est ainsi que nous devons basculer entre les cadres pour localiser les éléments à l'aide de Selenium. S'il y a plusieurs cadres sur votre page Web, vous devez changer plusieurs fois.
Conclusion
- iFrame est un document HTML intégré dans un autre document HTML. Les iFrames sont explicitement mentionnés sur le document HTML à l'aide de la balise HTML
- La méthode switchTo.frame (int frameNumber) permet aux utilisateurs de passer à une image particulière en utilisant l'identifiant de la trame.
- La méthode switchTo.frame (string frameName) permet aux utilisateurs de basculer vers un cadre particulier en utilisant le nom du cadre défini par le développeur.
- La méthode switchTo.frame (WebElement frameElement) permet aux utilisateurs de basculer vers un cadre en fonction de l'emplacement de l'élément Web.
=> Consultez TOUS les tutoriels Selenium ici.
lecture recommandée
- Tutoriel Cucumber Selenium: Intégration Cucumber Java Selenium WebDriver
- Introduction à Selenium WebDriver - Tutoriel Selenium # 8
- Implémentation de notre premier script WebDriver - Tutoriel Selenium WebDriver # 10
- FAQ sur le sélénium
- Comment gérer les alertes / fenêtres contextuelles dans Selenium WebDriver - Tutoriel Selenium # 16
- Gestion des tableaux Web, des cadres et des éléments dynamiques dans le script Selenium - Tutoriel Selenium # 18
- Attente implicite et explicite dans Selenium WebDriver (types d'attentes Selenium)
- Guide pour générer des rapports d'étendue dans Selenium WebDriver