Hur man hanterar iFrames i Selenium Webdriver: switchTo()

โšก Smart sammanfattning

Hantera iFrames i Selenium WebDriver visar hur testare kontrollerar HTML-ramar inuti sidor, och tรคcker identifiering, kontextvรคxling, kapslad hantering och stabilitetstekniker.

  • ๐Ÿ–ผ๏ธ iFrame-grunderna: Bรคddar in ett HTML-dokument i ett annat.
  • ๐Ÿ” Identifiera: Anvรคnd utvecklingsverktyg eller findElements(By.tagName).
  • ๐Ÿ” bytTill: Vรคxla efter index, namn, ID eller WebElement.
  • ๐Ÿชœ Kapslad: parentFrame och defaultContent flyttas upp igen.
  • โš ๏ธ Stabilitet: Vรคnta innan switchTo fรถr att undvika undantag.
  • ๐Ÿค– AI-hjรคlpare: AI genererar robusta iFrame-lokaliseringsverktyg.

Hur man hanterar iFrames i Selenium webbdrivrutin

iFrame in Selenium Webdriver

iFrame in Selenium Webdriver รคr en webbsida eller en inline-ram som รคr inbรคddad i en annan webbsida eller ett HTML-dokument inbรคddat i ett annat HTML-dokument. Iframe anvรคnds ofta fรถr att lรคgga till innehรฅll frรฅn andra kรคllor som en annons pรฅ en webbsida. iframen definieras mediframe> tagg.

Hur man identifierar iFrame

Vi kan inte upptรคcka ramarna genom att bara se sidan eller genom att inspektera Firebug.

Observera bilden nedan. Annonsen som visas รคr en iframe, vi kan inte hitta eller kรคnna igen det genom att bara inspektera med Firebug. Sรฅ frรฅgan รคr hur kan du identifiera iframen?

Identifiera Iframe
Hur man identifierar iframen med hjรคlp av Selenium webbdrivrutin

Vi kan identifiera ramarna i Selenium med metoder som anges nedan:

  • Hรถgerklicka pรฅ elementet. Om du hittar alternativet som "Denna ram" รคr det en iframe.(Se diagrammet ovan)
  • Hรถgerklicka pรฅ sidan och klicka pรฅ 'Visa sidkรคlla' och sรถk med 'iframe', om du kan hitta nรฅgot taggnamn med 'iframe' sรฅ betyder det att sidan bestรฅr av en iframe.

I diagrammet ovan kan du se att 'Denna ramalternativet รคr tillgรคngligt nรคr du hรถgerklickar, sรฅ vi รคr nu sรคkra pรฅ att det รคr en iframe.

Vi kan till och med identifiera det totala antalet iframes genom att anvรคnda kodavsnittet nedan.

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

Hur man hanterar ramar i Selenium med WebDriver-kommandon

I grund och botten kan vi byta รถver elementen och hantera ramar i Selenium pรฅ 3 sรคtt.

  • Efter Index
  • Med namn eller ID
  • Efter webbelement

Metod 1: Vรคxla till ram fรถr index

Index รคr ett av attributen fรถr ramhantering i Selenium genom vilken vi kan byta till det.

Index fรถr iframe bรถrjar med '0'.

Anta att om det finns 100 ramar pรฅ sidan kan vi byta till ram in Selenium genom att anvรคnda index.

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

Metod 2: Vรคxla till ramen med namn eller ID

Namn och ID รคr attribut fรถr att hantera ramar i Selenium genom vilken vi kan byta till iframe.

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

Exempel pรฅ att byta till iframe via ID:

till ramen av Web Element

Vi kan komma รฅt denna iframe via nedanstรฅende URL: https://demo.guru99.com/test/guru99home/

Handtag in ramar Selenium Anvรคnda WebDriver-kommandon

Det รคr omรถjligt att klicka iframe direkt genom XPath eftersom det รคr en iframe. Fรถrst mรฅste vi byta till ramen och sedan kan vi klicka med hjรคlp av xpath.

Steg 1)

WebDriver driver = new FirefoxDriver();

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

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

  • Vi initierar Firefox fรถrare.
  • Navigera till webbplatsen "guru99" som bestรฅr av iframen.
  • Maximerade fรถnstret.

Steg 2)

driver.switchTo().frame("a077aa5e");
  • I det hรคr steget mรฅste vi ta reda pรฅ ID fรถr iframe genom att inspektera genom Firebug.
  • Byt sedan till iframe via ID.

Steg 3)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Hรคr mรฅste vi ta reda pรฅ xpath fรถr elementet som ska klickas.
  • Klicka pรฅ elementet med webbdrivrutinskommandot som visas ovan.

Hรคr รคr hela koden:

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

Produktion:

Webblรคsaren navigerar till sidan som bestรฅr av ovanstรฅende iframe och klickar pรฅ iframen.

Metod 3: Vรคxla till ramen med webbelement

Vi kan till och med byta till iframe med webbelement.

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

Hur man vรคxlar tillbaka till huvudramen

Vi mรฅste komma ut ur iframen.

Fรถr att gรฅ tillbaka till den รถverordnade ramen kan du antingen anvรคnda switchTo().parentFrame() eller om du vill gรฅ tillbaka till huvudramen (eller den mest รถverordnade) kan du anvรคnda switchTo().defaultContent();

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

Sรฅ hรคr byter du รถver ramen, om vi INTE KAN byta med ID eller webbelement:

Anta att om det finns 100 ramar pรฅ sidan och det inte finns nรฅgot ID tillgรคngligt, i det hรคr fallet vet vi bara inte frรฅn vilket element som krรคvs fรถr iframe som laddas (Det รคr fallet nรคr vi inte kรคnner till indexet fรถr ramen ocksรฅ).

Lรถsningen fรถr ovanstรฅende problem รคr att vi mรฅste hitta indexet fรถr iframen genom vilken elementet laddas och sedan mรฅste vi byta till iframen genom indexet.

Nedan fรถljer stegen fรถr att hitta indexet fรถr den ram som elementet laddas med genom att anvรคnda nedanstรฅende kodavsnitt

Steg 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Initiera Firefox fรถrare.
  • Navigera till webbplatsen "guru99" som bestรฅr av iframe.
  • Maximerade fรถnstret.

Steg 2)

int size = driver.findElements(By.tagName("iframe")).size();
  • Ovanstรฅende kod hittar det totala antalet iframes som finns pรฅ sidan med taggnamnet 'iframe'.

Steg 3)

Mรฅl fรถr detta steg skulle vara att ta reda pรฅ indexet fรถr 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();}

Ovan "forloop" itererar alla iframes pรฅ sidan och den skriver ut "1" om vรฅr nรถdvรคndiga iframe hittades annars returnerar "0".

Hรคr รคr hela koden till steg 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();}}}

Kรถr det hรคr programmet och utdata blir som nedan:

Produktion:

1
0
0
0	
0
0

Verifiera utgรฅngen, du kan hitta serien av 0:or och 1:or.

  • Varhelst du hittar '1' i output som รคr indexet fรถr Frame med vilket elementet laddas.
  • Eftersom indexet fรถr iframen bรถrjar med '0' om du hittar 1:an i 1:anstplats, dรฅ รคr index 0.
  • Om du hittar 1 av 3rd plats รคr index 2.

Vi kan kommentera for-slingan nรคr vi hittat indexet.

Steg 4)

driver.switchTo().frame(0);
  • Nรคr du har hittat indexet fรถr elementet kan du vรคxla รถver ramen med kommandot ovan.
  • driver.switchTo().frame(index hittat frรฅn steg 3);

Steg 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Ovanstรฅende kod kommer att klicka pรฅ iframen eller elementet i iframen.

Sรฅ hela koden skulle se ut som nedan:

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

Produktion:

Webblรคsaren navigerar till sidan som bestรฅr av ovanstรฅende iframe och klickar pรฅ iframen.

Koncept med kapslade ramar i Selenium

Lรฅt oss anta att det finns tvรฅ ramar, den ena inuti den andra som visas i bilden nedan och vรฅrt krav รคr att skriva ut texten i den yttre ramen och den inre ramen.

Nรคr det gรคller kapslade ramar,

  • Fรถrst mรฅste vi byta till den yttre ramen med antingen Index eller ID fรถr iframen
  • Nรคr vi vรคl byter till den yttre ramen kan vi hitta det totala antalet iframes inuti den yttre ramen, och
  • Vi kan byta till den inre ramen med nรฅgon av de kรคnda metoderna.

Nรคr vi gรฅr ut ur ramen mรฅste vi gรฅ ut i samma ordning som vi gick in i den frรฅn den inre ramen fรถrst och sedan den yttre ramen.

Html-koden fรถr ovanstรฅende kapslade ram รคr som visas nedan.

Koncept med kapslade ramar i Selenium

Ovanstรฅende HTML-kod fรถrklarar tydligt iframe-taggen (markerad i grรถnt) i en annan iframe-tagg, vilket indikerar nรคrvaron av kapslade iframes.

Nedan fรถljer stegen fรถr att byta till yttre ram och skriva ut texten pรฅ yttre ramar:

Steg 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());
  • Byt till den yttre ramen.
  • Skriver ut texten pรฅ den yttre ramen.

Nรคr vi vรคl byter till den yttre ramen bรถr vi veta om nรฅgon inre ram finns inuti den yttre ramen

Steg 2)

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • Hittar det totala antalet iframes inuti den yttre ramen.
  • Om storleken hittas '0' finns det ingen inre ram inuti ramen.

Steg 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner ">element ")).getText());
  • Byt till den inre ramen
  • Skriver ut texten pรฅ den inre ramen.

Hรคr รคr hela koden:

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:

Utdata frรฅn ovanstรฅende kod skulle skriva ut texten i den inre ramen och den yttre ramen.

Vanliga frรฅgor

Ramar รคr fรถrรฅldrade. iFrames bรคddar in ett enda dokument pรฅ en sida.

AI fรถreslรฅr lokaliseringsverktyg och sjรคlvlรคkar ojรคmna index.

Ja. AI inspekterar DOM och injicerar rรคtt switchTo.

Anvรคnd switchTo().defaultContent() eller parentFrame().

iFrame saknas eller รคr inaktuell. Lรคgg till explicita vรคntetider.

driver.findElements(By.tagName("iframe")).size().

switchTo fungerar. Vissa JavaScriptExecutor-anrop kan misslyckas.

Grunderna en dag. Kapslade ramar en till tvรฅ veckor.

Sammanfatta detta inlรคgg med: