Comment gérer les iFrames dans Selenium Webdriver: switchTo ()

Table des matières:

Anonim

iFrame dans Selenium Webdriver

iFrame dans Selenium Webdriver est une page Web ou un cadre en ligne qui est incorporé dans une autre page Web ou un document HTML incorporé dans un autre document HTML. L'iframe est souvent utilisé pour ajouter du contenu à partir d'autres sources comme une publicité dans une page Web. L'iframe est défini avec la balise < iframe >.

Dans ce tutoriel, vous apprendrez -

  1. Comment identifier l'iframe:
  2. Comment basculer les éléments dans les iframes à l'aide des commandes du pilote Web:
  3. Concept de cadres imbriqués (cadres à l'intérieur de cadres):

Comment identifier l'iframe:

Nous ne pouvons pas détecter les cadres en voyant simplement la page ou en inspectant Firebug.

Observez l'image ci-dessous, la publicité affichée est une Iframe, nous ne pouvons pas localiser ou reconnaître cela en inspectant simplement à l'aide de Firebug. La question est donc de savoir comment identifier l'iframe?

Comment identifier l'iframe à l'aide de Selenium WebDriver

Nous pouvons identifier les cadres dans Selenium en utilisant les méthodes ci-dessous:

  • Faites un clic droit sur l'élément, si vous trouvez l'option comme `` Ce cadre '', alors c'est une iframe. (Veuillez vous référer au diagramme ci-dessus)
  • Faites un clic droit sur la page et cliquez sur «Afficher la source de la page» et recherchez avec «iframe», si vous pouvez trouver un nom de balise avec «iframe», cela signifie que la page est constituée d'un iframe.

Dans le diagramme ci-dessus, vous pouvez voir que l' option ' This Frame ' est disponible en cliquant avec le bouton droit de la souris, nous sommes donc maintenant sûrs qu'il s'agit d'une iframe.

Nous pouvons même identifier le nombre total d'iframes en utilisant l'extrait ci-dessous.

Int size = driver.findElements (By.tagName ("iframe")). Size ();

Comment basculer les éléments dans les iframes à l'aide des commandes du pilote Web:

Fondamentalement, nous pouvons basculer les éléments et gérer les cadres dans Selenium de 3 façons.

  • Par index
  • Par nom ou identifiant
  • Par élément Web

Passer à l'image par index:

L'index est l'un des attributs de la gestion des trames dans Selenium grâce auquel nous pouvons y basculer.

L'index de l'iframe commence par «0».

Supposons que s'il y a 100 cadres dans la page, nous pouvons passer au cadre dans Selenium en utilisant index.

  • driver.switchTo (). frame (0);
  • driver.switchTo (). frame (1);

Passer au cadre par nom ou ID:

Le nom et l'ID sont des attributs pour la gestion des cadres dans Selenium grâce auxquels nous pouvons passer à l'iframe.

  • driver.switchTo (). frame ("iframe1");
  • driver.switchTo (). frame ("id de l'élément");

Exemple de passage à iframe via ID:

Prenons un exemple pour changer de cadre dans Selenium affiché dans l'image ci-dessous. Notre exigence est de cliquer sur l'iframe.

Nous pouvons accéder à cette iframe via l'URL ci-dessous: http: //demo.guru99.com/test/guru99home/

Il est impossible de cliquer sur iframe directement via XPath car il s'agit d'une iframe. Nous devons d'abord passer au cadre, puis nous pouvons cliquer en utilisant xpath.

Étape 1)

Pilote WebDriver = nouveau FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximiser ();
  • Nous initialisons le pilote Firefox.
  • Accédez au site "guru99" qui contient l'iframe.
  • Maximisé la fenêtre.

Étape 2)

driver.switchTo (). frame ("a077aa5e");
  • Dans cette étape, nous devons trouver l'id de l'iframe en inspectant via Firebug.
  • Passez ensuite à l'iframe via l'ID.

Étape 3)

driver.findElement (By.xpath ("html / body / a / img")). click ();
  • Ici, nous devons trouver le xpath de l'élément sur lequel cliquer.
  • Cliquez sur l'élément à l'aide de la commande du pilote Web illustrée ci-dessus.

Voici le code complet:

public class SwitchToFrame_ID {public static void main (String [] args) {Pilote WebDriver = nouveau FirefoxDriver (); // accède au navigateurdriver.get ("http://demo.guru99.com/test/guru99home/");// accède à la page constituée d'un iframedriver.manage (). window (). maximiser ();driver.switchTo (). frame ("a077aa5e"); // commutation de la trame par IDSystem.out.println ("******** Nous passons à l'iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Clique sur l'iframeSystem.out.println ("********* Nous avons terminé ***************");}}

Production:

Le navigateur accède à la page contenant l'iframe ci-dessus et clique sur l'iframe.

Basculez vers le cadre par élément Web:

Nous pouvons même passer à l'iframe en utilisant l'élément web.

  • driver.switchTo (). frame (WebElement);

Comment revenir au cadre principal

Nous devons sortir de l'iframe.

Pour revenir au cadre parent, vous pouvez utiliser switchTo (). ParentFrame () ou si vous souhaitez revenir au cadre principal (ou à la plupart des cadres parent), vous pouvez utiliser switchTo (). DefaultContent ();

driver.switchTo (). parentFrame ();driver.switchTo (). defaultContent ();

Comment basculer le cadre, si nous NE POUVONS PAS basculer à l'aide de l'ID ou de l'élément Web:

Supposons qu'il y ait 100 cadres dans la page, et qu'il n'y ait pas d'identifiant disponible, dans ce cas, nous ne savons tout simplement pas à partir de quel élément iframe requis est chargé (c'est le cas lorsque nous ne connaissons pas l'index du cadre également).

La solution au problème ci-dessus est que nous devons trouver l'index de l'iframe à travers lequel l'élément est chargé, puis nous devons passer à l'iframe via l'index.

Vous trouverez ci-dessous les étapes pour trouver l'index du cadre par lequel l'élément est chargé à l'aide de l'extrait de code ci-dessous

Étape 1)

Pilote WebDriver = nouveau FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximiser ();
  • Initialisez le pilote Firefox.
  • Accédez au site "guru99" qui contient l'iframe.
  • Maximisé la fenêtre.

Étape 2)

int size = driver.findElements (By.tagName ("iframe")). size ();
  • Le code ci-dessus trouve le nombre total d'iframes présentes à l'intérieur de la page en utilisant la variable «iframe».

Étape 3)

L'objectif de cette étape serait de trouver l'index de l'iframe.

pour (int i = 0; i <= taille; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (Par.xpath ("html / corps / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent ();}

Au-dessus de "forloop" itère tous les iframes de la page et il imprime '1' si notre iframe requis a été trouvé sinon renvoie '0'.

Voici le code complet jusqu'à l'étape 3:

classe publique IndexOfIframe {public static void main (String [] args) {Pilote WebDriver = nouveau FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximiser ();//driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();pour (int i = 0; i <= taille; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (Par.xpath ("html / corps / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent ();}}}

Exécutez ce programme et la sortie serait comme ci-dessous:

Production:

100000
Vérifiez la sortie, vous pouvez trouver la série de 0 et de 1.
  • Partout où vous trouvez le «1» dans la sortie, c'est l'index de Frame par lequel l'élément est chargé.
  • Puisque l'index de l'iframe commence par '0' si vous trouvez le 1 à la 1ère place, alors l'index est 0.
  • Si vous trouvez 1 en 3 ème place, l'indice est 2.
Nous pouvons commenter la boucle for, une fois que nous avons trouvé l'index. Étape 4)
driver.switchTo (). frame (0); 
  • Une fois que vous avez trouvé l'index de l'élément, vous pouvez basculer sur le cadre en utilisant la commande ci-dessus.
  • driver.switchTo (). frame (index trouvé à l'étape 3);
Étape 5)
driver.findElement (By.xpath ("html / body / a / img")). click ();
  • Le code ci-dessus cliquera sur l'iframe ou l'élément dans l'iframe.
Donc, le code complet serait comme ci-dessous:
public class SwitchToframe {public static void main (String [] args) lève NoSuchElementException {Pilote WebDriver = nouveau FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximiser ();// int size = driver.findElements (By.tagName ("iframe")). size ();/ * pour (int i = 0; i <= taille; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (Par.xpath ("html / corps / a / img")). size ();System.out.println (total);driver.switchTo (). defaultContent (); // revenir de l'iframe} * /// Commenté le code pour trouver l'index de l'élémentdriver.switchTo (). frame (0); // Passage au cadreSystem.out.println ("******** Nous sommes passés à l'iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// En cliquant sur l'élément en ligne avec la publicitéSystem.out.println ("********* Nous avons terminé ***************");}}
Sortie: le navigateur accède à la page contenant l'iframe ci-dessus et clique sur l'iframe.

Concept de cadres imbriqués (cadres à l'intérieur de cadres):

Supposons qu'il y ait deux cadres l'un à l'intérieur de l'autre comme indiqué dans l'image ci-dessous et que notre exigence est d'imprimer le texte dans le cadre extérieur et le cadre intérieur. Dans le cas de cadres imbriqués,
  • Au début, nous devons basculer vers le cadre externe par index ou ID de l'iframe
  • Une fois que nous passons au cadre extérieur, nous pouvons trouver le nombre total d'iframes à l'intérieur du cadre extérieur, et
  • Nous pouvons passer au cadre intérieur par l'une des méthodes connues.
En sortant du cadre, nous devons sortir dans le même ordre que nous y sommes entrés du cadre intérieur d'abord, puis du cadre extérieur.
IFrames imbriquées dans Selenium WebDriver

Le code Html pour le cadre imbriqué ci-dessus est comme indiqué ci-dessous.

Le code HTML ci-dessus explique clairement la balise iframe (surlignée en vert) dans une autre balise iframe, indiquant la présence d'iframes imbriqués.

Voici les étapes pour passer au cadre extérieur et imprimer le texte sur les cadres extérieurs: Étape 1)

Pilote WebDriver = nouveau FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximiser ();driver.manage (). timeouts (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Nombre total d'images -" + taille);// imprime le nombre total d'imagesdriver.switchTo (). frame (0); // Changement du cadre extérieurSystem.out.println (driver.findElement (By.xpath ("xpath de l'élément externe")). GetText ()); 
  • Passez au cadre extérieur.
  • Imprime le texte sur le cadre extérieur.

Une fois que nous passons au cadre extérieur, nous devrions savoir si un cadre intérieur présent à l'intérieur du cadre extérieur

Étape 2)

size = driver.findElements (By.tagName ("iframe")). size ();// imprime le nombre total d'images à l'intérieur du cadre extérieurSystem.out.println ("Nombre total d'images -" + taille);
  • Recherche le nombre total d'iframes à l'intérieur du cadre extérieur.
  • Si la taille a été trouvée «0», il n'y a pas de cadre intérieur à l'intérieur du cadre.
Étape 3)
driver.switchTo (). frame (0); // Passage au cadre interneSystem.out.println (driver.findElement (By.xpath ("xpath de l'élément interne")). GetText ());
  • Passer au cadre intérieur
  • Imprime le texte sur le cadre intérieur.
Voici le code complet:
public class FramesInsideFrames {public static void main (String [] args) {Pilote WebDriver = nouveau FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximiser ();driver.manage (). timeouts (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Nombre total d'images -" + taille);// imprime le nombre total d'imagesdriver.switchTo (). frame (0); // Changement du cadre extérieurSystem.out.println (driver.findElement (By.xpath ("xpath de l'élément externe")). GetText ());// Impression du texte dans le cadre extérieursize = driver.findElements (By.tagName ("iframe")). size ();// imprime le nombre total d'images à l'intérieur du cadre extérieurSystem.out.println ("Nombre total d'images -" + taille);driver.switchTo (). frame (0); // Passage au cadre interneSystem.out.println (driver.findElement (By.xpath ("xpath de l'élément interne")). GetText ());// Impression du texte dans le cadre intérieurdriver.switchTo (). defaultContent ();}}
Sortie : La sortie du code ci-dessus imprimerait le texte dans le cadre intérieur et le cadre extérieur.