Slik håndterer du iFrames i Selen Webdriver: switchTo ()

Innholdsfortegnelse:

Anonim

iFrame i Selenium Webdriver

iFrame in Selenium Webdriver er en webside eller en innebygd ramme som er innebygd i en annen webside eller et HTML-dokument innebygd i et annet HTML-dokument. Iframe brukes ofte til å legge til innhold fra andre kilder som en annonse på en webside. Iframe er definert med taggen < iframe >.

I denne opplæringen lærer du -

  1. Hvordan identifisere iframe:
  2. Hvordan bytter du på elementene i iframes ved hjelp av Web Driver-kommandoer:
  3. Konseptet med nestede rammer (rammer innenfor rammer):

Hvordan identifisere iframe:

Vi kan ikke oppdage rammene ved å bare se siden eller ved å inspisere Firebug.

Observer bildet nedenfor. Annonsen som vises er en Iframe, vi kan ikke finne eller gjenkjenne det ved å bare inspisere ved hjelp av Firebug. Så spørsmålet er hvordan kan du identifisere iframe?

Hvordan identifisere iframe ved hjelp av Selenium WebDriver

Vi kan identifisere rammene i Selen ved hjelp av metodene nedenfor:

  • Høyreklikk på elementet. Hvis du finner alternativet "Denne rammen", er det en iframe. (Se diagrammet ovenfor)
  • Høyreklikk på siden og klikk "Vis sidekilde" og søk med "iframe", hvis du finner et tagnavn med "iframe", betyr det å si siden som består av en iframe.

I diagrammet ovenfor kan du se at alternativet ' Denne rammen ' er tilgjengelig ved høyreklikking, så vi er nå sikre på at det er en iframe.

Vi kan til og med identifisere totalt antall iframes ved å bruke kodebiten nedenfor.

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

Slik bytter du på elementene i iframes ved hjelp av Web Driver-kommandoer:

I utgangspunktet kan vi bytte over elementene og håndtere rammer i Selen på 3 måter.

  • Etter indeks
  • Etter navn eller ID
  • Av Web Element

Bytt til rammen etter indeks:

Indeks er en av attributtene for rammehåndtering i Selen hvor vi kan bytte til den.

Indeks for iframe starter med '0'.

Anta at hvis det er 100 rammer på siden, kan vi bytte til ramme i Selen ved å bruke indeks.

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

Bytt til rammen etter navn eller ID:

Navn og ID er attributter for håndtering av rammer i Selen hvor vi kan bytte til iframe.

  • driver.switchTo (). ramme ("iframe1");
  • driver.switchTo (). ramme ("elementets id");

Eksempel på bytte til iframe gjennom ID:

La oss ta et eksempel for å bytte ramme i Selen vist i bildet nedenfor. Vårt krav er å klikke på iframe.

Vi kan få tilgang til denne iframe via denne URL-en: http: // demo.guru99.com/test/guru99home/

Det er umulig å klikke iframe direkte gjennom XPath siden det er en iframe. Først må vi bytte til rammen, og deretter kan vi klikke med xpath.

Trinn 1)

WebDriver-driver = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). vindu (). maksimere ();
  • Vi initialiserer Firefox-driveren.
  • Naviger til "guru99" -området som består av iframe.
  • Maksimerte vinduet.

Steg 2)

driver.switchTo (). ramme ("a077aa5e");
  • I dette trinnet må vi finne ut ID-en til iframe ved å inspisere gjennom Firebug.
  • Bytt deretter til iframe gjennom ID.

Trinn 3)

driver.findElement (By.xpath ("html / body / a / img")). klikk ();
  • Her må vi finne ut xpath av elementet som skal klikkes.
  • Klikk på elementet ved hjelp av webdriverkommandoen vist ovenfor.

Her er den komplette koden:

offentlig klasse SwitchToFrame_ID {public static void main (String [] args) {WebDriver-driver = ny FirefoxDriver (); // navigerer til nettleserendriver.get ("http://demo.guru99.com/test/guru99home/");// navigerer til siden som består av en iframedriver.manage (). vindu (). maksimere ();driver.switchTo (). ramme ("a077aa5e"); // bytte ramme etter IDSystem.out.println ("******** Vi bytter til iframe *******");driver.findElement (By.xpath ("html / body / a / img")). klikk ();// Klikk på iframeSystem.out.println ("********* Vi er ferdige **************");}}

Produksjon:

Nettleseren navigerer til siden som består av iframe ovenfor og klikker på iframe.

Bytt til rammen med Web Element:

Vi kan til og med bytte til iframe ved hjelp av webelement.

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

Hvordan bytte tilbake til hovedrammen

Vi må komme ut av iframe.

For å gå tilbake til foreldrerammen, kan du enten bruke switchTo (). ParentFrame () eller hvis du vil gå tilbake til hovedrammen (eller de fleste foreldre), kan du bruke switchTo (). StandardContent ();

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

Hvordan bytte over rammen, hvis vi IKKE kan bytte ved hjelp av ID eller Web Element:

Anta at hvis det er 100 rammer på siden, og det ikke er noen ID tilgjengelig, i dette tilfellet, vet vi bare ikke fra hvilket iframe-nødvendig element som lastes inn (Det er tilfelle når vi ikke kjenner rammenes indeks også).

Løsningen for ovennevnte bekymring er at vi må finne indeksen til iframe som elementet lastes gjennom, og da må vi bytte til iframe gjennom indeksen.

Nedenfor er trinnene for å finne indeksen til rammen som elementet lastes ved hjelp av, under utdraget

Trinn 1)

WebDriver-driver = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). vindu (). maksimere ();
  • Initialiser Firefox-driveren.
  • Naviger til "guru99" -siden som består av iframe.
  • Maksimerte vinduet.

Steg 2)

int size = driver.findElements (By.tagName ("iframe")). size ();
  • Ovennevnte kode finner det totale antallet iframes som er tilstede på siden ved hjelp av tagnamnet 'iframe'.

Trinn 3)

Målet for dette trinnet ville være å finne ut indeksen til iframe.

for (int i = 0; i <= størrelse; i ++) {driver.switchTo (). ramme (i);int total = driver.findElements (By.xpath ("html / body / a / img")). størrelse ();System.out.println (totalt);driver.switchTo (). defaultContent ();}

Over "forloop" gjentas alle iframes på siden, og den skriver "1" hvis den nødvendige iframe ble funnet ellers returnerer "0".

Her er den komplette koden til trinn 3:

offentlig klasse IndexOfIframe {public static void main (String [] args) {WebDriver-driver = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). vindu (). maksimere ();//driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();for (int i = 0; i <= størrelse; i ++) {driver.switchTo (). ramme (i);int total = driver.findElements (By.xpath ("html / body / a / img")). størrelse ();System.out.println (totalt);driver.switchTo (). defaultContent ();}}}

Utfør dette programmet og utdataene vil være som nedenfor:

Produksjon:

100000
Bekreft utgangen, du kan finne serien 0 og 1.
  • Uansett hvor du finner '1' i utdata som er indeksen til rammen som elementet lastes etter.
  • Siden indeksen for iframe starter med '0' hvis du finner en i en st sted, da indeksen er 0.
  • Hvis du finner 1 på tredje plass, er indeksen 2.
Vi kan kommentere for loop når vi fant indeksen. Trinn 4)
driver.switchTo (). ramme (0); 
  • Når du har funnet indeksen til elementet, kan du bytte over rammen ved å bruke kommandoen ovenfor.
  • driver.switchTo (). ramme (indeks funnet fra trinn 3);
Trinn 5)
driver.findElement (By.xpath ("html / body / a / img")). klikk ();
  • Ovennevnte kode klikker på iframe eller element i iframe.
Så den komplette koden vil være som nedenfor:
offentlig klasse SwitchToframe {public static void main (String [] args) kaster NoSuchElementException {WebDriver-driver = ny FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). vindu (). maksimere ();// int size = driver.findElements (By.tagName ("iframe")). size ();/ * for (int i = 0; i <= størrelse; i ++) {driver.switchTo (). ramme (i);int total = driver.findElements (By.xpath ("html / body / a / img")). størrelse ();System.out.println (totalt);driver.switchTo (). defaultContent (); // bytte tilbake fra iframe} * /// Kommenterte koden for å finne indeksen til elementetdriver.switchTo (). ramme (0); // Bytte til rammenSystem.out.println ("******** Vi byttes til iframe *******");driver.findElement (By.xpath ("html / body / a / img")). klikk ();// Klikk på elementet i tråd med AnnonseSystem.out.println ("********* Vi er ferdige **************");}}
Utgang: Nettleseren navigerer til siden som består av iframe ovenfor og klikker på iframe.

Konseptet med nestede rammer (rammer innenfor rammer):

La oss anta at det er to rammer hverandre som vist på bildet nedenfor, og vårt krav er å skrive ut teksten i den ytre rammen og den indre rammen. Når det gjelder nestede rammer,
  • Først må vi bytte til den ytre rammen med enten indeks eller ID for iframe
  • Når vi bytter til den ytre rammen, kan vi finne det totale antallet iframes inne i den ytre rammen, og
  • Vi kan bytte til den indre rammen ved hjelp av en av de kjente metodene.
Mens vi går ut av rammen, må vi gå ut i samme rekkefølge som vi gikk inn i den fra den indre rammen først og deretter den ytre rammen.
Nestede iFrames i Selenium WebDriver

Html-koden for den nestede rammen er som vist nedenfor.

Ovennevnte HTML-kode forklarer tydelig iframe-taggen (uthevet i grønt) i en annen iframe-tag, noe som indikerer tilstedeværelse av nestede iframes.

Nedenfor er trinnene for å bytte til ytre ramme og skrive ut teksten på ytre rammer: Trinn 1)

WebDriver-driver = ny FirefoxDriver ();driver.get ("Url");driver.manage (). vindu (). maksimere ();driver.manage (). timeouts (). implicitWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Totale rammer -" + størrelse);// skriver ut totalt antall bilderdriver.switchTo (). ramme (0); // Bytte av den ytre rammenSystem.out.println (driver.findElement (By.xpath ("xpath of the outer element")). GetText ()); 
  • Bytt til den ytre rammen.
  • Skriver ut teksten på den ytre rammen.

Når vi bytter til den ytre rammen, bør vi vite om noen indre ramme er inne i den ytre rammen

Steg 2)

størrelse = driver.findElements (By.tagName ("iframe")). størrelse ();// skriver ut totalt antall rammer innenfor ytre rammeSystem.out.println ("Totale rammer -" + størrelse);
  • Finner det totale antallet iframes innenfor den ytre rammen.
  • Hvis størrelsen ble funnet '0', er det ingen indre ramme inne i rammen.
Trinn 3)
driver.switchTo (). ramme (0); // Bytte til innerrammeSystem.out.println (driver.findElement (By.xpath ("xpath of the inner element")). GetText ());
  • Bytt til den indre rammen
  • Skriver ut teksten på den indre rammen.
Her er den komplette koden:
offentlig klasse FramesInsideFrames {public static void main (String [] args) {WebDriver-driver = ny FirefoxDriver ();driver.get ("Url");driver.manage (). vindu (). maksimere ();driver.manage (). timeouts (). implicitWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Totale rammer -" + størrelse);// skriver ut totalt antall bilderdriver.switchTo (). ramme (0); // Bytte av den ytre rammenSystem.out.println (driver.findElement (By.xpath ("xpath of the outer element")). GetText ());// Skrive ut teksten i ytterrammenstørrelse = driver.findElements (By.tagName ("iframe")). størrelse ();// skriver ut totalt antall rammer innenfor ytre rammeSystem.out.println ("Totale rammer -" + størrelse);driver.switchTo (). ramme (0); // Bytte til innerrammeSystem.out.println (driver.findElement (By.xpath ("xpath of the inner element")). GetText ());// Skrive ut teksten i indre rammedriver.switchTo (). defaultContent ();}}
Utgang : Utdataene fra ovennevnte kode vil skrive ut teksten i den indre rammen og den ytre rammen.