Hoe om te gaan met iFrames in Selenium Webdriver: switchTo ()

Inhoudsopgave:

Anonim

iFrame in Selenium Webdriver

iFrame in Selenium Webdriver is een webpagina of een inline frame dat is ingesloten in een andere webpagina of een HTML-document dat is ingesloten in een ander HTML-document. Het iframe wordt vaak gebruikt om inhoud uit andere bronnen, zoals een advertentie, toe te voegen aan een webpagina. Het iframe wordt gedefinieerd met de < iframe > -tag.

In deze tutorial leer je -

  1. Hoe het iframe te identificeren:
  2. Hoe schakel je de elementen in iframes om met behulp van Web Driver-opdrachten:
  3. Concept van geneste frames (frames in frames):

Hoe het iframe te identificeren:

We kunnen de frames niet detecteren door alleen de pagina te zien of door Firebug te inspecteren.

Bekijk de onderstaande afbeelding. Advertentie die wordt weergegeven is een Iframe, we kunnen dat niet vinden of herkennen door alleen te inspecteren met Firebug. Dus de vraag is hoe kun je het iframe identificeren?

Hoe het iframe te identificeren met Selenium WebDriver

We kunnen de frames in Selenium identificeren met behulp van de onderstaande methoden:

  • Klik met de rechtermuisknop op het element, als u de optie vindt zoals 'Dit frame', dan is het een iframe. (Raadpleeg het bovenstaande diagram)
  • Klik met de rechtermuisknop op de pagina en klik op 'Paginabron weergeven' en zoek met het 'iframe'. Als u een tagnaam met het 'iframe' kunt vinden, betekent dit dat de pagina een iframe is.

In het bovenstaande diagram kunt u zien dat de optie ' Dit frame ' beschikbaar is door met de rechtermuisknop te klikken, dus we zijn er nu zeker van dat het een iframe is.

We kunnen zelfs het totale aantal iframes identificeren door het onderstaande fragment te gebruiken.

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

Hoe u de elementen in iframes kunt omschakelen met behulp van Web Driver-opdrachten:

In principe kunnen we de elementen omschakelen en frames in Selenium op 3 manieren behandelen.

  • Door Index
  • Op naam of id
  • Door webelement

Overschakelen naar het frame op index:

Index is een van de attributen voor framehandeling in Selenium waarmee we ernaar kunnen overschakelen.

Index van het iframe begint met '0'.

Stel dat als er 100 frames op de pagina staan, we kunnen overschakelen naar frame in Selenium door index te gebruiken.

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

Schakel over naar het frame op naam of ID:

Naam en ID zijn attributen voor het afhandelen van frames in Selenium waarmee we kunnen overschakelen naar het iframe.

  • driver.switchTo (). frame ("iframe1");
  • driver.switchTo (). frame ("id van het element");

Voorbeeld van overschakelen naar iframe via ID:

Laten we een voorbeeld nemen om van frame te wisselen in Selenium weergegeven in de onderstaande afbeelding. Onze vereiste is om op het iframe te klikken.

We hebben toegang tot dit iframe via de onderstaande URL: http: //demo.guru99.com/test/guru99home/

Het is onmogelijk om rechtstreeks via XPath op iframe te klikken, aangezien het een iframe is. Eerst moeten we naar het frame overschakelen en dan kunnen we klikken met xpath.

Stap 1)

WebDriver-stuurprogramma = nieuwe FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximaliseren ();
  • We initialiseren de Firefox-driver.
  • Navigeer naar de "guru99" -site die het iframe bevat.
  • Maximaliseer het raam.

Stap 2)

driver.switchTo (). frame ("a077aa5e");
  • In deze stap moeten we de id van het iframe achterhalen door te inspecteren via Firebug.
  • Schakel vervolgens via ID over naar het iframe.

Stap 3)

driver.findElement (By.xpath ("html / body / a / img")). klik ();
  • Hier moeten we het xpath van het element waarop moet worden geklikt, achterhalen.
  • Klik op het element met de bovenstaande opdracht voor het webstuurprogramma.

Hier is de volledige code:

openbare klasse SwitchToFrame_ID {public static void main (String [] args) {WebDriver-stuurprogramma = nieuwe FirefoxDriver (); // navigeert naar de browserdriver.get ("http://demo.guru99.com/test/guru99home/");// navigeert naar de pagina met een iframedriver.manage (). window (). maximaliseren ();driver.switchTo (). frame ("a077aa5e"); // wisselen van frame op IDSystem.out.println ("******** We gaan over naar het iframe *******");driver.findElement (By.xpath ("html / body / a / img")). klik ();// Klikt op het iframeSystem.out.println ("********* We zijn klaar ***************");​​

Uitgang:

De browser navigeert naar de pagina met het bovenstaande iframe en klikt op het iframe.

Schakel over naar het frame via webelement:

We kunnen zelfs overschakelen naar het iframe met behulp van een webelement.

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

Terugschakelen naar het hoofdframe

We moeten uit het iframe komen.

Om terug te gaan naar het bovenliggende frame, kunt u switchTo (). ParentFrame () gebruiken of als u terug wilt naar het hoofdframe (of het meeste bovenliggende frame), kunt u switchTo (). DefaultContent ();

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

Hoe het frame om te schakelen, als we NIET KUNNEN schakelen met ID of Web Element:

Stel dat als de pagina 100 frames bevat en er is geen ID beschikbaar, we in dit geval gewoon niet weten van welk iframe vereist element wordt geladen (dit is het geval wanneer we de index van het frame niet kennen). ook).

De oplossing voor de bovenstaande zorg is dat we de index moeten vinden van het iframe waardoor het element wordt geladen en dat we vervolgens via de index naar het iframe moeten overschakelen.

Hieronder staan ​​de stappen voor het vinden van de index van het frame waarmee het element wordt geladen door het onderstaande fragment te gebruiken

Stap 1)

WebDriver-stuurprogramma = nieuwe FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximaliseren ();
  • Initialiseer de Firefox-driver.
  • Navigeer naar de "guru99" -site die het iframe bevat.
  • Maximaliseer het raam.

Stap 2)

int size = driver.findElements (By.tagName ("iframe")). size ();
  • De bovenstaande code vindt het totale aantal iframes dat aanwezig is op de pagina met behulp van de tagnaam 'iframe'.

Stap 3)

Het doel van deze stap zou zijn om de index van iframe te achterhalen.

voor (int i = 0; i <= size; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (totaal);driver.switchTo (). defaultContent ();}

Boven "forloop" itereert alle iframes op de pagina en het drukt '1' af als ons vereiste iframe werd gevonden, anders retourneert '0'.

Hier is de volledige code tot stap 3:

openbare klasse IndexOfIframe {public static void main (String [] args) {WebDriver-stuurprogramma = nieuwe FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximaliseren ();//driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();voor (int i = 0; i <= size; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (totaal);driver.switchTo (). defaultContent ();}}}

Voer dit programma uit en de output zou er als volgt uitzien:

Uitgang:

100000
Controleer de uitvoer, u kunt de reeks nullen en enen vinden.
  • Waar je ook de '1' in uitvoer vindt, dat is de index van Frame waarmee het element wordt geladen.
  • Aangezien de index van de iframe begint met '0' als u de 1 vinden in de 1 ste plaats, dan de index 0.
  • Als je merkt dat 1 op de 3 e plaats, de index 2.
We kunnen de for-lus becommentariëren zodra we de index hebben gevonden. Stap 4)
driver.switchTo (). frame (0); 
  • Zodra je de index van het element hebt gevonden, kun je het frame omschakelen met het bovenstaande commando.
  • driver.switchTo (). frame (index gevonden in stap 3);
Stap 5)
driver.findElement (By.xpath ("html / body / a / img")). klik ();
  • De bovenstaande code klikt op het iframe of element in het iframe.
Dus de volledige code zou er als volgt uitzien:
openbare klasse SwitchToframe {public static void main (String [] args) gooit NoSuchElementException {WebDriver-stuurprogramma = nieuwe FirefoxDriver ();driver.get ("http://demo.guru99.com/test/guru99home/");driver.manage (). window (). maximaliseren ();// int size = driver.findElements (By.tagName ("iframe")). size ();/ * voor (int i = 0; i <= size; i ++) {driver.switchTo (). frame (i);int total = driver.findElements (By.xpath ("html / body / a / img")). size ();System.out.println (totaal);driver.switchTo (). defaultContent (); // terugschakelen van het iframe​// Heeft commentaar gegeven op de code voor het vinden van de index van het elementdriver.switchTo (). frame (0); // Overschakelen naar het frameSystem.out.println ("******** We zijn overgeschakeld naar het iframe *******");driver.findElement (By.xpath ("html / body / a / img")). klik ();// Klikken op het element in lijn met AdvertentieSystem.out.println ("********* We zijn klaar ***************");​​
Uitvoer: de browser navigeert naar de pagina met het bovenstaande iframe en klikt op het iframe.

Concept van geneste frames (frames in frames):

Laten we aannemen dat er twee frames in elkaar zijn, zoals weergegeven in de onderstaande afbeelding, en onze vereiste is om de tekst in het buitenste frame en het binnenframe af te drukken. In het geval van geneste frames,
  • In eerste instantie moeten we overschakelen naar het buitenste frame door ofwel Index of ID van het iframe
  • Zodra we overschakelen naar het buitenste frame, kunnen we het totale aantal iframes binnen het buitenste frame vinden, en
  • We kunnen op elk van de bekende methoden overschakelen naar het binnenframe.
Bij het verlaten van het frame, moeten we het frame verlaten in dezelfde volgorde als waarin we het eerst vanuit het binnenframe en vervolgens het buitenframe zijn binnengegaan.
Geneste iFrames in Selenium WebDriver

De HTML-code voor het bovenstaande geneste frame is zoals hieronder weergegeven.

De bovenstaande HTML-code legt duidelijk de iframe-tag (groen gemarkeerd) binnen een andere iframe-tag uit, wat de aanwezigheid van geneste iframes aangeeft.

Hieronder staan ​​de stappen voor het overschakelen naar het buitenste frame en het afdrukken van de tekst op de buitenste frames: Stap 1)

WebDriver-stuurprogramma = nieuwe FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximaliseren ();driver.manage (). time-outs (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Total Frames -" + grootte);// drukt het totale aantal frames afdriver.switchTo (). frame (0); // Omschakelen van het buitenste frameSystem.out.println (driver.findElement (By.xpath ("xpath van het buitenste element")). GetText ()); 
  • Schakel over naar het buitenste frame.
  • Drukt de tekst af op het buitenste frame.

Zodra we overschakelen naar het buitenframe, moeten we weten of er een binnenframe aanwezig is in het buitenframe

Stap 2)

size = driver.findElements (By.tagName ("iframe")). size ();// drukt het totale aantal frames binnen het buitenframe afSystem.out.println ("Total Frames -" + grootte);
  • Vindt het totale aantal iframes in het buitenste frame.
  • Als maat '0' is gevonden, zit er geen binnenframe in het frame.
Stap 3)
driver.switchTo (). frame (0); // Overschakelen naar innerframeSystem.out.println (driver.findElement (By.xpath ("xpath van het innerlijke element")). GetText ());
  • Schakel over naar het binnenframe
  • Drukt de tekst af op het binnenframe.
Hier is de volledige code:
openbare klasse FramesInsideFrames {public static void main (String [] args) {WebDriver-stuurprogramma = nieuwe FirefoxDriver ();driver.get ("Url");driver.manage (). window (). maximaliseren ();driver.manage (). time-outs (). implicitlyWait (2, TimeUnit.SECONDS);int size = driver.findElements (By.tagName ("iframe")). size ();System.out.println ("Total Frames -" + grootte);// drukt het totale aantal frames afdriver.switchTo (). frame (0); // Omschakelen van het buitenste frameSystem.out.println (driver.findElement (By.xpath ("xpath van het buitenste element")). GetText ());// Afdrukken van de tekst in buitenkadersize = driver.findElements (By.tagName ("iframe")). size ();// drukt het totale aantal frames binnen het buitenframe afSystem.out.println ("Total Frames -" + grootte);driver.switchTo (). frame (0); // Overschakelen naar innerframeSystem.out.println (driver.findElement (By.xpath ("xpath van het innerlijke element")). GetText ());// De tekst in binnenkader afdrukkendriver.switchTo (). defaultContent ();​​
Uitvoer : De uitvoer van de bovenstaande code zou de tekst in het binnenste frame en buitenste frame afdrukken.