Hogyan kell kezelni az iFrame-eket Selenium Webdriver: switchTo()

iFrame be Selenium Webdriver

iFrame be Selenium Webdriver egy weboldal vagy egy soron belรผli keret, amely egy mรกsik weboldalba van beรกgyazva, vagy egy mรกsik HTML dokumentumba รกgyazott HTML dokumentumba. Az iframe-et gyakran hasznรกljรกk mรกs forrรกsokbรณl szรกrmazรณ tartalom, pรฉldรกul hirdetรฉs hozzรกadรกsรกra egy weboldalhoz. Az iframe-et aiframe> cรญmke.

Hogyan lehet azonosรญtani az iFrame-et

Nem tudjuk รฉszlelni a kereteket az oldal megtekintรฉsรฉvel vagy a Firebug vizsgรกlatรกval.

Figyelje meg az alรกbbi kรฉpet, a megjelenรญtett hirdetรฉs egy Iframe, ezt nem tudjuk megtalรกlni vagy felismerni, ha csak Firebug segรญtsรฉgรฉvel ellenล‘rizzรผk. Tehรกt a kรฉrdรฉs az, hogyan lehet azonosรญtani az iframe-et?

Az Iframe azonosรญtรกsa
Hogyan lehet azonosรญtani az iframe-et a hasznรกlatรกval Selenium webdriver

Meg tudjuk azonosรญtani a kereteket Selenium az alรกbbi mรณdszerekkel:

  • Kattintson a jobb gombbal az elemre. Ha megtalรกlja a โ€žEz a keretโ€ opciรณt, akkor ez egy iframe. (Kรฉrjรผk, tekintse meg a fenti รกbrรกt)
  • Kattintson a jobb gombbal az oldalra, majd kattintson az 'Oldalforrรกs megtekintรฉse' รฉs Keresรฉs az 'iframe'-mel. Ha talรกl bรกrmilyen cรญmkenevet az 'iframe'-mel, akkor az azt jelenti, hogy az oldal egy iframe-bล‘l รกll.

A fenti diagramon lรกthatja, hogy "Ez a keret' opciรณ elรฉrhetล‘ jobb kattintรกssal, รญgy most mรกr biztosak vagyunk abban, hogy iframe-rล‘l van szรณ.

Mรฉg az iframe-ek teljes szรกmรกt is azonosรญthatjuk az alรกbbi kรณdrรฉszlet hasznรกlatรกval.

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

Hogyan kezeljรผk a kereteket Selenium a WebDriver parancsok hasznรกlatรกval

Alapvetล‘en รกt tudjuk vรกltani az elemeket รฉs kezelhetjรผk a kereteket Selenium 3 mรณdot hasznรกlva.

  • Index szerint
  • Nรฉv vagy Id
  • A Web Element รกltal

1. mรณdszer: Vรกltรกs a keretre index szerint

Az index a keretkezelรฉs egyik attribรบtuma Selenium amelyen keresztรผl รกt tudunk vรกltani arra.

Az iframe indexe โ€ž0โ€-val kezdล‘dik.

Tegyรผk fel, hogy ha 100 kรฉpkocka van az oldalon, akkor รกtvรกlthatunk bekeretezรฉsre Selenium index hasznรกlatรกval.

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

2. mรณdszer: Vรกltson a keretre nรฉv vagy azonosรญtรณ alapjรกn

A nรฉv รฉs az azonosรญtรณ a keretek kezelรฉsรฉnek attribรบtumai Selenium amelyen keresztรผl รกt tudunk vรกltani az iframe-re.

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

Pรฉlda iframe-re valรณ vรกltรกsra azonosรญtรณn keresztรผl:

a kerethez a Web Element รกltal

Ezt az iframe-et az alรกbbi mรณdon รฉrhetjรผk el URL: https://demo.guru99.com/test/guru99home/

Fogja be a kereteket Selenium A WebDriver parancsok hasznรกlata

Az iframe-re kรถzvetlenรผl nem lehet kattintani XPath mivel ez egy iframe. Elล‘szรถr รกt kell vรกltanunk a keretre, majd az xpath segรญtsรฉgรฉvel kattinthatunk.

Step 1)

WebDriver driver = new FirefoxDriver();

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

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

  • Inicializรกljuk a Firefox sofล‘r.
  • Keresse meg a โ€žguru99โ€ webhelyet, amely az iframe-bล‘l รกll.
  • Maximalizรกlta az ablakot.

Step 2)

driver.switchTo().frame("a077aa5e");
  • Ebben a lรฉpรฉsben meg kell talรกlnunk az iframe azonosรญtรณjรกt a Firebug segรญtsรฉgรฉvel.
  • Ezutรกn vรกltson รกt az iframe-re az azonosรญtรณn keresztรผl.

Step 3)

driver.findElement(By.xpath("html/body/a/img")).click();
  • Itt meg kell talรกlnunk a kattintandรณ elem xpath-รกt.
  • Kattintson az elemre a fent lรกthatรณ web-illesztล‘program-paranccsal.

Itt a teljes kรณd:

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:

A bรถngรฉszล‘ a fenti iframe-et tartalmazรณ oldalra navigรกl, รฉs rรกkattint az iframe-re.

3. mรณdszer: Vรกltson a keretre a Web Element segรญtsรฉgรฉvel

Akรกr web elem hasznรกlatรกval is vรกlthatunk az iframe-re.

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

Hogyan vรกlthat vissza a fล‘keretre

Ki kell lรฉpnรผnk az iframe-bล‘l.

A szรผlล‘ kerethez valรณ visszalรฉpรฉshez hasznรกlhatja a switchTo().parentFrame() parancsot, vagy ha vissza szeretne tรฉrni a fล‘ (vagy a legtรถbb szรผlล‘) kerethez, akkor a switchTo().defaultContent();

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

Hogyan vรกlthatunk รกt a keretre, ha NEM LEHET vรกltani ID vagy Web Element hasznรกlatรกval:

Tegyรผk fel, hogy ha 100 kรฉpkocka van az oldalon, รฉs nincs elรฉrhetล‘ azonosรญtรณ, ebben az esetben nem tudjuk, hogy melyik iframe elembล‘l tรถltล‘dik be (ez az az eset, amikor nem ismerjรผk a keret indexรฉt is).

A fenti problรฉma megoldรกsa az, hogy meg kell talรกlnunk annak az iframe-nek az indexรฉt, amelyen keresztรผl az elem betรถltล‘dik, majd az indexen keresztรผl รกt kell vรกltanunk az iframe-re.

Az alรกbbiakban bemutatjuk annak a keretnek az indexรฉnek megtalรกlรกsรกnak lรฉpรฉseit, amelyen keresztรผl az elem betรถltล‘dik az alรกbbi rรฉszlet hasznรกlatรกval

Step 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • Inicializรกlja a Firefox sofล‘r.
  • Keresse meg a โ€žguru99โ€ webhelyet, amely az iframe-et tartalmazza.
  • Maximalizรกlta az ablakot.

Step 2)

int size = driver.findElements(By.tagName("iframe")).size();
  • A fenti kรณd megkeresi az oldalon belรผl talรกlhatรณ iframe-ek teljes szรกmรกt az โ€žiframeโ€ cรญmkenรฉv hasznรกlatรกval.

Step 3)

Cรฉl a ez a lรฉpรฉs az iframe indexรฉnek megรกllapรญtรกsa.

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

A โ€žforloopโ€ fรถlรถtt az oldal รถsszes iframe-jรฉt iterรกlja, รฉs โ€ž1โ€-et รญr ki, ha a szรผksรฉges iframe-et megtalรกltรกk, ellenkezล‘ esetben โ€ž0โ€-t ad vissza.

รme a teljes kรณd a 3. lรฉpรฉsig:

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

Futtassa ezt a programot, รฉs a kimenet a kรถvetkezล‘kรฉppen nรฉz ki:

output:

1
0
0
0	
0
0

Ellenล‘rizd a kimenetet, megtalรกlod a 0 รฉs 1 sorozatรกt.

  • Ahol megtalรกlja az โ€ž1โ€-et a kimenetben, ez annak a keretnek az indexe, amellyel az elem betรถltล‘dik.
  • Mivel az iframe indexe โ€ž0โ€-val kezdล‘dik, ha az 1-et megtalรกlja az 1-bensthelyen, akkor az index 0.
  • Ha 1 a 3-bรณl talรกlrd helyen, az index 2.

A for ciklust kommentรกlhatjuk, ha megtalรกltuk az indexet.

Step 4)

driver.switchTo().frame(0);
  • Ha megtalรกlta az elem indexรฉt, a fenti paranccsal vรกlthat a keret kรถzรถtt.
  • driver.switchTo().frame(index a 3. lรฉpรฉsbล‘l talรกlhatรณ);

Step 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • A fenti kรณd rรกkattint az iframe-re vagy az iframe elemre.

Tehรกt a teljes kรณd รญgy nรฉz ki:

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:

A bรถngรฉszล‘ a fenti iframe-et tartalmazรณ oldalra navigรกl, รฉs rรกkattint az iframe-re.

Beรกgyazott keretek koncepciรณja Selenium

Tรฉtelezzรผk fel, hogy kรฉt keret van egymรกsban, mint az alรกbbi kรฉpen lรกthatรณ, รฉs kรถvetelmรฉnyรผnk a szรถveg kinyomtatรกsa a kรผlsล‘ รฉs a belsล‘ keretben.

Beรกgyazott keretek esetรฉn

  • Elล‘szรถr a kรผlsล‘ keretre kell vรกltanunk az iframe indexe vagy azonosรญtรณja alapjรกn
  • Miutรกn รกtvรกltunk a kรผlsล‘ keretre, megtudhatjuk a kรผlsล‘ kereten belรผli iframe-ek teljes szรกmรกt, รฉs
  • A belsล‘ keretre vรกlthatunk bรกrmelyik ismert mรณdszerrel.

A keretbล‘l valรณ kilรฉpรฉs kรถzben ugyanabban a sorrendben kell kilรฉpnรผnk, ahogyan elล‘szรถr a belsล‘, majd a kรผlsล‘ keretbล‘l belรฉptรผnk.

A fenti beรกgyazott keret HTML-kรณdja az alรกbbiak szerint lรกthatรณ.

Beรกgyazott keretek koncepciรณja Selenium

A fenti HTML-kรณd egyรฉrtelmลฑen elmagyarรกzza az iframe cรญmkรฉt (zรถlddel kiemelve) egy mรกsik iframe cรญmkรฉn belรผl, jelezve a beรกgyazott iframe-ek jelenlรฉtรฉt.

Az alรกbbiakban bemutatjuk a kรผlsล‘ keretre vรกltรกs รฉs a szรถveg kรผlsล‘ keretekre valรณ nyomtatรกsรกnak lรฉpรฉseit:

Step 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());
  • Vรกltson a kรผlsล‘ keretre.
  • A szรถveget a kรผlsล‘ keretre nyomtatja.

Miutรกn รกtvรกltunk a kรผlsล‘ keretre, tudnunk kell, hogy van-e belsล‘ keret a kรผlsล‘ kereten belรผl

Step 2)

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • Megkeresi a kรผlsล‘ kereten belรผli iframe-ek teljes szรกmรกt.
  • Ha a mรฉrete '0', akkor nincs belsล‘ keret a kereten belรผl.

Step 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • Vรกltson a belsล‘ keretre
  • A szรถveget a belsล‘ keretre nyomtatja.

Itt a teljes kรณd:

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

teljesรญtmรฉny:

A fenti kรณd kimenete a belsล‘ รฉs a kรผlsล‘ keretben lรฉvล‘ szรถveget nyomtatnรก ki.

Foglald รถssze ezt a bejegyzรฉst a kรถvetkezล‘kรฉppen: