Πώς να χειριστείτε το iFrames Selenium Πρόγραμμα οδήγησης Web: switchTo()
iFrame μέσα Selenium Πρόγραμμα οδήγησης Web
iFrame μέσα Selenium Πρόγραμμα οδήγησης Web είναι μια ιστοσελίδα ή ένα ενσωματωμένο πλαίσιο που είναι ενσωματωμένο σε μια άλλη ιστοσελίδα ή ένα έγγραφο HTML ενσωματωμένο σε άλλο έγγραφο HTML. Το iframe χρησιμοποιείται συχνά για την προσθήκη περιεχομένου από άλλες πηγές, όπως μια διαφήμιση σε μια ιστοσελίδα. Το iframe ορίζεται με τοiframe> ετικέτα.
Πώς να αναγνωρίσετε το iFrame
Δεν μπορούμε να εντοπίσουμε τα πλαίσια βλέποντας απλώς τη σελίδα ή επιθεωρώντας το Firebug.
Παρατηρήστε την παρακάτω εικόνα, η διαφήμιση που εμφανίζεται είναι ένα Iframe, δεν μπορούμε να το εντοπίσουμε ή να το αναγνωρίσουμε απλώς επιθεωρώντας χρησιμοποιώντας το Firebug. Επομένως, το ερώτημα είναι πώς μπορείτε να αναγνωρίσετε το iframe;
Μπορούμε να αναγνωρίσουμε τα πλαίσια Selenium χρησιμοποιώντας μεθόδους που δίνονται παρακάτω:
- Κάντε δεξί κλικ στο στοιχείο, εάν βρείτε την επιλογή όπως "Αυτό το πλαίσιο", τότε είναι ένα iframe. (Παρακαλούμε ανατρέξτε στο παραπάνω διάγραμμα)
- Κάντε δεξί κλικ στη σελίδα και κάντε κλικ στην «Προβολή προέλευσης σελίδας» και «Αναζήτηση» με το «iframe», εάν μπορείτε να βρείτε οποιοδήποτε όνομα ετικέτας με το «iframe», τότε σημαίνει ότι η σελίδα αποτελείται από ένα iframe.
Στο παραπάνω διάγραμμα, μπορείτε να δείτε ότι «Αυτό το πλαίσιοΗ επιλογή ' είναι διαθέσιμη με δεξί κλικ, επομένως είμαστε πλέον σίγουροι ότι πρόκειται για iframe.
Μπορούμε ακόμη και να αναγνωρίσουμε τον συνολικό αριθμό iframe χρησιμοποιώντας το παρακάτω απόσπασμα.
Int size = driver.findElements(By.tagName("iframe")).size();
Πώς να χειριστείτε τα πλαίσια Selenium χρησιμοποιώντας εντολές WebDriver
Βασικά, μπορούμε να αλλάξουμε τα στοιχεία και να χειριστούμε τα πλαίσια Selenium χρησιμοποιώντας 3 τρόπους.
- Κατά Ευρετήριο
- Με όνομα ή ταυτότητα
- Από Web Element
Μέθοδος 1: Μετάβαση στο πλαίσιο ανά ευρετήριο
Το ευρετήριο είναι ένα από τα χαρακτηριστικά για το χειρισμό πλαισίου Selenium μέσω του οποίου μπορούμε να μεταβούμε σε αυτό.
Το ευρετήριο του iframe ξεκινά με '0'.
Ας υποθέσουμε ότι αν υπάρχουν 100 καρέ στη σελίδα, μπορούμε να μεταβούμε σε καρέ μέσα Selenium χρησιμοποιώντας ευρετήριο.
driver.switchTo().frame(0);
driver.switchTo().frame(1);
Μέθοδος 2: Μετάβαση στο πλαίσιο κατά Όνομα ή αναγνωριστικό
Το όνομα και το αναγνωριστικό είναι χαρακτηριστικά για το χειρισμό πλαισίων Selenium μέσω του οποίου μπορούμε να μεταβούμε στο iframe.
driver.switchTo().frame("iframe1");
driver.switchTo().frame("id of the element");
Παράδειγμα εναλλαγής σε iframe μέσω αναγνωριστικού:
στο πλαίσιο από το Web Element
Μπορούμε να έχουμε πρόσβαση σε αυτό το iframe μέσω αυτής της παρακάτω διεύθυνσης URL: https://demo.guru99.com/test/guru99home/
Είναι αδύνατο να κάνετε κλικ απευθείας στο iframe XPath αφού είναι iframe. Πρώτα πρέπει να μεταβούμε στο πλαίσιο και μετά μπορούμε να κάνουμε κλικ χρησιμοποιώντας το xpath.
Βήμα 1)
WebDriver driver = new FirefoxDriver(); driver.get("https://demo.guru99.com/test/guru99home/"); driver.manage().window().maximize();
- Αρχικοποιούμε το Firefox οδηγός.
- Μεταβείτε στον ιστότοπο "guru99" που αποτελείται από το iframe.
- Μεγιστοποίησε το παράθυρο.
Βήμα 2)
driver.switchTo().frame("a077aa5e");
- Σε αυτό το βήμα πρέπει να μάθουμε το αναγνωριστικό του iframe επιθεωρώντας μέσω του Firebug.
- Στη συνέχεια, μεταβείτε στο iframe μέσω ID.
Βήμα 3)
driver.findElement(By.xpath("html/body/a/img")).click();
- Εδώ πρέπει να μάθουμε το xpath του στοιχείου στο οποίο θα κάνετε κλικ.
- Κάντε κλικ στο στοιχείο χρησιμοποιώντας την εντολή προγράμματος οδήγησης web που εμφανίζεται παραπάνω.
Εδώ είναι ο πλήρης κώδικας:
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***************"); } }
Παραγωγή:
Το πρόγραμμα περιήγησης πλοηγείται στη σελίδα που αποτελείται από το παραπάνω iframe και κάνει κλικ στο iframe.
Μέθοδος 3: Μετάβαση στο πλαίσιο από το στοιχείο Web
Μπορούμε ακόμη και να μεταβούμε στο iframe χρησιμοποιώντας το στοιχείο web.
driver.switchTo().frame(WebElement);
Πώς να επιστρέψετε στο Main Frame
Πρέπει να βγούμε από το iframe.
Για να επιστρέψετε στο γονικό πλαίσιο, μπορείτε είτε να χρησιμοποιήσετε το switchTo().parentFrame() είτε εάν θέλετε να επιστρέψετε στο κύριο (ή το πιο γονικό) πλαίσιο, μπορείτε να χρησιμοποιήσετε το switchTo().defaultContent();
driver.switchTo().parentFrame(); driver.switchTo().defaultContent();
Τρόπος εναλλαγής από το πλαίσιο, εάν ΔΕΝ ΜΠΟΡΟΥΜΕ να αλλάξουμε χρησιμοποιώντας αναγνωριστικό ή στοιχείο Web:
Ας υποθέσουμε ότι υπάρχουν 100 καρέ στη σελίδα και δεν υπάρχει διαθέσιμο αναγνωριστικό, σε αυτήν την περίπτωση, απλώς δεν γνωρίζουμε από ποιο στοιχείο iframe φορτώνεται το απαιτούμενο στοιχείο (Είναι η περίπτωση που δεν γνωρίζουμε το ευρετήριο του πλαισίου επίσης).
Η λύση για την παραπάνω ανησυχία είναι ότι πρέπει να βρούμε το ευρετήριο του iframe μέσω του οποίου φορτώνεται το στοιχείο και, στη συνέχεια, πρέπει να μεταβούμε στο iframe μέσω του ευρετηρίου.
Ακολουθούν τα βήματα για την εύρεση του ευρετηρίου του Πλαισίου με το οποίο φορτώνεται το στοιχείο χρησιμοποιώντας το παρακάτω απόσπασμα
Βήμα 1)
WebDriver driver = new FirefoxDriver(); driver.get("https://demo.guru99.com/test/guru99home/"); driver.manage().window().maximize();
- Αρχικοποιήστε το Firefox οδηγός.
- Μεταβείτε στον ιστότοπο "guru99" που αποτελείται από το iframe.
- Μεγιστοποίησε το παράθυρο.
Βήμα 2)
int size = driver.findElements(By.tagName("iframe")).size();
- Ο παραπάνω κώδικας βρίσκει τον συνολικό αριθμό των iframe που υπάρχουν μέσα στη σελίδα χρησιμοποιώντας το όνομα ετικέτας 'iframe'.
Βήμα 3)
Στόχος για αυτό το βήμα θα ήταν η εύρεση του ευρετηρίου του 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();}
Πάνω από το "forloop" επαναλαμβάνει όλα τα iframe της σελίδας και εκτυπώνει '1' εάν βρέθηκε το απαιτούμενο iframe μας, διαφορετικά επιστρέφει '0'.
Εδώ είναι ο πλήρης κώδικας μέχρι το βήμα 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();}}}
Εκτελέστε αυτό το πρόγραμμα και η έξοδος θα είναι όπως παρακάτω:
Παραγωγή:
1 0 0 0 0 0
Επαληθεύστε την έξοδο, μπορείτε να βρείτε τη σειρά των 0 και 1.
- Όπου βρίσκετε το '1' στην έξοδο, αυτός είναι ο δείκτης του Frame με τον οποίο φορτώνεται το στοιχείο.
- Δεδομένου ότι ο δείκτης του iframe ξεκινά με '0' αν βρείτε το 1 στο 1stθέση, τότε ο δείκτης είναι 0.
- Αν βρείτε 1 στα 3rd θέση, ο δείκτης είναι 2.
Μπορούμε να σχολιάσουμε τον βρόχο for, μόλις βρούμε το ευρετήριο.
Βήμα 4)
driver.switchTo().frame(0);
- Μόλις βρείτε το ευρετήριο του στοιχείου, μπορείτε να μεταβείτε στο πλαίσιο χρησιμοποιώντας την παραπάνω εντολή.
- driver.switchTo().frame(ευρετήριο βρέθηκε από το Βήμα 3);
Βήμα 5)
driver.findElement(By.xpath("html/body/a/img")).click();
- Ο παραπάνω κωδικός θα κάνει κλικ στο iframe ή στο στοιχείο του iframe.
Οπότε ο πλήρης κώδικας θα είναι ο παρακάτω:
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***************"); } }
Παραγωγή:
Το πρόγραμμα περιήγησης πλοηγείται στη σελίδα που αποτελείται από το παραπάνω iframe και κάνει κλικ στο iframe.
Έννοια ένθετων πλαισίων σε Selenium
Ας υποθέσουμε ότι υπάρχουν δύο πλαίσια το ένα μέσα στο άλλο όπως φαίνεται στην παρακάτω εικόνα και η απαίτησή μας είναι να εκτυπώσουμε το κείμενο στο εξωτερικό πλαίσιο και στο εσωτερικό πλαίσιο.
Στην περίπτωση ένθετων πλαισίων,
- Αρχικά πρέπει να μεταβούμε στο εξωτερικό πλαίσιο είτε με το Index είτε με το ID του iframe
- Μόλις μεταβούμε στο εξωτερικό πλαίσιο, μπορούμε να βρούμε τον συνολικό αριθμό των iframes μέσα στο εξωτερικό πλαίσιο, και
- Μπορούμε να μεταβούμε στο εσωτερικό πλαίσιο με οποιαδήποτε από τις γνωστές μεθόδους.
Κατά την έξοδο από το πλαίσιο, πρέπει να βγούμε με την ίδια σειρά που μπήκαμε σε αυτό από το εσωτερικό πλαίσιο πρώτα και μετά το εξωτερικό πλαίσιο.
Ο κώδικας Html για το παραπάνω ένθετο πλαίσιο είναι όπως φαίνεται παρακάτω.
Ο παραπάνω κώδικας HTML εξηγεί ξεκάθαρα την ετικέτα iframe (επισημασμένη με πράσινο χρώμα) μέσα σε μια άλλη ετικέτα iframe, υποδεικνύοντας την παρουσία ένθετων iframe.
Ακολουθούν τα βήματα για τη μετάβαση στο εξωτερικό πλαίσιο και την εκτύπωση του κειμένου σε εξωτερικά πλαίσια:
Βήμα 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());
- Μεταβείτε στο εξωτερικό πλαίσιο.
- Εκτυπώνει το κείμενο στο εξωτερικό πλαίσιο.
Μόλις μεταβούμε στο εξωτερικό πλαίσιο, θα πρέπει να γνωρίζουμε εάν υπάρχει εσωτερικό πλαίσιο μέσα στο εξωτερικό πλαίσιο
Βήμα 2)
size = driver.findElements(By.tagName("iframe")).size(); // prints the total number of frames inside outer frame System.out.println("Total Frames --" + size);
- Βρίσκει τον συνολικό αριθμό των iframe μέσα στο εξωτερικό πλαίσιο.
- Εάν το μέγεθος βρέθηκε '0' τότε δεν υπάρχει εσωτερικό πλαίσιο μέσα στο πλαίσιο.
Βήμα 3)
driver.switchTo().frame(0); // Switching to innerframe System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
- Μεταβείτε στο εσωτερικό πλαίσιο
- Εκτυπώνει το κείμενο στο εσωτερικό πλαίσιο.
Εδώ είναι ο πλήρης κώδικας:
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(); } }
Παραγωγή:
Η έξοδος του παραπάνω κώδικα θα εκτυπώσει το κείμενο στο εσωτερικό πλαίσιο και στο εξωτερικό πλαίσιο.