iFrame in Selenium Webdriver
iFrame in Selenium Webdriver è una pagina web o un frame inline che è incorporato in un'altra pagina web o un documento HTML incorporato in un altro documento HTML. L'iframe viene spesso utilizzato per aggiungere contenuti da altre fonti come un annuncio pubblicitario in una pagina web. L'iframe è definito con il tag < iframe >.
In questo tutorial imparerai:
- Come identificare l'iframe:
- Come cambiare gli elementi negli iframe utilizzando i comandi del driver Web:
- Concetto di frame annidati (frame all'interno di frame):
Come identificare l'iframe:
Non possiamo rilevare i frame semplicemente vedendo la pagina o ispezionando Firebug.
Osserva l'immagine sottostante, la pubblicità visualizzata è un Iframe, non possiamo individuarlo o riconoscerlo semplicemente ispezionandolo con Firebug. Quindi la domanda è: come puoi identificare l'iframe?

Possiamo identificare i telai in selenio usando i metodi indicati di seguito:
- Fai clic con il pulsante destro del mouse sull'elemento, se trovi l'opzione come "Questo frame", si tratta di un iframe (fai riferimento al diagramma sopra).
- Fare clic con il tasto destro sulla pagina e fare clic su "Visualizza sorgente pagina" e cercare con "iframe", se è possibile trovare un nome di tag con "iframe", significa che la pagina è costituita da un iframe.
Nel diagramma sopra, puoi vedere che l' opzione " Questo frame " è disponibile facendo clic con il pulsante destro del mouse, quindi ora siamo sicuri che si tratti di un iframe.
Possiamo persino identificare il numero totale di iframe utilizzando lo snippet di seguito.
Int size = driver.findElements (By.tagName ("iframe")). Size ();
Come cambiare gli elementi negli iframe utilizzando i comandi del driver Web:
Fondamentalmente, possiamo cambiare gli elementi e gestire i telai in selenio usando 3 modi.
- Di Index
- Per nome o ID
- Di Web Element
Passa al fotogramma per indice:
L'indice è uno degli attributi per la gestione dei frame in Selenium attraverso il quale possiamo passare ad esso.
L'indice dell'iframe inizia con "0".
Supponiamo che se ci sono 100 frame nella pagina, possiamo passare al frame in Selenium usando l'indice.
- driver.switchTo (). frame (0);
- driver.switchTo (). frame (1);
Passa al frame per nome o ID:
Nome e ID sono attributi per la gestione dei frame in Selenium attraverso i quali possiamo passare all'iframe.
- driver.switchTo (). frame ("iframe1");
- driver.switchTo (). frame ("id dell'elemento");
Esempio di passaggio a iframe tramite ID:
Facciamo un esempio per cambiare frame in Selenium visualizzato nell'immagine sottostante. Il nostro requisito è fare clic sull'iframe.
Possiamo accedere a questo iframe tramite l'URL seguente: http: //demo.guru99.com/test/guru99home/
È impossibile fare clic su iframe direttamente tramite XPath poiché si tratta di un iframe. Per prima cosa dobbiamo passare al frame e poi possiamo fare clic usando xpath.
Passo 1)
Driver WebDriver = nuovo FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maxim ();
- Inizializziamo il driver di Firefox.
- Vai al sito "guru99" che consiste nell'iframe.
- Ingrandita la finestra.
Passo 2)
driver.switchTo (). frame ("a077aa5e");
- In questo passaggio dobbiamo scoprire l'id dell'iframe ispezionandolo tramite Firebug.
- Quindi passa all'iframe tramite ID.
Passaggio 3)
driver.findElement (By.xpath ("html / body / a / img")). click ();
- Qui dobbiamo trovare l'xpath dell'elemento su cui fare clic.
- Fare clic sull'elemento utilizzando il comando del driver Web mostrato sopra.
Ecco il codice completo:
classe pubblica SwitchToFrame_ID {public static void main (String [] args) {Driver WebDriver = nuovo FirefoxDriver (); // passa al browserdriver.get ("http://demo.guru99.com/test/guru99home/");// passa alla pagina costituita da un iframedriver.manage (). window (). maxim ();driver.switchTo (). frame ("a077aa5e"); // cambia il frame per IDSystem.out.println ("******** Siamo passati all'iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Fa clic sull'iframeSystem.out.println ("********* Abbiamo finito ***************");}}
Produzione:
Il browser passa alla pagina costituita dall'iframe sopra e fa clic sull'iframe.
Passa al frame tramite Web Element:
Possiamo anche passare all'iframe utilizzando l'elemento web.
- driver.switchTo (). frame (WebElement);
Come tornare al frame principale
Dobbiamo uscire dall'iframe.
Per tornare al frame principale, puoi usare switchTo (). ParentFrame () oppure, se vuoi tornare al frame principale (o più genitore), puoi usare switchTo (). DefaultContent ();
driver.switchTo (). parentFrame ();driver.switchTo (). defaultContent ();
Come cambiare il frame, se NON POSSIAMO cambiare utilizzando ID o Web Element:
Supponiamo che la pagina contenga 100 frame e non sia disponibile un ID, in questo caso non sappiamo da quale elemento iframe richiesto viene caricato (è il caso in cui non conosciamo l'indice del frame anche).
La soluzione per la preoccupazione di cui sopra è che dobbiamo trovare l'indice dell'iframe attraverso il quale l'elemento viene caricato e quindi dobbiamo passare all'iframe tramite l'indice.
Di seguito sono riportati i passaggi per trovare l'indice del Frame in base al quale l'elemento viene caricato utilizzando lo snippet di seguito
Passo 1)
Driver WebDriver = nuovo FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maxim ();
- Inizializza il driver di Firefox.
- Vai al sito "guru99" che consiste nell'iframe.
- Ingrandita la finestra.
Passo 2)
int size = driver.findElements (By.tagName ("iframe")). size ();
- Il codice sopra trova il numero totale di iframe presenti all'interno della pagina utilizzando il tagname "iframe".
Passaggio 3)
L'obiettivo di questo passaggio sarebbe scoprire l'indice di iframe.
for (int i = 0; i <= size; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (totale);driver.switchTo (). defaultContent ();}
Sopra "forloop" itera tutti gli iframe nella pagina e stampa '1' se il nostro iframe richiesto è stato trovato altrimenti restituisce '0'.
Ecco il codice completo fino al passaggio 3:
public class IndexOfIframe {public static void main (String [] args) {Driver WebDriver = nuovo FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maxim ();//driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();for (int i = 0; i <= size; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (totale);driver.switchTo (). defaultContent ();}}}
Esegui questo programma e l'output sarà come di seguito:
Produzione:
100000Verifica l'output, puoi trovare le serie di 0 e 1.
- Ovunque trovi l '"1" nell'output che è l'indice di Frame in base al quale l'elemento viene caricato.
- Dal momento che l'indice del iframe inizia con '0' se si trova la 1 nel 1 ° posto, poi l'indice è 0.
- Se trovi 1 al 3 ° posto, l'indice è 2.
driver.switchTo (). frame (0);
- Una volta trovato l'indice dell'elemento, puoi cambiare il frame usando il comando sopra.
- driver.switchTo (). frame (indice trovato dal passaggio 3);
driver.findElement (By.xpath ("html / body / a / img")). click ();
- Il codice precedente farà clic sull'iframe o sull'elemento nell'iframe.
public class SwitchToframe {public static void main (String [] args) genera NoSuchElementException {Driver WebDriver = nuovo FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maxim ();// int size = driver.findElements (By.tagName ("iframe")). size ();/ * for (int i = 0; i <= size; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (totale);driver.switchTo (). defaultContent (); // tornare indietro dall'iframe} * /// Ha commentato il codice per trovare l'indice dell'elementodriver.switchTo (). frame (0); // Passaggio al frameSystem.out.println ("******** Siamo passati all'iframe *******");driver.findElement (By.xpath ("html / body / a / img")). click ();// Facendo clic sull'elemento in linea con la pubblicitàSystem.out.println ("********* Abbiamo finito ***************");}}Risultato: il browser passa alla pagina costituita dall'iframe sopra e fa clic sull'iframe.
Concetto di frame annidati (frame all'interno di frame):
Supponiamo che ci siano due frame uno dentro l'altro come mostrato nell'immagine sottostante e il nostro requisito è stampare il testo nel frame esterno e nel frame interno. Nel caso di frame annidati,- All'inizio dobbiamo passare al frame esterno tramite l'indice o l'ID dell'iframe
- Una volta che passiamo al frame esterno, possiamo trovare il numero totale di iframe all'interno del frame esterno, e
- Possiamo passare al frame interno con uno qualsiasi dei metodi noti.

Il codice Html per il frame nidificato sopra è come mostrato di seguito.
Il codice HTML precedente spiega chiaramente il tag iframe (evidenziato in verde) all'interno di un altro tag iframe, indicando la presenza di iframe nidificati.
Di seguito sono riportati i passaggi per passare al frame esterno e stampare il testo sui frame esterni: Passaggio 1)
Driver WebDriver = nuovo FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maxim ();driver.manage (). timeouts (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Total Frames -" + dimensione);// stampa il numero totale di framedriver.switchTo (). frame (0); // Cambio del frame esternoSystem.out.println (driver.findElement (By.xpath ("xpath dell'elemento esterno")). GetText ());
- Passa alla cornice esterna.
- Stampa il testo sulla cornice esterna.
Una volta che passiamo alla cornice esterna, dovremmo sapere se c'è qualche cornice interna presente all'interno della cornice esterna
Passo 2)
size = driver.findElements (By.tagName ("iframe")). size ();// stampa il numero totale di frame all'interno del frame esternoSystem.out.println ("Total Frames -" + dimensione);
- Trova il numero totale di iframe all'interno del frame esterno.
- Se la dimensione è stata trovata "0", non è presente alcun frame interno all'interno del frame.
driver.switchTo (). frame (0); // Passaggio a innerframeSystem.out.println (driver.findElement (By.xpath ("xpath dell'elemento interno")). GetText ());
- Passa alla cornice interna
- Stampa il testo sulla cornice interna.
public class FramesInsideFrames {public static void main (String [] args) {Driver WebDriver = nuovo FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maxim ();driver.manage (). timeouts (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Total Frames -" + dimensione);// stampa il numero totale di framedriver.switchTo (). frame (0); // Cambio del frame esternoSystem.out.println (driver.findElement (By.xpath ("xpath dell'elemento esterno")). GetText ());// Stampa il testo nella cornice esternasize = driver.findElements (By.tagName ("iframe")). size ();// stampa il numero totale di frame all'interno del frame esternoSystem.out.println ("Total Frames -" + dimensione);driver.switchTo (). frame (0); // Passaggio a innerframeSystem.out.println (driver.findElement (By.xpath ("xpath dell'elemento interno")). GetText ());// Stampa il testo nella cornice internadriver.switchTo (). defaultContent ();}}Output : l'output del codice precedente stamperà il testo nella cornice interna e nella cornice esterna.