handling iframes using selenium webdriver switchto method
bon descarregador de música mp3 per a Android
Manipulació d’iFrames amb Selenium WebDriver: tutorial pràctic amb exemples pràctics
iFrame (marc en línia) és un document HTML incrustat dins d'un altre document HTML.
Els iFrames s’utilitzen amb més freqüència per mostrar anuncis dins d’una pàgina web. Els iFrames s’esmenten explícitament al document HTML mitjançant l’etiqueta HTML
Aquest tutorial us explicarà tot sobre Manipulació d’iframes en seleni juntament amb els exemples de codi corresponents per facilitar-ne la comprensió.
=> Llegiu la sèrie d'entrenament Easy Selenium.
Què aprendreu:
- Manipulació d’iFrames amb seleni
- ACTUALITZACIÓ el març de 2020
- Conclusió
Manipulació d’iFrames amb seleni
Es pot identificar un iframe dins d'una pàgina web al navegador Firefox si l'opció anomenada 'Aquest marc' es mostra a les opcions del clic dret tal com es mostra a continuació.
Com a alternativa, també podem validar si una pàgina web té iframes mirant el codi font i cercant l’etiqueta
List iframes = driver.findElements(By.tagName(“iframe”));
Mètodes proporcionats per Selenium per al maneig d'iFrames
Seleni proporciona els següents mètodes integrats per canviar d'iframes d'anada i tornada.
- switchTo.frame (int frameNumber)
- switchTo.frame (string frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Aquest mètode permet als usuaris canviar a un marc concret mitjançant l'identificador de marc.
- El número de fotograma és un valor d’índex basat en zero, cosa que significa que el primer fotograma de la pàgina web té l’índex 0, el segon fotograma té l’índex 1 i el tercer fotograma té l’índex 3, etc.
- El número de trama també es pot identificar mitjançant l'identificador de trama de l'element. Això es pot fer mitjançant Feu clic amb el botó dret -> Inspeccioneu l'element i cerqueu l'iFrame. Valideu si algun dels iFrames té un atribut ID.
Un element iframe de mostra al codi font tindria l'aspecte que s'esmenta a continuació.
Un cop identificat l’identificador de l’iFrame, podem utilitzar el mateix per canviar al marc que es mostra a continuació.
Exemples:
driver.switchTo.frame ('a077aa5e');
driver.switchTo.frame (0);
- Aquest mètode genera NoSuchFrameException quan no es troba el marc requerit a la pàgina web actual.
# 2) switchTo.frame (string frameName)
- Aquest mètode permet als usuaris canviar a un marc concret mitjançant el nom definit per desenvolupador del marc.
- Cal incloure el nom del marc entre cometes dobles perquè es consideri un paràmetre de cadena.
- Aquest mètode genera NoSuchFrameException quan no es troba el marc requerit a la pàgina web actual.
Exemple:
Al codi esmentat anteriorment, tant l'identificador de trama com el nom de trama tenen el mateix valor. El canvi a fotograma es pot fer mitjançant el nom del fotograma que es mostra a continuació:
driver.switchTo.frame ('a077aa5e');
# 3) switchTo.frame (WebElement frameElement)
- Aquest mètode permet als usuaris canviar a un marc basat en la ubicació de l'element web.
- Aquest mètode genera NoSuchFrameException quan el marc requerit no està present a la pàgina web i StaleElementReferenceException si el marc que es mostra a la pàgina web no està actiu.
Exemple:
WebElement frameElement = driver.findElement (By.id ('a077aa5e'));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Es pot canviar entre els iframes i la pàgina principal mitjançant el mètode driver.switchTo (). DefaultContent ().
- Tingueu en compte que hi ha un mètode similar a Selenium per canviar entre els marcs anomenats mètode driver.switchTo (). ParentFrame ().
- La diferència entre driver.switchTo (). DefaultContent () i driver.switchTo (). ParentFrame () és que el primer mètode canvia el control a la pàgina web principal independentment del nombre de marcs de la pàgina web, mentre que el segon mètode canvia el control al marc principal del marc actual.
Exemple:
Suposem que hi ha tres marcs anomenats i1, i2 i i3 a la pàgina web pare p1. Els fotogrames i1, i2 i i3 depenen l'un de l'altre, cosa que significa que un fotograma serà el pare d'un altre.
Mitjançant el mètode driver.switchTo (). DefaultContent () al frame i3, el control del controlador web es mou a la pàgina principal, p1. Mentre el mètode driver.switchTo (). ParentFrame () al frame i3 torna a canviar el control al frame i2, etc.
Mostra de codi font:
A continuació es mostra l’escenari de prova que s’ha d’automatitzar mitjançant iframes en seleni:
- Obriu el lloc web SoftwareTestingHelp.com.
- Cerqueu tots els elements HTML amb l’etiqueta iframe, compteu el nombre d’ocurrències de l’iFrame i imprimiu-lo en una consola.
- Canvieu a un marc vàlid a la pàgina web mitjançant l'identificador de marc i imprimiu el codi font del marc.
- Tanqueu la finestra actual del navegador.
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(); } }
Sortida de codi:
Obriu el lloc web: https://www.softwaretestinghelp.com
Canvieu al marc anomenat aswift_0.
Imprimiu el nombre d'iframes a la pàgina web a la finestra de la consola Eclipse.
Imprimiu el codi font del fotograma a la consola Eclipse després de canviar al fotograma.
Explicació del codi:
- Estem inicialitzant un objecte del controlador gecko mitjançant el mètode System.setProperty per assenyalar la ruta del fitxer geckodriver.exe a la màquina local.
- A continuació, instanciem un objecte del controlador FireFox a través de la interfície WebDriver.
- Amb l'objecte del controlador de firefox, s'obre la pàgina web següent: https://www.softwaretestinghelp.com.
- Al següent pas, estem identificant el nombre d’elements iframe que es mostren a la pàgina web, comptant-los i mostrant el recompte d’iframe a la consola d’eclipsi.
- Mitjançant l'identificador de marc, canviarem al marc de la pàgina web. En el cas anterior, l'identificador del marc és 'aswift_0'.
- Un cop hem canviat amb èxit al quadre, estem imprimint el codi font del marc a la consola eclipsi.
- A continuació, tornem a la pàgina web principal mitjançant la instrucció driver.switchTo (). DefaultContent () i, finalment, tanquem la instància del controlador web mitjançant el mètode driver.quit.
Diferència entre Frame i iFrame a Selenium
- S’utilitza un marc per dividir una pàgina en diverses seccions, amb contingut nou a cada secció.
- S’utilitza un iFrame per incrustar el contingut dels llocs web externs a la pàgina web, per tal d’evitar problemes de script entre llocs.
- Es considera que un iFrame és menys segur que un marc, ja que iFrame permet als desenvolupadors incrustar contingut des de llocs web de tercers. Per tant, un iframe requereix que un desenvolupador confiï en el contingut que ha inclòs a l’iframe.
- La majoria de les aplicacions web que es desenvolupen avui en dia no utilitzen marcs per dividir la pàgina, sinó que utilitzen iframes per incrustar contingut extern, com ara anuncis a la pàgina web.
Manipulació de marcs dinàmics en seleni
- En algunes pàgines web, les propietats del marc, com ara l'identificador del marc i el nom del marc, poden canviar dinàmicament en una pàgina web, però la posició del marc seguirà sent la mateixa. En aquest cas, no podem confiar en l'identificador o el nom del marc per identificar de manera única un marc.
- Podem utilitzar el índex de fotogrames en aquest cas, identificar de manera única el marc en funció de la posició del marc.
- En alguns casos, el valor de l'identificador de marc canvia cada vegada que es carrega la pàgina, però amb un text estàtic que no canvia. Per exemple , tingueu en compte el codi següent per a iframes.
A l'exemple anterior, el text 'frame_' es manté constant mentre el valor numèric canvia amb cada càrrega de pàgina.
- Podem identificar el marc anterior de manera única amb el següent XPath
// iframe (conté (@ id, 'marc'))
ACTUALITZACIÓ el març de 2020
Com localitzar els elements dins del marc
A Selenium, per accedir als elements presents a l'interior del marc, primer hem de canviar a l'interior del marc i després identificar els elements tal com ho fem normalment amb diferents localitzadors de Selenium. El vostre codi Selenium no pot localitzar els vostres elements sense canviar a IFrame.
A la captura de pantalla següent es mostra com s’incorporen els marcs en un codi HTML:
Diferents maneres de canviar a un IFrame mitjançant seleni
# 1) Utilitzant el nom o l'identificador del marc
Canvieu a IFrame mitjançant el nom del marc o l'identificador del marc, de vegades el nom o l'identificador del marc o tots dos estaran presents en un codi.
Sintaxi:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Ús de l’índex de marcs
Localitzeu el marc mitjançant l’índex de marcs si està disponible.
Sintaxi:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Ús de l'element web
Localitzeu el marc mitjançant localitzadors de seleni .
Sintaxi:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Altres operacions amb Frame
# 1) Tornar al marc principal o ancestral
Tornar del fotograma 3 al fotograma 2 mitjançant l'ordre 'switchTo.parentFrame' .
Sintaxi:
driver.switchTo().parentFrame();
# 2) Canvi a qualsevol altre marc
Si voleu canviar del fotograma 3 al fotograma 1 o al fotograma per defecte, utilitzeu l'ordre 'switchTo.defaultContent'.
Sintaxi:
driver.switchTo().defaultContent();
Al codi següent, localitzem un quadre de text de nom present dins d’un marc.
Què passa si intentem localitzar-lo directament sense canviar al marc?
Vegem el resultat:
El codi ha fallat amb el motiu 'No s'ha pogut localitzar l'element: {' mètode ':' xpath ',' selector ':' // entrada (@ name = 'name') '}
Ara canvieu dins del marc mitjançant Element web o digueu amb Selenium locator i localitzeu el camp del quadre de text.
A continuació es mostra el codi complet per canviar dins del marc:
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'); } }
Sortida:
Així és com hem de canviar entre els marcs per localitzar els elements mitjançant Selenium. Si hi ha diversos fotogrames a la vostra pàgina web, heu de canviar diverses vegades.
Conclusió
- iFrame és un document HTML incrustat en un altre document HTML. Els iFrames s’esmenten explícitament al document HTML mitjançant l’etiqueta HTML
- El mètode switchTo.frame (int frameNumber) permet als usuaris canviar a un marc concret mitjançant l'identificador de marc.
- El mètode switchTo.frame (string frameName) permet als usuaris canviar a un marc concret mitjançant el nom del marc definit pel desenvolupador.
- El mètode switchTo.frame (WebElement frameElement) permet als usuaris canviar a un marc basat en la ubicació de l’element web.
=> Consulteu TOTS els tutorials de Selenium aquí.
Lectura recomanada
- Tutorial de Cogombre Selenium: Integració de Cogombre Java Selenium WebDriver
- Introducció a Selenium WebDriver - Tutorial Selenium núm. 8
- Implementació del nostre primer script WebDriver - Tutorial Selenium WebDriver # 10
- Preguntes més freqüents sobre el seleni
- Com gestionar les alertes / finestres emergents a Selenium WebDriver - Tutorial Selenium núm. 16
- Manipulació de taules web, marcs i elements dinàmics a Selenium Script - Selenium Tutorial # 18
- Espera implícita i explícita a Selenium WebDriver (tipus d'espera de seleni)
- Guia per generar informes d’extensió a Selenium WebDriver