Kako rukovati iFrame-ovima u Selenium Webdriver: switchTo()
iFrame u Selenium Webdriver
iFrame u Selenium Webdriver je web stranica ili umetnuti okvir koji je ugrađen u drugu web stranicu ili HTML dokument ugrađen unutar drugog HTML dokumenta. Iframe se često koristi za dodavanje sadržaja iz drugih izvora poput oglasa na web stranicu. iframe je definiran siframe> oznaka.
Kako prepoznati iFrame
Ne možemo otkriti okvire samo gledajući stranicu ili pregledavajući Firebug.
Pogledajte sliku u nastavku, oglas koji se prikazuje je iframe, ne možemo ga locirati ili prepoznati samo pregledom pomoću Firebuga. Dakle, pitanje je kako možete identificirati iframe?

Možemo identificirati okvire u Selenium pomoću dolje navedenih metoda:
- Kliknite desnom tipkom na element, ako pronađete opciju kao što je "Ovaj okvir", onda je to iframe. (Pogledajte gornji dijagram)
- Desnom tipkom miša kliknite na stranicu i kliknite na 'View Page Source' i Pretražite s 'iframeom', ako možete pronaći bilo koji naziv oznake s 'iframeom' onda to znači da se stranica sastoji od iframea.
Na gornjem dijagramu možete vidjeti da 'Ovaj okvir' opcija je dostupna desnim klikom, tako da smo sada sigurni da se radi o iframeu.
Možemo čak identificirati ukupan broj iframeova pomoću donjeg isječka.
Int size = driver.findElements(By.tagName("iframe")).size();
Kako rukovati okvirima u Selenium pomoću WebDriver naredbi
U osnovi, možemo prebacivati elemente i rukovati okvirima Selenium pomoću 3 načina.
- Prema Indeksu
- Po imenu ili ID-u
- Po web elementu
Metoda 1: Prebacivanje na okvir prema indeksu
Indeks je jedan od atributa za rukovanje okvirom Selenium preko koje se možemo prebaciti na njega.
Indeks iframea počinje s '0'.
Pretpostavimo da ako stranica ima 100 okvira, možemo se prebaciti na okvir unutar Selenium pomoću indeksa.
driver.switchTo().frame(0);
driver.switchTo().frame(1);
Metoda 2: Prebacivanje na okvir prema imenu ili ID-u
Naziv i ID su atributi za rukovanje okvirima Selenium preko koje se možemo prebaciti na iframe.
driver.switchTo().frame("iframe1");
driver.switchTo().frame("id of the element");
Primjer prebacivanja na iframe putem ID-a:
na okvir putem Web elementa
Ovom iframeu možemo pristupiti putem ovog URL-a u nastavku: https://demo.guru99.com/test/guru99home/
Nemoguće je izravno kliknuti iframe XPath budući da je iframe. Prvo se moramo prebaciti na okvir, a zatim možemo kliknuti koristeći xpath.
Korak 1)
WebDriver driver = new FirefoxDriver(); driver.get("https://demo.guru99.com/test/guru99home/"); driver.manage().window().maximize();
- Inicijaliziramo Firefox vozač.
- Idite na web mjesto "guru99" koje se sastoji od iframea.
- Maksimizirao prozor.
Korak 2)
driver.switchTo().frame("a077aa5e");
- U ovom koraku moramo saznati id iframea pregledom kroz Firebug.
- Zatim prijeđite na iframe putem ID-a.
Korak 3)
driver.findElement(By.xpath("html/body/a/img")).click();
- Ovdje moramo saznati xpath elementa na koji treba kliknuti.
- Pritisnite gore prikazani element pomoću naredbe web upravljačkog programa.
Evo kompletnog koda:
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***************"); } }
Izlaz:
Preglednik prelazi na stranicu koja se sastoji od gornjeg iframea i klikne na iframe.
Metoda 3: Prebacite se na okvir prema web elementu
Možemo se čak prebaciti na iframe pomoću web elementa.
driver.switchTo().frame(WebElement);
Kako se vratiti na glavni okvir
Moramo izaći iz iframea.
Da biste se vratili na nadređeni okvir, možete koristiti switchTo().parentFrame() ili ako se želite vratiti na glavni (ili veći dio nadređenog) okvira, možete koristiti switchTo().defaultContent();
driver.switchTo().parentFrame(); driver.switchTo().defaultContent();
Kako prebaciti okvir, ako NE MOŽEMO prebaciti pomoću ID-a ili web elementa:
Pretpostavimo da na stranici ima 100 okvira, a nema dostupnog ID-a, u ovom slučaju jednostavno ne znamo iz kojeg se iframea učitava traženi element (to je slučaj kada ne znamo indeks okvira također).
Rješenje za gornju zabrinutost je da moramo pronaći indeks iframea kroz koji se element učitava i zatim se trebamo prebaciti na iframe kroz indeks.
U nastavku su navedeni koraci za pronalaženje indeksa okvira pomoću kojeg se element učitava korištenjem donjeg isječka
Korak 1)
WebDriver driver = new FirefoxDriver(); driver.get("https://demo.guru99.com/test/guru99home/"); driver.manage().window().maximize();
- Inicijalizirajte Firefox vozač.
- Idite na web mjesto "guru99" koje se sastoji od iframea.
- Maksimizirao prozor.
Korak 2)
int size = driver.findElements(By.tagName("iframe")).size();
- Gornji kod pronalazi ukupan broj iframeova prisutnih na stranici pomoću oznake 'iframe'.
Korak 3)
Cilj za ovaj bi korak bio pronalaženje indeksa iframea.
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();}
Iznad “forloop” ponavlja sve iframeove na stranici i ispisuje '1' ako je pronađen traženi iframe inače vraća '0'.
Evo kompletnog koda do koraka 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();}}}
Izvršite ovaj program i rezultat bi bio sljedeći:
Izlaz:
1 0 0 0 0 0
Provjerite izlaz, možete pronaći nizove 0 i 1.
- Gdje god pronađete '1' u izlazu, to je indeks okvira kojim se element učitava.
- Budući da indeks iframea počinje s '0' ako pronađete 1 u 1stmjesto, tada je indeks 0.
- Ako pronađete 1 u 3rd mjesto, indeks je 2.
Možemo komentirati for petlju, nakon što pronađemo indeks.
Korak 4)
driver.switchTo().frame(0);
- Nakon što pronađete indeks elementa, možete prebacivati okvir pomoću gornje naredbe.
- driver.switchTo().frame(indeks pronađen iz koraka 3);
Korak 5)
driver.findElement(By.xpath("html/body/a/img")).click();
- Gornji kôd će kliknuti iframe ili element u iframeu.
Dakle, potpuni kod bi bio ovakav:
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***************"); } }
Izlaz:
Preglednik prelazi na stranicu koja se sastoji od gornjeg iframea i klikne na iframe.
Koncept ugniježđenih okvira u Selenium
Pretpostavimo da postoje dva okvira jedan unutar drugog kao što je prikazano na slici ispod, a naš zahtjev je ispis teksta u vanjskom i unutarnjem okviru.
U slučaju ugniježđenih okvira,
- Najprije se moramo prebaciti na vanjski okvir pomoću indeksa ili ID-a iframea
- Nakon što se prebacimo na vanjski okvir, možemo pronaći ukupan broj iframeova unutar vanjskog okvira, i
- Na unutarnji okvir možemo prijeći bilo kojom od poznatih metoda.
Pri izlasku iz okvira moramo izlaziti istim redoslijedom kojim smo u njega ušli prvo iz unutarnjeg okvira, a zatim iz vanjskog okvira.
Html kod za gornji ugniježđeni okvir prikazan je u nastavku.
Gornji HTML kod jasno objašnjava iframe oznaku (istaknutu zelenom bojom) unutar druge iframe oznake, ukazujući na prisutnost ugniježđenih iframeova.
U nastavku su navedeni koraci za prebacivanje na vanjski okvir i ispis teksta na vanjskim okvirima:
Korak 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());
- Prebacite se na vanjski okvir.
- Ispisuje tekst na vanjskom okviru.
Nakon što se prebacimo na vanjski okvir, trebali bismo znati postoji li neki unutarnji okvir unutar vanjskog okvira
Korak 2)
size = driver.findElements(By.tagName("iframe")).size(); // prints the total number of frames inside outer frame System.out.println("Total Frames --" + size);
- Pronalazi ukupan broj iframeova unutar vanjskog okvira.
- Ako je pronađena veličina '0', tada unutar okvira nema unutarnjeg okvira.
Korak 3)
driver.switchTo().frame(0); // Switching to innerframe System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
- Prijeđite na unutarnji okvir
- Ispisuje tekst na unutarnjem okviru.
Evo kompletnog koda:
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(); } }
Izlaz:
Izlaz gornjeg koda ispisao bi tekst u unutarnjem i vanjskom okviru.