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

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, aan een webpagina toe te voegen. Het iframe wordt gedefinieerd met deiframe> labelen.

Hoe het iFrame te identificeren

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

Bekijk de onderstaande afbeelding. De weergegeven advertentie is een Iframe. We kunnen dit niet lokaliseren of herkennen door alleen maar te inspecteren met Firebug. De vraag is dus: hoe kun je het iframe identificeren?

Identificeer het iframe
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 'Dit frame' vindt, dan is het een iframe. (Zie 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 uit een iframe bestaat.

In het bovenstaande diagram kun je zien dat 'Dit kader' optie is beschikbaar als u met de rechtermuisknop klikt, dus we weten nu zeker 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 om te gaan met frames in Selenium met behulp van WebDriver-opdrachten

In principe kunnen we op 3 manieren de elementen omwisselen en frames in Selenium verwerken.

  • op index
  • Op naam of ID
  • Door WebElement

Methode 1: Schakel over naar het frame per index

Index is een van de attributen voor frameafhandeling 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 in Selenium naar frame kunnen overschakelen met behulp van index.

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

Methode 2: Schakel naar het frame op naam of ID

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

  • driver.switchTo().frame("iframe1");
  • driver.switchTo().frame("id of the element");

Voorbeeld van overschakelen naar iframe via ID:

aan het frame door Web Element

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

Behandel frames in Selenium met behulp van WebDriver-opdrachten

Het is onmogelijk om iframe rechtstreeks door te klikken XPath omdat het een iframe is. Eerst moeten we overschakelen naar het frame en dan kunnen we klikken met xpath.

Stap 1)

WebDriver driver = new FirefoxDriver();

driver.get("https://demo.guru99.com/test/guru99home/");

driver.manage().window().maximize();

  • Wij initialiseren de Firefox bestuurder.
  • Navigeer naar de “guru99” -site die het iframe bevat.
  • Het venster gemaximaliseerd.

Stap 2)

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

Stap 3)

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

Hier is de volledige code:

public class SwitchToFrame_ID {
public static void main(String[] args) {

		WebDriver driver = new FirefoxDriver(); //navigates to the Browser
	    driver.get("https://demo.guru99.com/test/guru99home/"); 
	       // navigates to the page consisting an iframe

	       driver.manage().window().maximize();
	       driver.switchTo().frame("a077aa5e"); //switching the frame by ID

			System.out.println("********We are switch to the iframe*******");
     		driver.findElement(By.xpath("html/body/a/img")).click();
  		    //Clicks the iframe
       
  			System.out.println("*********We are done***************");
      }
}		

Output:

Browser navigeert naar de pagina die bestaat uit het bovenstaande iframe en klikt op het iframe.

Methode 3: Schakel over naar het frame via Web Element

We kunnen zelfs overschakelen naar het iframe met behulp van 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. 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 over te schakelen, als we NIET KUNNEN schakelen met ID of Web Element:

Stel dat er 100 frames op de pagina staan ​​en er geen ID beschikbaar is, dan weten we in dit geval gewoon niet van welk iframe het vereiste element wordt geladen (dit is het geval wanneer we de index van het frame niet kennen Ook).

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

Hieronder vindt u de stappen voor het vinden van de index van het frame waarmee het element wordt geladen met behulp van het onderstaande fragment

Stap 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Initialiseer de Firefox bestuurder.
  • Navigeer naar de “guru99” -site die het iframe bevat.
  • Het venster gemaximaliseerd.

Stap 2)

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

Stap 3)

Doelstelling voor deze stap zou het vinden van de index van iframe zijn.

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(total);
	    driver.switchTo().defaultContent();}

Bovenstaande “forloop” herhaalt alle iframes op de pagina en drukt '1' af als ons vereiste iframe werd gevonden, anders retourneert het '0'.

Hier is de volledige code tot stap 3:

public class IndexOfIframe {
public static void main(String[] args) {
	    WebDriver driver = new FirefoxDriver();
	    driver.get("https://demo.guru99.com/test/guru99home/");  
	    driver.manage().window().maximize();
	    //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(total);
	    driver.switchTo().defaultContent();}}}

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

Output:

1
0
0
0	
0
0

Controleer de uitvoer, u kunt de reeks nullen en enen vinden.

  • Waar u ook de '1' in de uitvoer vindt, dat is de index van Frame waarmee het element wordt geladen.
  • Omdat de index van het iframe begint met '0' als je de 1 in de 1 vindtstplaats, dan is de index 0.
  • Als je 1 op 3 vindtrd plaats, de index is 2.

We kunnen de for-lus becommentariëren zodra we de index hebben gevonden.

Stap 4)

driver.switchTo().frame(0);
  • Zodra u de index van het element heeft gevonden, kunt u met de bovenstaande opdracht overschakelen naar het frame.
  • driver.switchTo().frame(index gevonden uit stap 3);

Stap 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • De bovenstaande code klikt op het iframe of element in het iframe.

Dus de volledige code zou er als volgt uitzien:

public class SwitchToframe   {
public static void main(String[] args) throws NoSuchElementException{
	    WebDriver driver = new FirefoxDriver();
	    driver.get("https://demo.guru99.com/test/guru99home/");  
	    driver.manage().window().maximize();
	    //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(total);
	    driver.switchTo().defaultContent(); //switching back from the iframe
	 }*/
	            
		//Commented the code for finding the index of the element
	    driver.switchTo().frame(0); //Switching to the frame
		System.out.println("********We are switched to the iframe*******");
		driver.findElement(By.xpath("html/body/a/img")).click();
		
		//Clicking the element in line with Advertisement
	    System.out.println("*********We are done***************");
	        }
	    }

Output:

Browser navigeert naar de pagina die bestaat uit het bovenstaande iframe en klikt op het iframe.

Concept van geneste frames in selenium

Laten we aannemen dat er twee frames in elkaar zitten, zoals weergegeven in de onderstaande afbeelding, en onze eis is het afdrukken van de tekst in het buitenste frame en het binnenste frame.

In het geval van geneste frames,

  • In eerste instantie moeten we naar het buitenste frame overschakelen via Index of ID van het iframe
  • Zodra we naar het buitenste frame overschakelen, kunnen we het totale aantal iframes binnen het buitenste frame vinden, en
  • We kunnen op een van de bekende manieren naar het binnenframe overschakelen.

Terwijl we het frame verlaten, moeten we het frame verlaten in dezelfde volgorde als waarin we het eerst vanuit het binnenframe en vervolgens het buitenframe binnengingen.

Concept van geneste frames in selenium
Geneste iFrames in Selenium WebDriver

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

Concept van geneste frames in selenium

In de bovenstaande HTML-code wordt duidelijk de iframe-tag (groen gemarkeerd) binnen een andere iframe-tag uitgelegd, wat de aanwezigheid van geneste iframes aangeeft.

Hieronder vindt u de stappen voor het overschakelen naar het buitenframe en het afdrukken van de tekst op de buitenframes:

Stap 1)

	WebDriver driver=new FirefoxDriver();
	    driver.get("Url");
	    driver.manage().window().maximize();
	    driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
	    int size = driver.findElements(By.tagName("iframe")).size();
	    System.out.println("Total Frames --" + size);
	    
		// prints the total number of frames 
		driver.switchTo().frame(0); // Switching the Outer Frame    		
	    System.out.println (driver.findElement(By.xpath("xpath of the outer element ")).getText());
  • Schakel over naar het buitenste frame.
  • Drukt de tekst af op het buitenframe.

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();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • Vindt het totale aantal iframes binnen het buitenste frame.
  • Als maat '0' is gevonden, zit er geen binnenframe in het frame.

Stap 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • Ga naar het binnenframe
  • Drukt de tekst af op het binnenframe.

Hier is de volledige code:

public class FramesInsideFrames {
public static void main(String[] args) {
WebDriver driver=new FirefoxDriver();
	    driver.get("Url");
	    driver.manage().window().maximize();
	    driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);

	    int size = driver.findElements(By.tagName("iframe")).size();
	    System.out.println("Total Frames --" + size);
               
		// prints the total number of frames 
		driver.switchTo().frame(0); // Switching the Outer Frame    		
	    System.out.println (driver.findElement(By.xpath("xpath of the outer element ")).getText());

		//Printing the text in outer frame
		size = driver.findElements(By.tagName("iframe")).size();
	    // prints the total number of frames inside outer frame           
                                                                                                          
	    System.out.println("Total Frames --" + size);
	    driver.switchTo().frame(0); // Switching to innerframe
	    System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
		
		//Printing the text in inner frame
		driver.switchTo().defaultContent();
	}
}

uitgang:

De uitvoer van de bovenstaande code zou de tekst in het binnenframe en het buitenframe afdrukken.