Πώς να χειριστείτε το iFrames Selenium Πρόγραμμα οδήγησης Web: switchTo()

iFrame μέσα Selenium Πρόγραμμα οδήγησης Web

iFrame μέσα Selenium Πρόγραμμα οδήγησης Web είναι μια ιστοσελίδα ή ένα ενσωματωμένο πλαίσιο που είναι ενσωματωμένο σε μια άλλη ιστοσελίδα ή ένα έγγραφο HTML ενσωματωμένο σε άλλο έγγραφο HTML. Το iframe χρησιμοποιείται συχνά για την προσθήκη περιεχομένου από άλλες πηγές, όπως μια διαφήμιση σε μια ιστοσελίδα. Το iframe ορίζεται με τοiframe> ετικέτα.

Πώς να αναγνωρίσετε το iFrame

Δεν μπορούμε να εντοπίσουμε τα πλαίσια βλέποντας απλώς τη σελίδα ή επιθεωρώντας το Firebug.

Παρατηρήστε την παρακάτω εικόνα, η διαφήμιση είναι dislayed είναι ένα Iframe, δεν μπορούμε να το εντοπίσουμε ή να το αναγνωρίσουμε απλώς επιθεωρώντας χρησιμοποιώντας το Firebug. Επομένως, το ερώτημα είναι πώς μπορείτε να αναγνωρίσετε το iframe;

Προσδιορίστε το Iframe
Πώς να αναγνωρίσετε το iframe χρησιμοποιώντας Selenium Πρόγραμμα οδήγησης Web

Μπορούμε να αναγνωρίσουμε τα πλαίσια 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/

Χειριστείτε τα πλαίσια μέσα Selenium Χρήση εντολών WebDriver

Είναι αδύνατο να κάνετε κλικ απευθείας στο 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 μέσα στο εξωτερικό πλαίσιο, και
  • Μπορούμε να μεταβούμε στο εσωτερικό πλαίσιο με οποιαδήποτε από τις γνωστές μεθόδους.

Κατά την έξοδο από το πλαίσιο, πρέπει να βγούμε με την ίδια σειρά που μπήκαμε σε αυτό από το εσωτερικό πλαίσιο πρώτα και μετά το εξωτερικό πλαίσιο.

Έννοια ένθετων πλαισίων σε Selenium
Ένθετα iFrames Selenium Πρόγραμμα οδήγησης Web

Ο κώδικας Html για το παραπάνω ένθετο πλαίσιο είναι όπως φαίνεται παρακάτω.

Έννοια ένθετων πλαισίων σε Selenium

Ο παραπάνω κώδικας 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();
	}
}

Παραγωγή:

Η έξοδος του παραπάνω κώδικα θα εκτυπώσει το κείμενο στο εσωτερικό πλαίσιο και στο εξωτερικό πλαίσιο.