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?

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/
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รณ.
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.


