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?

Prepoznajte iframe
Kako prepoznati iframe pomoću Selenium webdriver

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/

Okviri ručke In Selenium Korištenje WebDriver naredbi

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.

Koncept ugniježđenih okvira u Selenium

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.

opširnije Čitaj više