handling iframes using selenium webdriver switchto method
συγχώνευση ταξινόμησης πηγαίου κώδικα c ++
Χειρισμός iFrames χρησιμοποιώντας Selenium WebDriver: Hands-on Tutorial με πρακτικά παραδείγματα
Το iFrame (ενσωματωμένο πλαίσιο) είναι ένα έγγραφο HTML ενσωματωμένο σε ένα άλλο έγγραφο HTML.
Τα iFrames χρησιμοποιούνται πιο συχνά για την εμφάνιση διαφημίσεων σε μια ιστοσελίδα. Τα iFrames αναφέρονται ρητά σε έγγραφο HTML χρησιμοποιώντας την ετικέτα HTML
Αυτό το σεμινάριο θα σας εξηγήσει όλα σχετικά με το χειρισμό iframes στο Selenium μαζί με τα σχετικά παραδείγματα κώδικα για την εύκολη κατανόησή σας.
=> Διαβάστε τη σειρά προπόνησης Easy Selenium.
Τι θα μάθετε:
- Χειρισμός iFrames με χρήση σεληνίου
- ΕΝΗΜΕΡΩΣΗ τον Μάρτιο 2020
- συμπέρασμα
Χειρισμός iFrames με χρήση σεληνίου
Ένα iframe μέσα σε μια ιστοσελίδα μπορεί να αναγνωριστεί στο πρόγραμμα περιήγησης Firefox εάν η επιλογή με το όνομα 'Αυτό το πλαίσιο' εμφανίζεται στις επιλογές δεξιού κλικ όπως φαίνεται παρακάτω.
Εναλλακτικά, μπορούμε επίσης να επικυρώσουμε εάν μια ιστοσελίδα έχει iframe κοιτάζοντας τον πηγαίο κώδικα και αναζητώντας την ετικέτα
List iframes = driver.findElements(By.tagName(“iframe”));
Μέθοδοι που παρέχονται από το Σελήνιο για το χειρισμό iFrames
Το Selenium παρέχει τις ακόλουθες ενσωματωμένες μεθόδους για εναλλαγή από iframe.
- switchTo.frame (int frameNumber)
- switchTo.frame (string frameName)
- switchTo.frame (WebElement frameElement)
- switchTo (). defaultContent ()
# 1) switchTo.frame (int frameNumber)
- Αυτή η μέθοδος επιτρέπει στους χρήστες να μεταβούν σε ένα συγκεκριμένο πλαίσιο χρησιμοποιώντας το αναγνωριστικό πλαισίου.
- Ο αριθμός καρέ είναι μηδενική τιμή ευρετηρίου που σημαίνει ότι το πρώτο καρέ της ιστοσελίδας έχει το ευρετήριο 0, το δεύτερο καρέ έχει το ευρετήριο 1 και το τρίτο καρέ έχει το ευρετήριο 3 και ούτω καθεξής.
- Ο αριθμός καρέ μπορεί επίσης να αναγνωριστεί χρησιμοποιώντας το αναγνωριστικό καρέ του στοιχείου. Αυτό μπορεί να γίνει από Κάντε δεξί κλικ -> Επιθεώρηση στοιχείου και αναζητήστε το iFrame. Επικυρώστε εάν οποιοδήποτε από τα iFrames έχει ένα χαρακτηριστικό ID.
Το δείγμα στοιχείου iframe στον πηγαίο κώδικα θα φαίνεται όπως αναφέρεται παρακάτω.
Μόλις αναγνωριστεί το αναγνωριστικό του iFrame, μπορούμε να χρησιμοποιήσουμε το ίδιο για να μεταβούμε στο πλαίσιο όπως παρακάτω.
Παραδείγματα:
driver.switchTo.frame ('a077aa5e');
driver.switchTo.frame (0);
- Αυτή η μέθοδος ρίχνει το NoSuchFrameException όταν το απαιτούμενο πλαίσιο δεν βρίσκεται στην τρέχουσα ιστοσελίδα.
# 2) switchTo.frame (string frameName)
- Αυτή η μέθοδος επιτρέπει στους χρήστες να μεταβούν σε ένα συγκεκριμένο πλαίσιο χρησιμοποιώντας το όνομα του πλαισίου που καθορίζεται από τον προγραμματιστή.
- Το όνομα πλαισίου πρέπει να περικλείεται σε διπλά εισαγωγικά για να θεωρείται παράμετρος String.
- Αυτή η μέθοδος ρίχνει το NoSuchFrameException όταν το απαιτούμενο πλαίσιο δεν βρίσκεται στην τρέχουσα ιστοσελίδα.
Παράδειγμα:
Στον κωδικό που αναφέρεται παραπάνω, τόσο το αναγνωριστικό καρέ όσο και το όνομα καρέ έχουν την ίδια τιμή. Η μετάβαση σε καρέ μπορεί να πραγματοποιηθεί χρησιμοποιώντας το όνομα καρέ όπως παρακάτω:
driver.switchTo.frame ('a077aa5e');
# 3) switchTo.frame (WebElement frameElement)
- Αυτή η μέθοδος επιτρέπει στους χρήστες να μεταβούν σε ένα πλαίσιο βάσει της τοποθεσίας του Web Element.
- Αυτή η μέθοδος ρίχνει το NoSuchFrameException όταν το απαιτούμενο πλαίσιο δεν υπάρχει στην ιστοσελίδα και το StaleElementReferenceException εάν το πλαίσιο που εμφανίζεται στην ιστοσελίδα δεν είναι ενεργό.
Παράδειγμα:
WebElement frameElement = driver.findElement (By.id ('a077aa5e'));
driver.switchTo.frame (frameElement);
# 4) switchTo (). DefaultContent ()
- Η εναλλαγή μεταξύ iframes και γονικής σελίδας μπορεί να επιτευχθεί χρησιμοποιώντας τη μέθοδο driver.switchTo (). DefaultContent ().
- Λάβετε υπόψη ότι υπάρχει μια παρόμοια μέθοδος στο Selenium για εναλλαγή μεταξύ πλαισίων που ονομάζονται μέθοδο driver.switchTo (). ParentFrame ().
- Η διαφορά μεταξύ driver.switchTo (). DefaultContent () και driver.switchTo (). ParentFrame () είναι ότι η πρώτη μέθοδος αλλάζει το στοιχείο ελέγχου στην κύρια ιστοσελίδα ανεξάρτητα από τον αριθμό των καρέ εντός της ιστοσελίδας, ενώ η δεύτερη μέθοδος αλλάζει τον έλεγχο στο γονικό πλαίσιο του τρέχοντος καρέ.
Παράδειγμα:
Ας υποθέσουμε ότι υπάρχουν τρία καρέ που ονομάζονται i1, i2 και i3 στη γονική ιστοσελίδα p1. Τα πλαίσια i1, i2 και i3 εξαρτώνται το ένα από το άλλο, πράγμα που σημαίνει ότι ένα πλαίσιο θα είναι το γονικό του άλλου.
Χρησιμοποιώντας τη μέθοδο driver.switchTo (). DefaultContent () στο πλαίσιο i3, το στοιχείο ελέγχου προγράμματος οδήγησης ιστού μετακινείται στη γονική σελίδα, σελ. 1. Ενώ η μέθοδος driver.switchTo (). ParentFrame () στο πλαίσιο i3 αλλάζει τον έλεγχο πίσω στο πλαίσιο i2 και ούτω καθεξής.
Δείγμα πηγαίου κώδικα:
Ακολουθεί το δοκιμαστικό σενάριο που θα αυτοματοποιηθεί χρησιμοποιώντας iframes στο σελήνιο:
- Ανοίξτε τον ιστότοπο SoftwareTestingHelp.com.
- Βρείτε όλα τα στοιχεία HTML με την ετικέτα iframe, μετρήστε τον αριθμό των εμφανίσεων του iFrame και εκτυπώστε το σε μια κονσόλα.
- Μεταβείτε σε έγκυρο πλαίσιο στην ιστοσελίδα χρησιμοποιώντας το αναγνωριστικό καρέ και εκτυπώστε τον πηγαίο κώδικα του καρέ.
- Κλείστε το τρέχον παράθυρο του προγράμματος περιήγησης.
package Demo; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class iFramesDemo { public static void main(String() args) throws InterruptedException { System.setProperty('webdriver.gecko.driver','D:\Data_Personal\Demo \geckodriver-v0.23.0-win64\geckodriver.exe'); WebDriver driver = new FirefoxDriver(); driver.get('https://www.softwaretestinghelp.com/'); //Finding all iframe tags on a web page List elements = driver.findElements(By.tagName('iframe')); int numberOfTags = elements.size(); System.out.println('No. of Iframes on this Web Page are: ' +numberOfTags); // Switch to the frame using the frame id System.out.println('Switching to the frame'); driver.switchTo().frame('aswift_0'); // Print the frame source code System.out.println('Frame Source' +driver.getPageSource()); // Switch back to main web page driver.switchTo().defaultContent(); driver.quit(); } }
Έξοδος κώδικα:
Ανοίξτε τον ιστότοπο: https://www.softwaretestinghelp.com
Μεταβείτε στο πλαίσιο που ονομάζεται aswift_0.
Εκτυπώστε τον αριθμό των iframe στην ιστοσελίδα στο παράθυρο της κονσόλας έκλειψης.
Εκτυπώστε τον πηγαίο κώδικα του πλαισίου στην κονσόλα έκλειψης μετά τη μετάβαση στο πλαίσιο.
Επεξήγηση κώδικα:
- Αρχικοποιούμε ένα αντικείμενο προγράμματος οδήγησης gecko χρησιμοποιώντας τη μέθοδο System.setProperty για να δείξουμε τη διαδρομή αρχείου geckodriver.exe στον τοπικό υπολογιστή.
- Στη συνέχεια, δημιουργούμε ένα αντικείμενο προγράμματος οδήγησης FireFox μέσω της διεπαφής WebDriver.
- Χρησιμοποιώντας το αντικείμενο προγράμματος οδήγησης του firefox, ανοίγει η ακόλουθη ιστοσελίδα: https://www.softwaretestinghelp.com.
- Στο επόμενο βήμα, προσδιορίζουμε τον αριθμό των στοιχείων iframe που εμφανίζονται στην ιστοσελίδα, τα μετράμε και προβάλλουμε τον αριθμό iframe στην κονσόλα έκλειψης.
- Χρησιμοποιώντας το αναγνωριστικό καρέ, μεταβαίνουμε στο πλαίσιο στην ιστοσελίδα. Στην παραπάνω περίπτωση, το αναγνωριστικό καρέ είναι «aswift_0».
- Αφού πραγματοποιήσουμε μια αλλαγή στο πλαίσιο με επιτυχία, εκτυπώνουμε τον πηγαίο κώδικα του πλαισίου στην κονσόλα έκλειψης.
- Στη συνέχεια, επιστρέφουμε στη γονική ιστοσελίδα χρησιμοποιώντας τη δήλωση driver.switchTo (). DefaultContent () και τέλος κλείνουμε την παρουσία προγράμματος οδήγησης ιστού χρησιμοποιώντας τη μέθοδο driver.quit.
Διαφορά μεταξύ Frame και iFrame στο Σελήνιο
- Ένα πλαίσιο χρησιμοποιείται για να χωρίσει μια σελίδα σε πολλές ενότητες, με νέο περιεχόμενο σε κάθε ενότητα.
- Ένα iFrame χρησιμοποιείται για την ενσωμάτωση του περιεχομένου των εξωτερικών ιστότοπων στην ιστοσελίδα, προκειμένου να αποφευχθούν προβλήματα σεναρίων μεταξύ ιστότοπων.
- Ένα iFrame θεωρείται λιγότερο ασφαλές από ένα πλαίσιο, καθώς το iFrame επιτρέπει στους προγραμματιστές να ενσωματώνουν περιεχόμενο από ιστότοπους τρίτων. Έτσι, ένα iframe απαιτεί από έναν προγραμματιστή να εμπιστεύεται το περιεχόμενο που έχει ενσωματώσει στο iframe.
- Οι περισσότερες από τις εφαρμογές ιστού που αναπτύσσονται σήμερα δεν χρησιμοποιούν πλαίσια για τη διαίρεση της σελίδας, αλλά χρησιμοποιούν iframes για την ενσωμάτωση εξωτερικού περιεχομένου, όπως διαφημίσεις εντός της ιστοσελίδας.
Διαχείριση δυναμικών πλαισίων στο Σελήνιο
- Σε ορισμένες ιστοσελίδες, οι ιδιότητες πλαισίου όπως το αναγνωριστικό πλαισίου και το όνομα πλαισίου μπορούν να αλλάξουν δυναμικά σε μια ιστοσελίδα, ωστόσο, η θέση του πλαισίου θα παραμείνει η ίδια. Σε μια τέτοια περίπτωση, δεν μπορούμε να βασιστούμε στο αναγνωριστικό πλαισίου ή το όνομα πλαισίου για να προσδιορίσουμε με μοναδικό τρόπο ένα πλαίσιο.
- Μπορούμε να χρησιμοποιήσουμε το ευρετήριο καρέ σε μια τέτοια περίπτωση για τον μοναδικό προσδιορισμό του πλαισίου με βάση τη θέση του πλαισίου.
- Σε ορισμένες περιπτώσεις, η τιμή του αναγνωριστικού καρέ αλλάζει κάθε φορά που φορτώνεται η σελίδα, αλλά με ένα στατικό κείμενο που δεν αλλάζει. Για παράδειγμα , λάβετε υπόψη τον παρακάτω κώδικα για iframes.
Στο παραπάνω παράδειγμα, το κείμενο «frame_» παραμένει σταθερό ενώ η αριθμητική τιμή αλλάζει με κάθε φόρτωση σελίδας.
- Μπορούμε να αναγνωρίσουμε το παραπάνω πλαίσιο μοναδικά χρησιμοποιώντας τα παρακάτω XPath
// iframe (περιέχει (@ id, «πλαίσιο»))
ΕΝΗΜΕΡΩΣΗ τον Μάρτιο 2020
Πώς να εντοπίσετε τα στοιχεία μέσα στο πλαίσιο
Στο Selenium, για να έχουμε πρόσβαση στα στοιχεία που υπάρχουν μέσα στο πλαίσιο, πρώτα, πρέπει να αλλάξουμε μέσα στο πλαίσιο και μετά να αναγνωρίσουμε τα στοιχεία όπως συνήθως χρησιμοποιούμε διαφορετικούς εντοπιστές Selenium. Ο κωδικός Selenium δεν μπορεί να εντοπίσει τα στοιχεία σας, χωρίς να μεταβείτε σε IFrame.
Το παρακάτω στιγμιότυπο οθόνης δείχνει πώς ενσωματώνονται τα πλαίσια σε έναν κώδικα HTML:
Διαφορετικοί τρόποι μετάβασης σε IFrame χρησιμοποιώντας σελήνιο
# 1) Χρήση ονόματος ή αναγνωριστικού πλαισίου
Μεταβείτε σε IFrame χρησιμοποιώντας το Όνομα καρέ ή το Αναγνωριστικό καρέ, μερικές φορές είτε το Όνομα καρέ είτε το αναγνωριστικό ή και τα δύο θα υπάρχουν σε έναν κωδικό.
Σύνταξη:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) Χρήση ευρετηρίου καρέ
Εντοπίστε το πλαίσιο χρησιμοποιώντας το ευρετήριο καρέ, εάν υπάρχει.
Σύνταξη:
driver.switchTo().frame(0); // frame index starts with 0
# 3) Χρήση του Στοιχείου Ιστού
Εντοπίστε το πλαίσιο χρησιμοποιώντας εντοπιστές Selenium .
Σύνταξη:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
Άλλες λειτουργίες που χρησιμοποιούν πλαίσιο
# 1) Επιστροφή στο πλαίσιο γονέα ή προγόνου
Επιστροφή από το πλαίσιο 3 στο πλαίσιο 2 χρησιμοποιώντας την εντολή 'switchTo.parentFrame' .
Σύνταξη:
driver.switchTo().parentFrame();
# 2) Μετάβαση σε οποιοδήποτε άλλο πλαίσιο
Εάν θέλετε να αλλάξετε από το πλαίσιο 3 στο πλαίσιο 1 ή το προεπιλεγμένο πλαίσιο, χρησιμοποιήστε την εντολή 'switchTo.defaultContent'.
Σύνταξη:
driver.switchTo().defaultContent();
Στον παρακάτω κώδικα εντοπίζουμε ένα πλαίσιο κειμένου ονόματος που υπάρχει μέσα σε ένα πλαίσιο.
Τι γίνεται αν προσπαθήσουμε να το εντοπίσουμε απευθείας χωρίς να μεταβούμε στο πλαίσιο;
Ας δούμε το αποτέλεσμα:
Ο κωδικός απέτυχε με το λόγο 'Δεν είναι δυνατός ο εντοπισμός στοιχείου: {' μέθοδος ':' xpath ',' επιλογέας ':' // input (@ name = 'name') '}
Τώρα μεταβείτε στο πλαίσιο χρησιμοποιώντας το Web Element ή πείτε χρησιμοποιώντας το Selenium locator και εντοπίστε το πεδίο πλαισίου κειμένου.
Παρακάτω δίνεται ο πλήρης κωδικός για εναλλαγή μέσα στο πλαίσιο:
package com.wordpress.pages; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class Frame { static WebDriver driver; @Test public void Test(){ System.setProperty('webdriver.chrome.driver', 'D:\Srinivas\New folder\exe\chromedriver.exe'); driver = new ChromeDriver(); driver.get('http://www.dwuser.com/education/content/the-magical-iframe-tag-an-introduction/'); //identifying the frame using locator or say using webelement driver.switchTo().frame(driver.findElement(By.xpath('//div(@id='eduFooterWrap')//iframe(1)'))); driver.findElement(By.xpath('//input(@name='name')')).sendKeys('SoftwareTestingHelp.com'); } }
Παραγωγή:
Έτσι πρέπει να αλλάξουμε μεταξύ των πλαισίων για τον εντοπισμό των στοιχείων χρησιμοποιώντας το Selenium. Εάν υπάρχουν πολλά πλαίσια στην ιστοσελίδα σας, τότε πρέπει να αλλάξετε πολλές φορές.
συμπέρασμα
- Το iFrame είναι ένα έγγραφο HTML ενσωματωμένο σε άλλο έγγραφο HTML. Τα iFrames αναφέρονται ρητά στο έγγραφο HTML χρησιμοποιώντας την ετικέτα HTML
- Η μέθοδος switchTo.frame (int frameNumber) επιτρέπει στους χρήστες να μεταβούν σε ένα συγκεκριμένο πλαίσιο χρησιμοποιώντας το αναγνωριστικό πλαισίου.
- Η μέθοδος switchTo.frame (string frameName) επιτρέπει στους χρήστες να μεταβούν σε ένα συγκεκριμένο πλαίσιο χρησιμοποιώντας το όνομα του πλαισίου που καθορίζεται από τον προγραμματιστή.
- Η μέθοδος switchTo.frame (WebElement frameElement) επιτρέπει στους χρήστες να μεταβούν σε ένα πλαίσιο με βάση την τοποθεσία του Web Element.
=> Δείτε όλα τα σεμινάρια σεληνίου εδώ.
Συνιστώμενη ανάγνωση
- Cucumber Selenium Tutorial: Αγγούρι Java Selenium WebDriver Integration
- Εισαγωγή στο Selenium WebDriver - Selenium Tutorial # 8
- Υλοποίηση του πρώτου σεναρίου WebDriver - Selenium WebDriver Tutorial # 10
- Συχνές ερωτήσεις για το σελήνιο
- Τρόπος χειρισμού ειδοποιήσεων / αναδυόμενων παραθύρων στο Selenium WebDriver - Selenium Tutorial # 16
- Χειρισμός Πινάκων Ιστού, Πλαισίων και Δυναμικών Στοιχείων σεναρίου Σεληνίου - Εκπαιδευτικό Σελήνιο # 18
- Σιωπηρή και ρητή αναμονή στο Selenium WebDriver (Τύποι σεληνίου περιμένει)
- Οδηγός για τη δημιουργία εκτεταμένων αναφορών στο Selenium WebDriver