Cum să gestionați cadrele iFrame în Selenium Driver web: switchTo()

iFrame în Selenium Webdriver

iFrame în Selenium Webdriver este o pagină web sau un cadru inline care este încorporat într-o altă pagină web sau un document HTML încorporat în alt document HTML. Iframe-ul este adesea folosit pentru a adăuga conținut din alte surse, cum ar fi o reclamă într-o pagină web. Cadrul iframe este definit cuiFrame> etichetă.

Cum să identifici iFrame

Nu putem detecta cadrele doar văzând pagina sau inspectând Firebug.

Observați imaginea de mai jos, Anunțul afișat este un Iframe, nu îl putem localiza sau recunoaște doar prin inspectarea utilizând Firebug. Deci întrebarea este cum puteți identifica iframe-ul?

Identificați Iframe
Cum să identifici iframe folosind Selenium webdriver

Putem identifica cadrele din Selenium folosind metodele prezentate mai jos:

  • Faceți clic dreapta pe element, dacă găsiți opțiunea precum „Acest cadru”, atunci este un iframe. (Vă rugăm să consultați diagrama de mai sus)
  • Faceți clic dreapta pe pagină și faceți clic pe „Vedeți sursa paginii” și căutați cu „iframe”, dacă puteți găsi orice nume de etichetă cu „iframe”, atunci înseamnă că pagina este formată dintr-un iframe.

În diagrama de mai sus, puteți vedea că "Acest cadruopțiunea este disponibilă la clic dreapta, așa că acum suntem siguri că este un iframe.

Putem chiar identifica numărul total de cadre iframe utilizând fragmentul de mai jos.

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

Cum să manipulați cadrele în Selenium folosind comenzile WebDriver

Practic, putem comuta elementele și putem manipula cadrele Selenium folosind 3 moduri.

  • După Index
  • După Nume sau Id
  • Prin element web

Metoda 1: Comutați la cadru după index

Indexul este unul dintre atributele pentru manipularea cadrelor în Selenium prin care putem trece la el.

Indexul iframe-ului începe cu „0”.

Să presupunem că dacă există 100 de cadre în pagină, putem trece la cadru în interior Selenium prin utilizarea indexului.

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

Metoda 2: Comutați la cadru după Nume sau ID

Numele și ID-ul sunt atribute pentru manipularea cadrelor în Selenium prin care putem trece la iframe.

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

Exemplu de trecere la iframe prin ID:

la cadrul prin Web Element

Putem accesa acest iframe prin adresa URL de mai jos: https://demo.guru99.com/test/guru99home/

Mâner rame în Selenium Utilizarea comenzilor WebDriver

Este imposibil să faceți clic direct pe iframe XPath deoarece este un iframe. Mai întâi trebuie să comutăm la cadru și apoi putem face clic folosind xpath.

Pas 1)

WebDriver driver = new FirefoxDriver();

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

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

  • Inițializam Firefox conducător auto.
  • Navigați la site-ul „guru99” care constă în iframe.
  • Maximizat fereastra.

Pas 2)

driver.switchTo().frame("a077aa5e");
  • În acest pas trebuie să aflăm id-ul iframe-ului prin inspectarea prin Firebug.
  • Apoi treceți la iframe prin ID.

Pas 3)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Aici trebuie să aflăm xpath-ul elementului pe care se face clic.
  • Faceți clic pe element folosind comanda driverului web prezentată mai sus.

Iată codul complet:

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***************");
      }
}		

ieșire:

Browserul navighează la pagina care constă în iframe-ul de mai sus și face clic pe iframe.

Metoda 3: Comutați la cadru prin Element Web

Putem chiar să comutăm la iframe folosind elementul web.

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

Cum să comutați înapoi la Cadrul principal

Trebuie să ieșim din iframe.

Pentru a reveni la cadrul părinte, puteți fie să utilizați switchTo().parentFrame() sau dacă doriți să reveniți la cadrul principal (sau cel mai părinte), puteți utiliza switchTo().defaultContent();

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

Cum să comutăm peste cadru, dacă NU PUTEM comuta folosind ID sau Web Element:

Să presupunem că în pagină există 100 de cadre și nu există niciun ID disponibil, în acest caz, pur și simplu nu știm din ce element necesar iframe este încărcat (este cazul când nu cunoaștem indexul cadrului de asemenea).

Soluția pentru preocuparea de mai sus este că trebuie să găsim indexul iframe-ului prin care elementul este încărcat și apoi trebuie să trecem la iframe prin index.

Mai jos sunt pașii pentru găsirea indexului cadrului prin care elementul este încărcat utilizând fragmentul de mai jos

Pas 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Inițializați Firefox conducător auto.
  • Navigați la site-ul „guru99” care constă în iframe.
  • Maximizat fereastra.

Pas 2)

int size = driver.findElements(By.tagName("iframe")).size();
  • Codul de mai sus găsește numărul total de cadre iframe prezente în interiorul paginii folosind eticheta „iframe”.

Pas 3)

Obiectiv pentru acest pas ar fi aflarea indexului iframe-ului.

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

Deasupra „forloop” iterează toate iframe-urile din pagină și afișează „1” dacă iframe-ul nostru necesar a fost găsit, altfel returnează „0”.

Iată codul complet până la pasul 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();}}}

Executați acest program și rezultatul ar fi ca mai jos:

ieșire:

1
0
0
0	
0
0

Verificați rezultatul, puteți găsi seriile de 0 și 1.

  • Oriunde găsiți „1” în ieșire, acesta este indexul Frame-ului prin care elementul este încărcat.
  • Deoarece indexul iframe-ului începe cu „0” dacă găsiți 1 în 1stloc, atunci indicele este 0.
  • Daca gasesti 1 din 3rd loc, indicele este 2.

Putem comenta bucla for, odată ce am găsit indexul.

Pas 4)

driver.switchTo().frame(0);
  • Odată ce găsiți indexul elementului, puteți comuta asupra cadrului folosind comanda de mai sus.
  • driver.switchTo().frame(index găsit de la Pasul 3);

Pas 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Codul de mai sus va face clic pe iframe sau pe elementul din iframe.

Deci codul complet ar fi ca mai jos:

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***************");
	        }
	    }

ieșire:

Browserul navighează la pagina care constă în iframe-ul de mai sus și face clic pe iframe.

Conceptul de cadre imbricate în Selenium

Să presupunem că există două cadre unul în interiorul celuilalt, așa cum se arată în imaginea de mai jos, iar cerința noastră este să tipărim textul în cadrul exterior și în cadrul interior.

În cazul cadrelor imbricate,

  • La început trebuie să comutăm la cadrul exterior fie prin Index, fie prin ID-ul iframe-ului
  • Odată ce trecem la cadrul exterior, putem găsi numărul total de cadre iframe din interiorul cadrului exterior și
  • Putem trece la cadrul interior prin oricare dintre metodele cunoscute.

În timp ce ieșim din cadru, trebuie să ieșim în aceeași ordine în care am intrat în el mai întâi din cadrul interior și apoi din cadrul exterior.

Codul HTML pentru cadrul imbricat de mai sus este așa cum se arată mai jos.

Conceptul de cadre imbricate în Selenium

Codul HTML de mai sus explică în mod clar eticheta iframe (evidențiată cu verde) în cadrul unei alte etichete iframe, indicând prezența iframe-urilor imbricate.

Mai jos sunt pașii pentru trecerea la cadrul exterior și imprimarea textului pe cadrele exterioare:

Pas 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());
  • Comutați la Cadrul exterior.
  • Imprimă textul pe cadrul exterior.

Odată ce trecem la cadrul exterior, ar trebui să știm dacă există vreun cadru interior în cadrul cadrului exterior

Pas 2)

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • Găsește numărul total de cadre iframe din interiorul cadrului exterior.
  • Dacă dimensiunea a fost găsită „0”, atunci nu există un cadru interior în interiorul cadrului.

Pas 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • Comutați la cadrul interior
  • Imprimă textul pe cadrul interior.

Iată codul complet:

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

producție:

Ieșirea codului de mai sus ar tipări textul în cadrul interior și cadrul exterior.

Citește mai mult Readmore