Sådan håndteres iFrames i Selenium Webdriver: switchTo()

iFrame ind Selenium Webdriver

iFrame ind Selenium Webdriver er en webside eller en inline-ramme, som er indlejret i en anden webside eller et HTML-dokument, der er indlejret i et andet HTML-dokument. Iframen bruges ofte til at tilføje indhold fra andre kilder som en annonce til en webside. iframen er defineret mediframe> tag.

Sådan identificeres iFrame

Vi kan ikke registrere rammerne ved blot at se siden eller ved at inspicere Firebug.

Bemærk billedet nedenfor. Annoncen, der vises, er en iframe, vi kan ikke finde eller genkende det ved blot at inspicere ved hjælp af Firebug. Så spørgsmålet er, hvordan kan du identificere iframen?

Identificer iframen
Sådan identificerer du iframen ved hjælp af Selenium webdriver

Vi kan identificere rammerne i Selenium ved hjælp af nedenstående metoder:

  • Højreklik på elementet, hvis du finder muligheden som 'Denne ramme', så er det en iframe.(Se venligst ovenstående diagram)
  • Højreklik på siden og klik på 'Vis sidekilde' og søg med 'iframe', hvis du kan finde et tagnavn med 'iframe', så betyder det at sige siden, der består af en iframe.

I ovenstående diagram kan du se, at 'Denne ramme' mulighed er tilgængelig ved højreklik, så vi er nu sikre på, at det er en iframe.

Vi kan endda identificere det samlede antal iframes ved at bruge nedenstående kodestykke.

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

Sådan håndteres rammer i Selenium ved hjælp af WebDriver-kommandoer

Som udgangspunkt kan vi skifte elementerne og håndtere rammer ind Selenium ved hjælp af 3 måder.

  • Efter indeks
  • Ved navn eller id
  • Efter webelement

Metode 1: Skift til ramme efter indeks

Indeks er en af ​​attributterne til rammehåndtering i Selenium hvorigennem vi kan skifte til det.

Indeks for iframen starter med '0'.

Antag, at hvis der er 100 rammer på siden, kan vi skifte til ramme ind Selenium ved at bruge indeks.

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

Metode 2: Skift til rammen efter navn eller id

Navn og ID er attributter til håndtering af rammer i Selenium hvorigennem vi kan skifte til iframen.

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

Eksempel på skift til iframe via ID:

til rammen af ​​Web Element

Vi kan få adgang til denne iframe via nedenstående URL: https://demo.guru99.com/test/guru99home/

Håndtag rammer ind Selenium Brug af WebDriver-kommandoer

Det er umuligt at klikke iframe direkte igennem XPath da det er en iframe. Først skal vi skifte til rammen og derefter kan vi klikke ved hjælp af xpath.

Trin 1)

WebDriver driver = new FirefoxDriver();

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

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

  • Vi initialiserer Firefox chauffør.
  • Naviger til webstedet "guru99", som består af iframen.
  • Maksimerede vinduet.

Trin 2)

driver.switchTo().frame("a077aa5e");
  • I dette trin skal vi finde ud af iframens id ved at inspicere gennem Firebug.
  • Skift derefter til iframen via ID.

Trin 3)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Her skal vi finde ud af xpath for det element, der skal klikkes på.
  • Klik på elementet ved hjælp af webdriver-kommandoen vist ovenfor.

Her er den komplette kode:

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 navigerer til siden, der består af ovenstående iframe og klikker på iframen.

Metode 3: Skift til rammen med webelement

Vi kan endda skifte til iframe ved hjælp af webelement.

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

Sådan skifter du tilbage til hovedrammen

Vi skal ud af iframen.

For at flytte tilbage til den overordnede ramme kan du enten bruge switchTo().parentFrame() eller hvis du vil vende tilbage til hovedrammen (eller mest overordnet), kan du bruge switchTo().defaultContent();

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

Sådan skifter du rammen, hvis vi IKKE KAN skifte ved hjælp af ID eller webelement:

Antag, at hvis der er 100 rammer på siden, og der ikke er noget ID tilgængeligt, ved vi i dette tilfælde bare ikke, fra hvilket iframe-krævet element, der indlæses (Det er tilfældet, når vi ikke kender indekset for rammen også).

Løsningen på ovenstående bekymring er, at vi skal finde indekset for den iframe, hvorigennem elementet indlæses, og derefter skal vi skifte til iframen gennem indekset.

Nedenfor er trinene til at finde indekset for den ramme, som elementet indlæses ved hjælp af nedenstående uddrag

Trin 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Initialiser Firefox chauffør.
  • Naviger til webstedet "guru99", som består af iframen.
  • Maksimerede vinduet.

Trin 2)

int size = driver.findElements(By.tagName("iframe")).size();
  • Ovenstående kode finder det samlede antal iframes på siden ved hjælp af tagnavnet 'iframe'.

Trin 3)

Mål for dette trin ville være at finde ud af indekset for iframe.

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();}

Ovenfor gentager "forloop" alle iframes på siden, og den udskriver '1', hvis vores nødvendige iframe blev fundet, ellers returnerer '0'.

Her er den komplette kode indtil trin 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();}}}

Udfør dette program, og output vil være som nedenfor:

Output:

1
0
0
0	
0
0

Bekræft outputtet, du kan finde rækken af ​​0'er og 1'er.

  • Uanset hvor du finder '1' i output, er det indekset for Frame, som elementet indlæses med.
  • Da indekset for iframen starter med '0', hvis du finder 1'eren i 1'erenststed, så er indekset 0.
  • Hvis du finder 1 ud af 3rd plads er indekset 2.

Vi kan kommentere for-løkken, når vi har fundet indekset.

Trin 4)

driver.switchTo().frame(0);
  • Når du har fundet elementets indeks, kan du skifte over rammen ved at bruge ovenstående kommando.
  • driver.switchTo().frame(indeks fundet fra trin 3);

Trin 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Ovenstående kode vil klikke på iframen eller elementet i iframen.

Så den komplette kode ville være som nedenfor:

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 navigerer til siden, der består af ovenstående iframe og klikker på iframen.

Koncept med indlejrede rammer i Selenium

Lad os antage, at der er to rammer, den ene inde i den anden, som vist på billedet nedenfor, og vores krav er at udskrive teksten i den ydre ramme og den indre ramme.

I tilfælde af indlejrede rammer,

  • Først skal vi skifte til den ydre ramme ved enten Index eller ID af iframen
  • Når vi skifter til den ydre ramme, kan vi finde det samlede antal iframes inde i den ydre ramme, og
  • Vi kan skifte til den indre ramme ved enhver af de kendte metoder.

Mens vi går ud af rammen, skal vi gå ud i samme rækkefølge, som vi kom ind i den fra den indre ramme først og derefter den ydre ramme.

Html-koden for ovenstående indlejrede ramme er som vist nedenfor.

Koncept med indlejrede rammer i Selenium

Ovenstående HTML-kode forklarer tydeligt iframe-tagget (fremhævet med grønt) i et andet iframe-tag, hvilket indikerer tilstedeværelsen af ​​indlejrede iframes.

Nedenfor er trinene til at skifte til ydre ramme og udskrive teksten på ydre rammer:

Trin 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());
  • Skift til den ydre ramme.
  • Udskriver teksten på yderramme.

Når vi skifter til den ydre ramme, bør vi vide, om der er nogen indre ramme inde i den ydre ramme

Trin 2)

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • Finder det samlede antal iframes inde i den ydre ramme.
  • Hvis størrelsen blev fundet '0', er der ingen indre ramme inde i rammen.

Trin 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • Skift til den indvendige ramme
  • Udskriver teksten på den indvendige ramme.

Her er den komplette kode:

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();
	}
}

Produktion:

Outputtet af ovenstående kode ville udskrive teksten i den indre ramme og den ydre ramme.

Læs mere Læs mere