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?

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/
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.
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.