Selenium Περιμένετε – Έννοια και Ρητή με Σύνταξη


In Selenium, Το "Waits" παίζει σημαντικό ρόλο στην εκτέλεση δοκιμών. Σε αυτό το σεμινάριο, θα μάθετε διάφορες πτυχές και τη διαφορά μεταξύ της σιωπηρής και της ρητής αναμονής Selenium.

Γιατί χρειαζόμαστε αναμονή Selenium?

Οι περισσότερες από τις διαδικτυακές εφαρμογές αναπτύσσονται χρησιμοποιώντας Ajax και Javascript. Όταν μια σελίδα φορτώνεται από το πρόγραμμα περιήγησης, τα στοιχεία με τα οποία θέλουμε να αλληλεπιδράσουμε ενδέχεται να φορτώνονται σε διαφορετικά χρονικά διαστήματα.

Όχι μόνο καθιστά δύσκολο τον εντοπισμό του στοιχείου, αλλά και εάν το στοιχείο δεν βρίσκεται, θα ρίξει ένα "ElementNotVisibleException» εξαίρεση. Χρησιμοποιώντας Selenium Περιμένετε, μπορούμε να λύσουμε αυτό το πρόβλημα.

Ας εξετάσουμε ένα σενάριο όπου πρέπει να χρησιμοποιήσουμε τόσο σιωπηρές όσο και ρητές αναμονές στη δοκιμή μας. Ας υποθέσουμε ότι ο σιωπηρός χρόνος αναμονής έχει οριστεί στα 20 δευτερόλεπτα και ο ρητός χρόνος αναμονής έχει οριστεί στα 10 δευτερόλεπτα.

Ας υποθέσουμε ότι προσπαθούμε να βρούμε ένα στοιχείο που έχει κάποια «Αναμενόμενες συνθήκες "(Ρητή αναμονή), Εάν το στοιχείο δεν βρίσκεται εντός του χρονικού πλαισίου που καθορίζεται από τη ρητή αναμονή (10 δευτερόλεπτα), θα χρησιμοποιήσει το χρονικό πλαίσιο που ορίζεται από την σιωπηρή αναμονή (20 δευτερόλεπτα) προτού ρίξει ένα "ElementNotVisibleException".

Selenium Το πρόγραμμα οδήγησης Web Waits

  1. Σιωπηρή αναμονή
  2. Άμεση αναμονή

Σε αυτό το σεμινάριο, θα μάθετε για διαφορετικούς τύπους αναμονής Selenium:

Σιωπηρή Αναμονή Selenium

The Σιωπηρή Αναμονή Selenium χρησιμοποιείται για να πει στο πρόγραμμα οδήγησης ιστού να περιμένει για ένα συγκεκριμένο χρονικό διάστημα προτού ρίξει μια "Κανένα τέτοιο στοιχείο εξαίρεσης". Η προεπιλεγμένη ρύθμιση είναι 0. Μόλις ρυθμίσουμε την ώρα, το πρόγραμμα οδήγησης web θα περιμένει το στοιχείο για εκείνη την ώρα πριν κάνει μια εξαίρεση.

Selenium Το Web Driver έχει δανειστεί την ιδέα της σιωπηρής αναμονής από Watir.

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

Για να δηλώσετε σιωπηρή αναμονή Selenium WebDriver:

Σύνταξη σιωπηρής αναμονής:

driver.manage().timeouts().implicitlyWait(TimeOut, TimeUnit.SECONDS);
package guru.test99;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.Test;
public class AppTest {
	
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.equals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	//close browser
	driver.close();
}
}

Επεξήγηση Κώδικα

Στο παραπάνω παράδειγμα,

Λάβετε υπόψη τον ακόλουθο κώδικα:

driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS) ;

Η σιωπηρή αναμονή θα δέχεται 2 παραμέτρους, η πρώτη παράμετρος θα δέχεται τον χρόνο ως ακέραια τιμή και η δεύτερη παράμετρος θα δέχεται τη μέτρηση του χρόνου σε ΔΕΥΤΕΡΟΛΕΠΤΑ, ΛΕΠΤΑ, ΜΙΛΙΔΕΥΤΕΡΟΛΕΠΤΟ, ΜΙΚΡΟΔΕΥΤΕΡΟΛΕΠΤΑ, ΝΑΝΟΔευτερόλεπτα, ΗΜΕΡΕΣ, ΩΡΕΣ κ.λπ.

Ρητή Αναμονή Selenium

The Ρητή Αναμονή Selenium χρησιμοποιείται για να πει στο πρόγραμμα οδήγησης Web να περιμένει για ορισμένες συνθήκες (Αναμενόμενες συνθήκες) ή υπέρβαση του μέγιστου χρόνου πριν από την εξαίρεση "ElementNotVisibleException". Είναι ένα έξυπνο είδος αναμονής, αλλά μπορεί να εφαρμοστεί μόνο για συγκεκριμένα στοιχεία. Παρέχει καλύτερες επιλογές από την σιωπηρή αναμονή καθώς περιμένει δυναμικά φορτωμένα στοιχεία Ajax.

Μόλις δηλώσουμε ρητή αναμονή, πρέπει να χρησιμοποιήσουμε "Αναμενόμενες Συνθήκες” ή μπορούμε να διαμορφώσουμε πόσο συχνά θέλουμε να ελέγχουμε την κατάσταση χρησιμοποιώντας Γρήγορη αναμονή. Αυτές τις μέρες κατά την εφαρμογή χρησιμοποιούμε Thread.Sleep() γενικά δεν συνιστάται η χρήση

Στο παρακάτω παράδειγμα, δημιουργούμε αναμονή αναφοράς για "WebDriverΠεριμένετε" class and instantiating using "Πρόγραμμα οδήγησης Web” αναφορά και δίνουμε μέγιστο χρονικό πλαίσιο 20 δευτερολέπτων.

Ρητή σύνταξη αναμονής:

WebDriverWait wait = new WebDriverWait(WebDriverRefrence,TimeOut);
package guru.test99;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest2 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	driver = new ChromeDriver(); 
	WebDriverWait wait=new WebDriverWait(driver, 20);
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
	}
	WebElement guru99seleniumlink;
	guru99seleniumlink= wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath( "/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
	guru99seleniumlink.click();
	}
	
}

Επεξήγηση Κώδικα

Λάβετε υπόψη τον ακόλουθο κώδικα:

WebElement guru99seleniumlink;
guru99seleniumlink = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i")));
guru99seleniumlink.click();

Σε αυτό το παράδειγμα αναμονής WebDriver, περιμένετε για το χρονικό διάστημα που ορίζεται στο "WebDriverΠεριμένετε"τάξη ή το "Αναμενόμενες Συνθήκες” να συμβεί όποιο συμβεί πρώτο.

Τα παραπάνω Java Ο κωδικός δηλώνει ότι περιμένουμε ένα στοιχείο για το χρονικό πλαίσιο των 20 δευτερολέπτων όπως ορίζεται στο "WebDriverΠεριμένετε" τάξη στην ιστοσελίδα μέχρι το "Αναμενόμενες Συνθήκες” πληρούνται και η προϋπόθεση είναι ”ορατότητα του στοιχείου που βρίσκεται".

Ακολουθούν οι Αναμενόμενες Συνθήκες που μπορούν να χρησιμοποιηθούν Selenium Άμεση αναμονή

  1. alertIsPresent()
  2. elementSelectionStateToBe()
  3. elementToBeClickable()
  4. elementToBeSelected()
  5. frameToBeAvaliableAndSwitchToIt()
  6. invisibilityOfTheElementLocated()
  7. invisibilityOfElementWithText()
  8. presentOfAllElementsLocatedBy()
  9. presentOfElementLocated()
  10. textToBePresentInElement()
  11. textToBePresentInElementLocated()
  12. textToBePresentInElementValue()
  13. titleIs()
  14. titleΠεριέχει()
  15. visibilityOf()
  16. visibilityOfAllElements()
  17. visibilityOfAllElementsLocatedBy()
  18. visibilityOfElementLocated()

Άνετο Wait in Selenium

The Άνετο Wait in Selenium χρησιμοποιείται για τον καθορισμό του μέγιστου χρόνου αναμονής του προγράμματος οδήγησης Ιστού για μια συνθήκη, καθώς και για τη συχνότητα με την οποία θέλουμε να ελέγξουμε τη συνθήκη πριν δημιουργήσουμε μια εξαίρεση "ElementNotVisibleException". Ελέγχει για το στοιχείο web σε τακτά χρονικά διαστήματα μέχρι να βρεθεί το αντικείμενο ή να συμβεί το χρονικό όριο.

Συχνότητα: Ρύθμιση ενός κύκλου επανάληψης με το χρονικό πλαίσιο για την επαλήθευση/έλεγχο της κατάστασης στο κανονικό χρονικό διάστημα

Ας εξετάσουμε ένα σενάριο όπου ένα στοιχείο φορτώνεται σε διαφορετικά χρονικά διαστήματα. Το στοιχείο μπορεί να φορτωθεί εντός 10 δευτερολέπτων, 20 δευτερολέπτων ή και περισσότερο από αυτό, εάν δηλώσουμε ρητή αναμονή 20 δευτερολέπτων. Θα περιμένει μέχρι τον καθορισμένο χρόνο πριν κάνει εξαίρεση. Σε τέτοια σενάρια, η ρέουσα αναμονή είναι η ιδανική αναμονή για χρήση, καθώς θα προσπαθήσει να βρει το στοιχείο σε διαφορετική συχνότητα μέχρι να το βρει ή να τελειώσει ο τελικός χρονοδιακόπτης.

Συντακτικό Fluent Wait:

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);

Ο παραπάνω κωδικός έχει καταργηθεί στο Selenium v3.11 και παραπάνω. Πρέπει να χρησιμοποιήσετε

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(Duration.ofSeconds(SECONDS))
.pollingEvery(Duration.ofSeconds(SECONDS))
.ignoring(Exception.class);

package guru.test99;

import org.testng.annotations.Test;
import java.util.NoSuchElementException;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

public class AppTest3 {
	protected WebDriver driver;
	@Test
	public void guru99tutorials() throws InterruptedException 
	{
	System.setProperty ("webdriver.chrome.driver",".\\chromedriver.exe" );
	String eTitle = "Demo Guru99 Page";
	String aTitle = "" ;
	driver = new ChromeDriver();
	// launch Chrome and redirect it to the Base URL
	driver.get("https://demo.guru99.com/test/guru99home/" );
	//Maximizes the browser window
	driver.manage().window().maximize() ;
	//get the actual value of the title
	aTitle = driver.getTitle();
	//compare the actual title with the expected title
	if (aTitle.contentEquals(eTitle))
	{
	System.out.println( "Test Passed") ;
	}
	else {
	System.out.println( "Test Failed" );
		}
	
	Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
			.withTimeout(30, TimeUnit.SECONDS) 			
			.pollingEvery(5, TimeUnit.SECONDS) 			
			.ignoring(NoSuchElementException.class);
	WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){
	
		public WebElement apply(WebDriver driver ) {
			return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));
		}
	});
	//click on the selenium link
	clickseleniumlink.click();
	//close~ browser
	driver.close() ;
	}
}

Επεξήγηση Κώδικα

Λάβετε υπόψη τον ακόλουθο κώδικα:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)							
	.withTimeout(30, TimeUnit.SECONDS) 			
	.pollingEvery(5, TimeUnit.SECONDS) 			
	.ignoring(NoSuchElementException.class);				

Στο παραπάνω παράδειγμα, δηλώνουμε μια ευχάριστη αναμονή με το χρονικό όριο λήξης των 30 δευτερολέπτων και η συχνότητα ορίζεται στα 5 δευτερόλεπτα αγνοώντας το "NoSuchElementException"

Λάβετε υπόψη τον ακόλουθο κώδικα:

public WebElement apply(WebDriver driver) {
        return driver.findElement(By.xpath("/html/body/div[1]/section/div[2]/div/div[1]/div/div[1]/div/div/div/div[2]/div[2]/div/div/div/div/div[1]/div/div/a/i"));

Έχουμε δημιουργήσει μια νέα συνάρτηση για την αναγνώριση του στοιχείου Web στη σελίδα. (Π.χ.: Εδώ το Web Element δεν είναι παρά το Selenium σύνδεσμος στην ιστοσελίδα).

Η συχνότητα έχει ρυθμιστεί στα 5 δευτερόλεπτα και ο μέγιστος χρόνος έχει οριστεί στα 30 δευτερόλεπτα. Επομένως, αυτό σημαίνει ότι θα ελέγχει για το στοιχείο στην ιστοσελίδα κάθε 5 δευτερόλεπτα για μέγιστο χρόνο 30 δευτερολέπτων. Εάν το στοιχείο βρίσκεται εντός αυτού του χρονικού πλαισίου, θα εκτελέσει τις λειτουργίες αλλιώς θα ρίξει ένα "ElementNotVisibleException"

Ελέγξτε επίσης: - Selenium Εκμάθηση IDE για αρχάριους

Διαφορά μεταξύ σιωπηρής αναμονής έναντι ρητής αναμονής

Ακολουθεί η κύρια διαφορά μεταξύ της σιωπηρής αναμονής και της ρητής αναμονής Selenium:

Σιωπηρή αναμονή Άμεση αναμονή
Ο σιωπηρός χρόνος αναμονής εφαρμόζεται σε όλα τα στοιχεία του σεναρίου Ο ρητός χρόνος αναμονής εφαρμόζεται μόνο σε εκείνα τα στοιχεία που προορίζονται από εμάς
Στο Implicit Wait, χρειαζόμαστε δεν καθορίστε "ExpectedConditions" στο στοιχείο που θα εντοπιστεί Στο Explicit Wait, πρέπει να καθορίσουμε "ExpectedConditions" στο στοιχείο που θα εντοπιστεί
Συνιστάται να χρησιμοποιείται όταν τα στοιχεία βρίσκονται με το χρονικό πλαίσιο που καθορίζεται στο Selenium σιωπηρή αναμονή Συνιστάται η χρήση όταν τα στοιχεία χρειάζονται πολύ χρόνο για να φορτωθούν και επίσης για την επαλήθευση της ιδιότητας του στοιχείου όπως (visibilityOfElementLocated, elementToBeClickable,elementToBeSelected)

Συμπέρασμα

Το Implicit, το Explicit και το Fluent Wait είναι οι διαφορετικές αναμονές που χρησιμοποιούνται Selenium. Η χρήση αυτών των αναμονής βασίζεται εξ ολοκλήρου στα στοιχεία που φορτώνονται σε διαφορετικά χρονικά διαστήματα. Δεν συνιστάται πάντα η χρήση Thread.Sleep() while Δοκιμές την εφαρμογή μας ή την κατασκευή του πλαισίου μας.

Ελέγξτε επίσης: - Selenium Οδηγός για αρχάριους: Μάθετε WebDriver σε 7 ημέρες

Περισσότερα readmore