handling iframes using selenium webdriver switchto method
domande e risposte per interviste esperte per esperti
Gestione di iFrame utilizzando Selenium WebDriver: tutorial pratico con esempi pratici
iFrame (inline frame) è un documento HTML incorporato in un altro documento HTML.
Gli iFrame sono più comunemente usati per visualizzare annunci pubblicitari all'interno di una pagina web. Gli iFrame sono menzionati esplicitamente nel documento HTML utilizzando il tag HTML
Questo tutorial ti spiegherà tutto sulla gestione degli iframe in Selenium insieme agli esempi di codice interessati per una tua facile comprensione.
=> Leggere attraverso la serie di formazione Easy Selenium.
Cosa imparerai:
- Gestire gli iFrame utilizzando il selenio
- AGGIORNAMENTO a marzo 2020
- Conclusione
Gestire gli iFrame utilizzando il selenio
Un iframe all'interno di una pagina web può essere identificato nel browser Firefox se l'opzione denominata 'Questo frame' viene visualizzata nelle opzioni di clic con il pulsante destro del mouse come mostrato di seguito.
In alternativa, possiamo anche verificare se una pagina web ha iframe guardando il codice sorgente e cercando il tag
List iframes = driver.findElements(By.tagName(“iframe”));
Metodi forniti da Selenium per la gestione di iFrame
Selenium fornisce i seguenti metodi integrati per passare avanti e indietro dagli iframe.
- switchTo.frame (int frameNumber)
- switchTo.frame (stringa frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Questo metodo consente agli utenti di passare a un frame particolare utilizzando l'ID frame.
- Il numero di frame è un valore di indice a base zero, il che significa che il primo frame della pagina Web ha l'indice 0, il secondo frame ha l'indice 1 e il terzo frame ha l'indice 3 e così via.
- Il numero di frame può anche essere identificato utilizzando l'ID frame dell'elemento. Questo può essere fatto da Fare clic con il tasto destro -> Ispeziona l'elemento e cerca l'iFrame. Convalida se uno qualsiasi degli iFrame ha un attributo ID.
L'elemento iframe di esempio sul codice sorgente dovrebbe apparire come indicato di seguito.
Una volta identificato l'id dell'iFrame, possiamo usare lo stesso per passare al frame come sotto.
Esempi:
driver.switchTo.frame ('a077aa5e');
driver.switchTo.frame (0);
- Questo metodo genera NoSuchFrameException quando il frame richiesto non viene trovato nella pagina Web corrente.
# 2) switchTo.frame (string frameName)
- Questo metodo consente agli utenti di passare a un frame particolare utilizzando il nome del frame definito dallo sviluppatore.
- Il nome del frame deve essere racchiuso tra virgolette doppie per essere considerato come un parametro String.
- Questo metodo genera NoSuchFrameException quando il frame richiesto non viene trovato nella pagina Web corrente.
Esempio:
Nel codice sopra menzionato, sia l'ID del frame che il nome del frame mantengono lo stesso valore. Il passaggio al frame può essere eseguito utilizzando il nome del frame come di seguito:
driver.switchTo.frame ('a077aa5e');
# 3) switchTo.frame (WebElement frameElement)
- Questo metodo consente agli utenti di passare a un frame in base alla posizione dell'elemento Web.
- Questo metodo genera NoSuchFrameException quando il frame richiesto non è presente nella pagina Web e StaleElementReferenceException se il frame visualizzato sulla pagina Web non è attivo.
Esempio:
WebElement frameElement = driver.findElement (By.id ('a077aa5e'));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Il passaggio avanti e indietro tra iframe e pagina principale può essere ottenuto utilizzando il metodo driver.switchTo (). DefaultContent ().
- Si noti che esiste un metodo simile in Selenium per passare da un frame all'altro denominato driver.switchTo (). ParentFrame ().
- La differenza tra driver.switchTo (). DefaultContent () e driver.switchTo (). ParentFrame () è che il primo metodo passa il controllo alla pagina web principale indipendentemente dal numero di frame all'interno della pagina web, mentre il secondo metodo passa il controllo al frame principale del frame corrente.
Esempio:
Supponiamo che ci siano tre frame denominati i1, i2 e i3 all'interno della pagina web principale p1. I frame i1, i2 e i3 dipendono l'uno dall'altro, il che significa che un frame sarà il genitore di un altro.
Usando il metodo driver.switchTo (). DefaultContent () sul frame i3, il controllo del driver web si sposta alla pagina principale, p1. Mentre il metodo driver.switchTo (). ParentFrame () sul frame i3 riporta il controllo al frame i2 e così via.
Esempio di codice sorgente:
Di seguito è riportato lo scenario di test da automatizzare utilizzando iframe in selenio:
- Apri il sito Web SoftwareTestingHelp.com.
- Trova tutti gli elementi HTML con il tag iframe, conta il numero di occorrenze dell'iFrame e stampalo su una console.
- Passare a un frame valido sulla pagina Web utilizzando l'ID frame e stampare il codice sorgente del frame.
- Chiudi la finestra del browser corrente.
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(); } }
Uscita codice:
Apri il sito web: https://www.softwaretestinghelp.com
Passa al frame chiamato aswift_0.
Stampa il numero di iframe sulla pagina web nella finestra della console di eclipse.
Stampa il codice sorgente del frame sulla console di eclipse dopo essere passato al frame.
Spiegazione del codice:
- Stiamo inizializzando un oggetto del driver gecko utilizzando il metodo System.setProperty per puntare al percorso del file geckodriver.exe sulla macchina locale.
- Stiamo quindi istanziando un oggetto del driver FireFox tramite l'interfaccia WebDriver.
- Utilizzando l'oggetto driver firefox, viene aperta la seguente pagina Web: https://www.softwaretestinghelp.com.
- Nella fase successiva, identificheremo il numero di elementi iframe visualizzati sulla pagina web, contandoli e visualizzando il conteggio iframe sulla console di eclipse.
- Utilizzando l'ID frame, stiamo passando al frame sulla pagina web. Nel caso precedente, l'ID frame è 'aswift_0'.
- Dopo aver eseguito con successo un passaggio al frame, stiamo stampando il codice sorgente del frame sulla console di eclipse.
- Torneremo quindi alla pagina Web principale utilizzando l'istruzione driver.switchTo (). DefaultContent () e infine chiuderemo l'istanza del driver Web utilizzando il metodo driver.quit.
Differenza tra Frame e iFrame in Selenio
- Un frame viene utilizzato per dividere una pagina in più sezioni, con nuovi contenuti in ciascuna sezione.
- Un iFrame viene utilizzato per incorporare il contenuto dei siti Web esterni nella pagina Web, al fine di evitare problemi di scripting intersito.
- Un iFrame è considerato meno sicuro di un frame, poiché iFrame consente agli sviluppatori di incorporare contenuti da siti Web di terze parti. Pertanto, un iframe richiede che uno sviluppatore si fidi del contenuto che ha incorporato nell'iframe.
- La maggior parte delle applicazioni web sviluppate oggi non utilizza i frame per dividere la pagina, ma utilizza iframe per incorporare contenuti esterni come annunci pubblicitari all'interno della pagina web.
Manipolazione di frame dinamici in selenio
- In alcune pagine Web, le proprietà del frame come ID frame e nome frame possono cambiare dinamicamente su una pagina Web, tuttavia, la posizione del frame rimarrà la stessa. In tal caso, non possiamo fare affidamento sull'ID frame o sul nome frame per identificare in modo univoco un frame.
- Possiamo usare il file indice frame in tal caso per identificare in modo univoco il frame in base alla posizione del frame.
- In alcuni casi, il valore dell'id del frame cambia ogni volta che la pagina viene caricata, ma con un testo statico che non cambia. Per esempio , considera il codice seguente per iframe.
Nell'esempio precedente, il testo 'frame_' rimane costante mentre il valore numerico cambia a ogni caricamento della pagina.
- Possiamo identificare il frame sopra in modo univoco utilizzando il seguente XPath
// iframe (contiene (@ id, ’frame’))
AGGIORNAMENTO a marzo 2020
Come individuare gli elementi all'interno della cornice
In Selenium, per accedere agli elementi presenti all'interno del telaio, dobbiamo prima passare all'interno del telaio e poi identificare gli elementi come normalmente si fa utilizzando diversi localizzatori di Selenio. Il tuo codice Selenium non può individuare i tuoi elementi, senza passare a IFrame.
Lo screenshot qui sotto mostra come i frame sono incorporati in un codice HTML:
Diversi modi per passare a un IFrame utilizzando il selenio
# 1) Utilizzo del nome o dell'ID del frame
Passa a IFrame utilizzando il nome del frame o l'ID del frame, a volte il nome o l'ID del frame o entrambi saranno presenti in un codice.
Sintassi:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Utilizzo dell'indice dei fotogrammi
Individua il frame utilizzando l'indice dei frame, se disponibile.
Sintassi:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Utilizzo di Web Element
Individua il telaio utilizzando i localizzatori di selenio .
Sintassi:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Altre operazioni utilizzando Frame
# 1) Ritorno al frame padre o antenato
Tornando dal frame 3 al frame 2 utilizzando il comando 'switchTo.parentFrame' .
Sintassi:
driver.switchTo().parentFrame();
# 2) Passaggio a qualsiasi altro frame
Se si desidera passare dal frame 3 al frame 1 o al frame predefinito, utilizzare il comando 'switchTo.defaultContent'.
Sintassi:
driver.switchTo().defaultContent();
Nel codice sottostante stiamo individuando una casella di testo del nome presente all'interno di una cornice.
E se provassimo a localizzarlo direttamente senza passare alla cornice?
Vediamo il risultato:
Codice non riuscito con motivo 'Impossibile individuare l'elemento: {' method ':' xpath ',' selector ':' // input (@ name = ’name’) '}
Ora passa all'interno del frame usando Web Element o pronuncia usando Selenium locator e individua il campo della casella di testo.
Di seguito è riportato il codice completo per il passaggio all'interno del frame:
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'); } }
Produzione:
Questo è il modo in cui dobbiamo passare da un fotogramma all'altro per individuare gli elementi utilizzando il selenio. Se sono presenti più frame sulla tua pagina web, devi cambiarli più volte.
Conclusione
- iFrame è un documento HTML incorporato in un altro documento HTML. Gli iFrame sono menzionati esplicitamente nel documento HTML utilizzando il tag HTML
- Il metodo switchTo.frame (int frameNumber) consente agli utenti di passare a un particolare frame utilizzando l'id del frame.
- Il metodo switchTo.frame (string frameName) consente agli utenti di passare a un frame particolare utilizzando il nome del frame definito dallo sviluppatore.
- Il metodo switchTo.frame (WebElement frameElement) consente agli utenti di passare a un frame in base alla posizione dell'elemento Web.
=> Controlla TUTTI i tutorial sul selenio qui.
Lettura consigliata
- Esercitazione sul selenio di cetriolo: integrazione con WebDriver di selenio Java di cetriolo
- Introduzione a Selenium WebDriver - Selenium Tutorial # 8
- Implementazione del nostro primo script WebDriver - Selenium WebDriver Tutorial # 10
- Domande frequenti sul selenio
- Come gestire avvisi / popup in Selenium WebDriver - Selenium Tutorial # 16
- Gestione di tabelle Web, frame ed elementi dinamici in Selenium Script - Selenium Tutorial # 18
- Attesa implicita ed esplicita in Selenium WebDriver (tipi di attese al selenio)
- Guida per generare report di estensione in Selenium WebDriver