page object model with page factory selenium tutorial
Αυτό το σε βάθος εκπαιδευτικό πρόγραμμα εξηγεί τα πάντα για το μοντέλο αντικειμένου σελίδας (POM) με παραδείγματα εργοστασίου. Μπορείτε επίσης να μάθετε την εφαρμογή του POM στο Σελήνιο:
Σε αυτό το σεμινάριο, θα καταλάβουμε πώς να δημιουργήσουμε ένα μοντέλο αντικειμένου σελίδας χρησιμοποιώντας την προσέγγιση Page Factory. Θα επικεντρωθούμε στα εξής:
- Εργοστασιακή κλάση
- Πώς να δημιουργήσετε ένα βασικό POM χρησιμοποιώντας το πρότυπο Factory Factory
- Διαφορετικοί σχολιασμοί που χρησιμοποιούνται στη σελίδα εργοστασιακής προσέγγισης
Προτού δούμε τι είναι το Pagefactory και πώς μπορεί να χρησιμοποιηθεί μαζί με το μοντέλο αντικειμένου σελίδας, ας καταλάβουμε τι είναι το μοντέλο αντικειμένου σελίδας που είναι συνήθως γνωστό ως POM.
=> Επισκεφθείτε εδώ για να δείτε τη σειρά προπόνησης Selenium για όλους.
Τι θα μάθετε:
- Τι είναι το μοντέλο αντικειμένου σελίδας (POM);
- Τι είναι το Pagefactory;
- POM Χρήση εργοστασιακής σελίδας
- Εκπαιδευτικά βίντεο - POM With Page Factory
- Βήματα για τη δημιουργία POM χρησιμοποιώντας πρότυπο εργοστασιακής σελίδας
- Επίπεδο σελίδας
- Βήματα για τη δημιουργία POM με παράδειγμα σε πραγματικό χρόνο
- Δοκιμή επιπέδου
- Ιεραρχία τύπου σχολιασμού που χρησιμοποιείται για τη δήλωση στοιχείων Web
- Περισσότερα στο PageFactory.initElements ()
- Συχνές Ερωτήσεις
- συμπέρασμα
Τι είναι το μοντέλο αντικειμένου σελίδας (POM);
Οι θεωρητικές ορολογίες περιγράφουν το Μοντέλο αντικειμένου σελίδας ως σχέδιο σχεδίασης που χρησιμοποιείται για τη δημιουργία ενός αποθετηρίου αντικειμένων για τα στοιχεία ιστού που διατίθενται στην υπό δοκιμή εφαρμογή. Λίγοι άλλοι το αναφέρουν ως πλαίσιο για αυτοματισμό σεληνίου για τη δεδομένη εφαρμογή υπό δοκιμή.
Ωστόσο, αυτό που κατάλαβα για τον όρο Μοντέλο αντικειμένου σελίδας είναι:
# 1) Είναι ένα μοτίβο σχεδίασης όπου έχετε ένα ξεχωριστό αρχείο κλάσης Java που αντιστοιχεί σε κάθε οθόνη ή σελίδα στην εφαρμογή. Το αρχείο κλάσης θα μπορούσε να περιλαμβάνει το αποθετήριο αντικειμένων των στοιχείων διεπαφής χρήστη καθώς και μεθόδους.
#δύο) Σε περίπτωση που υπάρχουν τεράστια στοιχεία ιστού σε μια σελίδα, η κλάση αποθετηρίου αντικειμένων για μια σελίδα μπορεί να διαχωριστεί από την κλάση που περιλαμβάνει μεθόδους για την αντίστοιχη σελίδα.
Παράδειγμα: Εάν η σελίδα Εγγραφή λογαριασμού έχει πολλά πεδία εισαγωγής, τότε θα μπορούσε να υπάρχει μια κατηγορία RegisterAccountObjects.java που σχηματίζει το αποθετήριο αντικειμένων για τα στοιχεία διεπαφής χρήστη στη σελίδα λογαριασμών μητρώου.
Θα μπορούσε να δημιουργηθεί ένα ξεχωριστό αρχείο τάξης RegisterAccount.java που επεκτείνει ή κληρονομεί το RegisterAccountObjects που περιλαμβάνει όλες τις μεθόδους που εκτελούν διαφορετικές ενέργειες στη σελίδα.
# 3) Εκτός αυτού, θα μπορούσε να υπάρχει ένα γενικό πακέτο με ένα αρχείο {roperties, δεδομένα δοκιμής Excel και κοινές μεθόδους σε ένα πακέτο.
Παράδειγμα: DriverFactory που θα μπορούσε να χρησιμοποιηθεί πολύ εύκολα σε όλες τις σελίδες της εφαρμογής
Κατανόηση του POM με παράδειγμα
Ελεγχος εδώ για να μάθετε περισσότερα για το POM.
Ακολουθεί ένα στιγμιότυπο της Ιστοσελίδας:
Κάνοντας κλικ σε καθέναν από αυτούς τους συνδέσμους θα ανακατευθύνετε τον χρήστη σε μια νέα σελίδα.
Ακολουθεί το στιγμιότυπο του τρόπου κατασκευής της δομής του έργου με το Selenium χρησιμοποιώντας το μοντέλο αντικειμένου σελίδας που αντιστοιχεί σε κάθε σελίδα του ιστότοπου. Κάθε κλάση Java περιλαμβάνει αποθετήριο αντικειμένων και μεθόδους για την εκτέλεση διαφορετικών ενεργειών μέσα στη σελίδα.
Εκτός αυτού, θα υπάρχει ένα άλλο JUNIT ή TestNG ή ένα αρχείο κλάσης Java που καλεί κλήσεις σε αρχεία κλάσης αυτών των σελίδων.
Γιατί χρησιμοποιούμε το μοντέλο αντικειμένου σελίδας;
Υπάρχει μια φήμη γύρω από τη χρήση αυτού του ισχυρού πλαισίου Selenium που ονομάζεται POM ή μοντέλο αντικειμένου σελίδας. Τώρα, τίθεται το ερώτημα ως 'Γιατί να χρησιμοποιήσετε το POM;'.
Η απλή απάντηση σε αυτό είναι ότι το POM είναι ένας συνδυασμός δεδομένων, αρθρωτού και υβριδικού πλαισίου. Είναι μια προσέγγιση για τη συστηματική οργάνωση των σεναρίων με τέτοιο τρόπο ώστε να διευκολύνει το QA να διατηρεί τον κώδικα χωρίς ταλαιπωρία και επίσης βοηθά στην αποφυγή περιττού ή διπλού κώδικα.
Για παράδειγμα, εάν υπάρχει μια αλλαγή στην τιμή εντοπισμού σε μια συγκεκριμένη σελίδα, τότε είναι πολύ εύκολο να εντοπίσετε και να πραγματοποιήσετε αυτήν τη γρήγορη αλλαγή μόνο στο σενάριο της αντίστοιχης σελίδας χωρίς να επηρεαστεί ο κώδικας αλλού.
Χρησιμοποιούμε το concept Page Object Model στο Selenium Webdriver για τους ακόλουθους λόγους:
- Δημιουργείται ένα αποθετήριο αντικειμένων σε αυτό το μοντέλο POM. Είναι ανεξάρτητο από τις δοκιμαστικές περιπτώσεις και μπορεί να επαναχρησιμοποιηθεί για ένα διαφορετικό έργο.
- Η σύμβαση ονομασίας των μεθόδων είναι πολύ εύκολη, κατανοητή και πιο ρεαλιστική.
- Στο μοντέλο αντικειμένου σελίδας, δημιουργούμε κλάσεις σελίδων που μπορούν να επαναχρησιμοποιηθούν σε άλλο έργο.
- Το μοντέλο αντικειμένου σελίδας είναι εύκολο για το ανεπτυγμένο πλαίσιο λόγω των διαφόρων πλεονεκτημάτων του.
- Σε αυτό το μοντέλο, δημιουργούνται ξεχωριστές τάξεις για διαφορετικές σελίδες μιας εφαρμογής ιστού όπως σελίδα σύνδεσης, αρχική σελίδα, σελίδα λεπτομερειών υπαλλήλου, αλλαγή σελίδας κωδικού πρόσβασης κ.λπ.
- Εάν υπάρχει οποιαδήποτε αλλαγή σε οποιοδήποτε στοιχείο ενός ιστότοπου, τότε πρέπει μόνο να κάνουμε αλλαγές σε μία τάξη και όχι σε όλες τις τάξεις.
- Το σενάριο που έχει σχεδιαστεί είναι πιο επαναχρησιμοποιήσιμο, ευανάγνωστο και διατηρήσιμο στην προσέγγιση μοντέλου αντικειμένου σελίδας.
- Η δομή του έργου του είναι αρκετά εύκολη και κατανοητή.
- Μπορεί να χρησιμοποιήσει το PageFactory στο μοντέλο αντικειμένου σελίδας για να προετοιμάσει το στοιχείο ιστού και να αποθηκεύσει στοιχεία στην προσωρινή μνήμη.
- Το TestNG μπορεί επίσης να ενσωματωθεί στην προσέγγιση Page Object Model.
Υλοποίηση απλού POM στο Σελήνιο
# 1) Σενάριο για αυτοματοποίηση
Τώρα αυτοματοποιούμε το δεδομένο σενάριο χρησιμοποιώντας το Page Object Model.
Το σενάριο εξηγείται παρακάτω:
Βήμα 1: Ξεκινήστε τον ιστότοπο 'https: //demo.vtiger.com'.
Βήμα 2: Εισαγάγετε τα έγκυρα διαπιστευτήρια.
Βήμα 3: Συνδεθείτε στον ιστότοπο.
Βήμα 4: Επαληθεύστε την αρχική σελίδα.
Βήμα 5: Αποσυνδεθείτε από τον ιστότοπο.
Βήμα 6: Κλείστε το πρόγραμμα περιήγησης.
# 2) Σενάρια σεναρίου για το παραπάνω σενάριο στο POM
Τώρα δημιουργούμε τη δομή POM στο Eclipse, όπως εξηγείται παρακάτω:
Βήμα 1: Δημιουργήστε ένα έργο στο Eclipse - Δομή βασισμένη σε POM:
α) Δημιουργία έργου 'Μοντέλο αντικειμένου σελίδας'.
β) Δημιουργία 3 πακέτων στο πλαίσιο του έργου.
- βιβλιοθήκη
- σελίδες
- δοκιμές
Βιβλιοθήκη: Κάτω από αυτό, βάζουμε αυτούς τους κωδικούς που πρέπει να κληθούν ξανά και ξανά στις δοκιμαστικές μας περιπτώσεις, όπως εκκίνηση προγράμματος περιήγησης, στιγμιότυπα οθόνης κ.λπ. Ο χρήστης μπορεί να προσθέσει περισσότερες κατηγορίες κάτω από αυτό με βάση την ανάγκη του έργου.
Σελίδες: Κάτω από αυτό, δημιουργούνται τάξεις για κάθε σελίδα στην εφαρμογή ιστού και μπορούν να προσθέσουν περισσότερες κατηγορίες σελίδων με βάση τον αριθμό των σελίδων στην εφαρμογή.
Θήκες δοκιμής: Κάτω από αυτό, γράφουμε τη δοκιμαστική υπόθεση σύνδεσης και μπορούμε να προσθέσουμε περισσότερες δοκιμαστικές περιπτώσεις, όπως απαιτείται για να δοκιμάσουμε ολόκληρη την εφαρμογή.
γ) Τα μαθήματα κάτω από τα Πακέτα εμφανίζονται στην παρακάτω εικόνα.
Βήμα δύο: Δημιουργήστε τις ακόλουθες τάξεις στο πακέτο βιβλιοθήκης.
Browser.java: Σε αυτήν την τάξη, ορίζονται 3 προγράμματα περιήγησης (Firefox, Chrome και Internet Explorer) και καλείται στην περίπτωση δοκιμής σύνδεσης. Με βάση την απαίτηση, ο χρήστης μπορεί να δοκιμάσει την εφαρμογή και σε διαφορετικά προγράμματα περιήγησης.
package library; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.ie.InternetExplorerDriver; public class Browser { static WebDriver driver; public static WebDriver StartBrowser(String browsername , String url) { // If the browser is Firefox if (browsername.equalsIgnoreCase('Firefox')) { // Set the path for geckodriver.exe System.setProperty('webdriver.firefox.marionette',' E://Selenium//Selenium_Jars//geckodriver.exe '); driver = new FirefoxDriver(); } // If the browser is Chrome else if (browsername.equalsIgnoreCase('Chrome')) { // Set the path for chromedriver.exe System.setProperty('webdriver.chrome.driver','E://Selenium//Selenium_Jars//chromedriver.exe'); driver = new ChromeDriver(); } // If the browser is IE else if (browsername.equalsIgnoreCase('IE')) { // Set the path for IEdriver.exe System.setProperty('webdriver.ie.driver','E://Selenium//Selenium_Jars//IEDriverServer.exe'); driver = new InternetExplorerDriver(); } driver.manage().window().maximize(); driver.get(url); return driver; } }
ScreenShot.java: Σε αυτήν την τάξη, γράφεται ένα πρόγραμμα στιγμιότυπου οθόνης και καλείται στη δοκιμαστική περίπτωση όταν ο χρήστης θέλει να τραβήξει ένα στιγμιότυπο οθόνης για το αν η δοκιμή αποτύχει ή περάσει.
package library; import java.io.File; import org.apache.commons.io.FileUtils; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; public class ScreenShot { public static void captureScreenShot(WebDriver driver, String ScreenShotName) { try { File screenshot=((TakesScreenshot)driver).getScreenshotAs(OutputType. FILE ); FileUtils.copyFile(screenshot, new File('E://Selenium//'+ScreenShotName+'.jpg')); } catch (Exception e) { System. out .println(e.getMessage()); e.printStackTrace(); } } }
Βήμα 3: Δημιουργήστε τάξεις σελίδων στο πακέτο σελίδας.
HomePage.java: Αυτή είναι η κλάση αρχικής σελίδας, στην οποία καθορίζονται όλα τα στοιχεία της αρχικής σελίδας και οι μέθοδοι.
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class HomePage { WebDriver driver; By logout = By.id('p_lt_ctl03_wSOB_btnSignOutLink'); By home = By.id('p_lt_ctl02_wCU2_lblLabel'); //Constructor to initialize object public HomePage(WebDriver dr) { this .driver=dr; } public String pageverify() { return driver.findElement(home).getText(); } public void logout() { driver.findElement(logout).click(); } }
LoginPage.java: Αυτή είναι η κλάση σελίδας σύνδεσης, στην οποία καθορίζονται όλα τα στοιχεία της σελίδας σύνδεσης και οι μέθοδοι.
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class LoginPage { WebDriver driver; By UserID = By.xpath('//*(contains(@id,'Login1_UserName'))'); By password = By.xpath('//*(contains(@id,'Login1_Password'))'); By Submit = By.xpath('//*(contains(@id,'Login1_LoginButton'))'); //Constructor to initialize object public LoginPage(WebDriver driver) { this .driver = driver; } public void loginToSite(String Username, String Password) { this .enterUsername(Username); this .enterPasssword(Password); this .clickSubmit(); } public void enterUsername(String Username) { driver.findElement(UserID).sendKeys(Username); } public void enterPasssword(String Password) { driver.findElement(password).sendKeys(Password); } public void clickSubmit() { driver.findElement(Submit).click(); } }
Βήμα 4: Δημιουργία δοκιμαστικών περιπτώσεων για το σενάριο σύνδεσης.
LoginTestCase.java: Αυτή είναι η κλάση LoginTestCase, όπου εκτελείται η δοκιμαστική υπόθεση. Ο χρήστης μπορεί επίσης να δημιουργήσει περισσότερες δοκιμαστικές περιπτώσεις ανάλογα με τις ανάγκες του έργου.
package testcases; import java.util.concurrent.TimeUnit; import library.Browser; import library.ScreenShot; import org.openqa.selenium.WebDriver; import org.testng.Assert; import org.testng.ITestResult; import org.testng.annotations.AfterMethod; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import pages.HomePage; import pages.LoginPage; public class LoginTestCase { WebDriver driver; LoginPage lp; HomePage hp; int i = 0; // Launch of the given browser. @BeforeTest public void browserlaunch() { driver = Browser.StartBrowser('Chrome', 'http://demostore.kenticolab.com/Special-Pages/Logon.aspx'); driver.manage().timeouts().implicitlyWait(30,TimeUnit. SECONDS ); lp = new LoginPage(driver); hp = new HomePage(driver); } // Login to the Site. @Test(priority = 1) public void Login() { lp.loginToSite('gaurav.3n@gmail.com','Test@123'); } // Verifing the Home Page. @Test(priority = 2) public void HomePageVerify() { String HomeText = hp.pageverify(); Assert.assertEquals(HomeText, 'Logged on as'); } // Logout the site. @Test(priority = 3) public void Logout() { hp.logout(); } // Taking Screen shot on test fail @AfterMethod public void screenshot(ITestResult result) { i = i+1; String name = 'ScreenShot'; String x = name+String.valueOf(i); if (ITestResult. FAILURE == result.getStatus()) { ScreenShot.captureScreenShot(driver, x); } } @AfterTest public void closeBrowser() { driver.close(); } }
Βήμα 5: Εκτελέστε το 'LoginTestCase.java'.
Βήμα 6: Έξοδος του μοντέλου αντικειμένου σελίδας:
- Εκκινήστε το πρόγραμμα περιήγησης Chrome.
- Ο ιστότοπος επίδειξης ανοίγει στο πρόγραμμα περιήγησης.
- Συνδεθείτε στον ιστότοπο επίδειξης.
- Επαληθεύστε την αρχική σελίδα.
- Αποσυνδεθείτε από τον ιστότοπο.
- Κλείστε το πρόγραμμα περιήγησης.
Τώρα, ας εξερευνήσουμε την πρωταρχική ιδέα αυτού του σεμιναρίου που τραβά την προσοχή, δηλαδή. 'Εργοστάσιο σελίδας'.
Τι είναι το Pagefactory;
Το PageFactory είναι ένας τρόπος εφαρμογής του 'Page Object Model'. Εδώ, ακολουθούμε την αρχή του διαχωρισμού του Page Object Repository και του Test Methods. Είναι μια ενσωματωμένη έννοια του Page Object Model που είναι πολύ βελτιστοποιημένη.
Ας έχουμε τώρα περισσότερη σαφήνεια σχετικά με τον όρο Pagefactory.
# 1) Πρώτον, η έννοια που ονομάζεται Pagefactory, παρέχει έναν εναλλακτικό τρόπο από την άποψη της σύνταξης και της σημασιολογίας για τη δημιουργία ενός αποθετηρίου αντικειμένων για τα στοιχεία ιστού σε μια σελίδα.
#δύο) Δεύτερον, χρησιμοποιεί μια ελαφρώς διαφορετική στρατηγική για την αρχικοποίηση των στοιχείων ιστού.
# 3) Το αποθετήριο αντικειμένων για τα στοιχεία ιστού UI θα μπορούσε να δημιουργηθεί χρησιμοποιώντας:
- Συνήθης «POM χωρίς Pagefactory» και,
- Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το 'POM with Pagefactory'.
Δίνεται παρακάτω μια εικονική παράσταση του ίδιου:
Τώρα θα εξετάσουμε όλες τις πτυχές που διαφοροποιούν το συνηθισμένο POM από το POM με το Pagefactory.
α) Η διαφορά στη σύνταξη του εντοπισμού ενός στοιχείου χρησιμοποιώντας το συνηθισμένο POM εναντίον POM με το Pagefactory.
Για παράδειγμα , Κάντε κλικ εδώ για να εντοπίσετε το πεδίο αναζήτησης που εμφανίζεται στη σελίδα.
POM χωρίς εργοστάσιο σελίδας:
# 1) Ακολουθεί ο τρόπος εντοπισμού του πεδίου αναζήτησης χρησιμοποιώντας το συνηθισμένο POM:
WebElement searchNSETxt=driver.findElement(By.id(“searchBox”));
# 2) Το παρακάτω βήμα μεταφέρει την τιμή «επένδυση» στο πεδίο Search NSE.
searchNSETxt.sendkeys(“investment”);
POM Χρησιμοποιώντας το Pagefactory:
# 1) Μπορείτε να εντοπίσετε το πεδίο αναζήτησης χρησιμοποιώντας το Pagefactory όπως φαίνεται παρακάτω.
Ο σχολιασμός @FindBy χρησιμοποιείται στο Pagefactory για την αναγνώριση ενός στοιχείου ενώ το POM χωρίς το Pagefactory χρησιμοποιεί το driver.findElement () μέθοδος εντοπισμού ενός στοιχείου.
Η δεύτερη δήλωση για το Pagefactory μετά @FindBy εκχωρεί έναν τύπο Στοιχείο Web κλάση που λειτουργεί ακριβώς παρόμοια με την εκχώρηση ενός ονόματος στοιχείου του τύπου WebElement class ως τύπο επιστροφής της μεθόδου driver.findElement () που χρησιμοποιείται στο συνηθισμένο POM (searchNSETxt σε αυτό το παράδειγμα).
Θα εξετάσουμε το @FindBy λεπτομερείς σχολιασμούς στο επερχόμενο μέρος αυτού του σεμιναρίου.
@FindBy(id = 'searchBox') WebElement searchNSETxt;
#δύο) Το παρακάτω βήμα μεταβιβάζει την τιμή «επένδυση» στο πεδίο Search NSE και η σύνταξη παραμένει η ίδια με αυτήν του συνηθισμένου POM (POM χωρίς Pagefactory).
searchNSETxt.sendkeys(“investment”);
β) Η διαφορά στη στρατηγική Αρχικοποίησης Στοιχείων Ιστού χρησιμοποιώντας συνηθισμένο POM εναντίον POM με το Pagefactory.
Χρήση POM χωρίς σελίδα εργοστασίου:
Δίνεται παρακάτω ένα απόσπασμα κώδικα για να ορίσετε τη διαδρομή του προγράμματος οδήγησης Chrome. Δημιουργείται μια παρουσία WebDriver με το πρόγραμμα οδήγησης ονόματος και το ChromeDriver εκχωρείται στο 'πρόγραμμα οδήγησης'. Στη συνέχεια, το ίδιο αντικείμενο προγράμματος οδήγησης χρησιμοποιείται για την εκκίνηση του ιστότοπου του Εθνικού Χρηματιστηρίου, εντοπίστε το searchBox και εισαγάγετε την τιμή συμβολοσειράς στο πεδίο.
Το σημείο που θέλω να επισημάνω εδώ είναι ότι όταν είναι POM χωρίς εργοστασιακή σελίδα, η παρουσία προγράμματος οδήγησης δημιουργείται αρχικά και κάθε στοιχείο ιστού αρχικοποιείται κάθε φορά όταν υπάρχει μια κλήση σε αυτό το στοιχείο ιστού χρησιμοποιώντας το driver.findElement () ή πρόγραμμα οδήγησης .findElements ().
Γι 'αυτό, με ένα νέο βήμα του driver.findElement () για ένα στοιχείο, η δομή DOM σαρώνεται ξανά και γίνεται ανανέωση της αναγνώρισης του στοιχείου σε αυτήν τη σελίδα.
System.setProperty('webdriver.chrome.driver', 'C:\eclipse-workspace\automationframework\src\test\java\Drivers\chromedriver.exe'); WebDriver driver = new ChromeDriver(); driver.get('http://www.nseindia.com/'); WebElement searchNSETxt=driver.findElement(By.id(“searchBox”)); searchNSETxt.sendkeys(“investment”);
Χρήση POM με το Pagefactory:
Εκτός από τη χρήση του σχολιασμού @FindBy αντί της μεθόδου driver.findElement (), το παρακάτω απόσπασμα κώδικα χρησιμοποιείται επιπλέον για το Pagefactory. Η στατική μέθοδος initElements () της κατηγορίας PageFactory χρησιμοποιείται για την προετοιμασία όλων των στοιχείων διεπαφής χρήστη στη σελίδα μόλις φορτωθεί η σελίδα.
public PagefactoryClass(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
Η παραπάνω στρατηγική κάνει την προσέγγιση PageFactory ελαφρώς διαφορετική από τη συνηθισμένη POM. Στο συνηθισμένο POM, το στοιχείο ιστού πρέπει να αρχικοποιηθεί ρητά ενώ στην προσέγγιση Pagefactory όλα τα στοιχεία αρχικοποιούνται με initElements () χωρίς να ξεκινά ρητά κάθε στοιχείο ιστού.
Για παράδειγμα: Εάν το WebElement δηλώθηκε αλλά δεν αρχικοποιήθηκε στο συνηθισμένο POM, τότε το σφάλμα 'προετοιμασία μεταβλητής' ή το NullPointerException ρίχνεται. Ως εκ τούτου, στο συνηθισμένο POM, κάθε WebElement πρέπει να αρχικοποιηθεί ρητά. Το PageFactory διαθέτει πλεονέκτημα έναντι του συνηθισμένου POM σε αυτήν την περίπτωση.
Ας μην αρχικοποιήσουμε το στοιχείο ιστού Ημερομηνία (POM χωρίς Pagefactory), μπορείτε να δείτε ότι το σφάλμα «Initialize μεταβλητή» εμφανίζει και ζητά από το χρήστη να την αρχικοποιήσει για να μηδενιστεί, επομένως, δεν μπορείτε να υποθέσετε ότι τα στοιχεία αρχίζουν έμμεσα να εντοπίζονται.
Το στοιχείο BDate ξεκίνησε ρητά (POM χωρίς Pagefactory):
Τώρα, ας δούμε μερικές περιπτώσεις ενός πλήρους προγράμματος χρησιμοποιώντας το PageFactory για να αποκλείσουμε οποιαδήποτε ασάφεια στην κατανόηση της πτυχής εφαρμογής.
Παράδειγμα 1:
- Μεταβείτε στη διεύθυνση 'http://www.nseindia.com/'
- Από το αναπτυσσόμενο μενού δίπλα στο πεδίο αναζήτησης, επιλέξτε 'Παράγωγα νομισμάτων'.
- Αναζήτηση για 'USDINR'. Επαληθεύστε το κείμενο «Δολάριο ΗΠΑ-Ινδική ρουπία - USDINR» στη σελίδα που προκύπτει.
Δομή προγράμματος:
- PagefactoryClass.java που περιλαμβάνει ένα αποθετήριο αντικειμένων που χρησιμοποιεί τη σελίδα εργοστασιακής έννοιας για το nseindia.com που είναι ένας κατασκευαστής για την αρχικοποίηση όλων των στοιχείων ιστού, δημιουργείται η μέθοδος selectCurrentDerivative () για να επιλέξετε την τιμή από το αναπτυσσόμενο πεδίο Searchbox, selectSymbol () για να επιλέξετε ένα σύμβολο στο σελίδα που εμφανίζεται στη συνέχεια και επαληθεύστε το κείμενο () για να επαληθεύσετε εάν η κεφαλίδα της σελίδας είναι όπως αναμένεται ή όχι.
- Το NSE_MainClass.java είναι το κύριο αρχείο κλάσης που καλεί όλες τις παραπάνω μεθόδους και εκτελεί τις αντίστοιχες ενέργειες στον ιστότοπο NSE.
PagefactoryClass.java
package com.pagefactory.knowledge; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import org.openqa.selenium.support.ui.Select; public class PagefactoryClass { WebDriver driver; @FindBy(id = 'QuoteSearch') WebElement Searchbox; @FindBy(id = 'cidkeyword') WebElement Symbol; @FindBy(id = 'companyName') WebElement pageText; public PagefactoryClass(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); } public void selectCurrentDerivative(String derivative) { Select select = new Select(Searchbox); select.selectByVisibleText(derivative); // 'Currency Derivatives' } public void selectSymbol(String symbol) { Symbol.sendKeys(symbol); } public void verifytext() { if (pageText.getText().equalsIgnoreCase('U S Dollar-Indian Rupee - USDINR')) { System.out.println('Page Header is as expected'); } else System.out.println('Page Header is NOT as expected'); } }
NSE_MainClass.java
package com.pagefactory.knowledge; import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class NSE_MainClass { static PagefactoryClass page; static WebDriver driver; public static void main(String() args) { System.setProperty('webdriver.chrome.driver', 'C:\Users\eclipse-workspace\automation-framework\src\test\java\Drivers\chromedriver.exe'); driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get('https://www.nseindia.com/'); driver.manage().window().maximize(); test_Home_Page_ofNSE(); } public static void test_Home_Page_ofNSE() throws StaleElementReferenceException { page = new PagefactoryClass(driver); page.selectCurrentDerivative('Currency Derivatives'); page.selectSymbol('USD'); List Options = driver.findElements(By.xpath('//span(contains(.,'USD'))')); int count = Options.size(); for (int i = 0; i Παράδειγμα 2:
- Μεταβείτε στη διεύθυνση 'https://www.shoppersstop.com/brands'
- Πλοηγηθείτε στο σύνδεσμο Haute curry.
- Επαληθεύστε εάν η σελίδα Haute Curry περιέχει το κείμενο 'Έναρξη νέου κάτι'.
Δομή προγράμματος
- shopperstopPagefactory.java που περιλαμβάνει ένα αποθετήριο αντικειμένων που χρησιμοποιεί το concept pagefactory για το shoppersstop.com που είναι κατασκευαστής για την αρχικοποίηση όλων των στοιχείων ιστού, δημιουργούνται μέθοδοι closeExtraPopup () για να χειριστεί ένα αναδυόμενο πλαίσιο ειδοποίησης που ανοίγει, κάντε κλικ στοOOHHuteCurryLink () για να κάνετε κλικ στο Haute Curry Συνδέστε και επαληθεύστεStartNewSomething () για να επαληθεύσετε εάν η σελίδα Haute Curry περιέχει το κείμενο 'Έναρξη νέου κάτι'.
- Το Shopperstop_CallPagefactory.java είναι το κύριο αρχείο κλάσης που καλεί όλες τις παραπάνω μεθόδους και εκτελεί τις αντίστοιχες ενέργειες στον ιστότοπο NSE.
shopperstopPagefactory.java
package com.inportia.automation_framework; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class shopperstopPagefactory { WebDriver driver; @FindBy(id='firstVisit') WebElement extrapopup; @FindBy(xpath='//img(@src='https://sslimages.shoppersstop.com /sys-master/root/haf/h3a/9519787376670/brandMedia_HauteCurry_logo.png')') WebElement HCLink; @FindBy(xpath='/html/body/main/footer/div(1)/p') WebElement Startnew; public shopperstopPagefactory(WebDriver driver) { this.driver=driver; PageFactory.initElements(driver, this); } public void closeExtraPopup() { extrapopup.click(); } public void clickOnHauteCurryLink() { JavascriptExecutor js = (JavascriptExecutor) driver; js.executeScript('arguments(0).click();',HCLink); js.executeAsyncScript('window.setTimeout(arguments(arguments.length - 1), 10000);'); if(driver.getCurrentUrl().equals('https://www.shoppersstop.com/haute-curry')) { System.out.println('We are on the Haute Curry page'); } else { System.out.println('We are NOT on the Haute Curry page'); } } public void verifyStartNewSomething() { if (Startnew.getText().equalsIgnoreCase('Start Something New')) { System.out.println('Start new something text exists'); } else System.out.println('Start new something text DOESNOT exists'); } }
Shopperstop_CallPagefactory.java
package com.inportia.automation_framework; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class Shopperstop_CallPagefactory extends shopperstopPagefactory { public Shopperstop_CallPagefactory(WebDriver driver) { super(driver); // TODO Auto-generated constructor stub } static WebDriver driver; public static void main(String() args) { System.setProperty('webdriver.chrome.driver', 'C:\eclipse-workspace\automation-framework\src\test\java\Drivers\chromedriver.exe'); driver = new ChromeDriver(); Shopperstop_CallPagefactory s1=new Shopperstop_CallPagefactory(driver); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get('https://www.shoppersstop.com/brands'); s1.clickOnHauteCurryLink(); s1.verifyStartNewSomething(); } }
POM Χρήση εργοστασιακής σελίδας
Εκπαιδευτικά βίντεο - POM With Page Factory
Μέρος Ι
Μέρος II
Μια εργοστασιακή κλάση χρησιμοποιείται για να κάνει τη χρήση αντικειμένων σελίδας απλούστερη και ευκολότερη.
- Πρώτον, πρέπει να βρούμε τα στοιχεία ιστού με σχολιασμό @FindBy σε τάξεις σελίδων .
- Στη συνέχεια, αρχικοποιήστε τα στοιχεία χρησιμοποιώντας το initElements () κατά την εγκατάσταση της κλάσης σελίδων.
# 1) @FindBy:
Ο σχολιασμός @FindBy χρησιμοποιείται στο PageFactory για τον εντοπισμό και τη δήλωση των στοιχείων ιστού χρησιμοποιώντας διαφορετικούς εντοπιστές.Εδώ, μεταβιβάζουμε το χαρακτηριστικό καθώς και την τιμή που χρησιμοποιείται για τον εντοπισμό του στοιχείου ιστού στον σχολιασμό @FindBy και στη συνέχεια δηλώνεται το WebElement.
Υπάρχουν 2 τρόποι με τους οποίους μπορεί να χρησιμοποιηθεί ο σχολιασμός.
Για παράδειγμα:
@FindBy(how = How.ID, using='EmailAddress') WebElement Email; @FindBy(id='EmailAddress') WebElement Email;
Ωστόσο, το πρώτο είναι ο τυπικός τρόπος δήλωσης WebElements.
'Πως' είναι μια κλάση και έχει στατικές μεταβλητές όπως ID, XPATH, CLASSNAME, LINKTEXT κ.λπ.
'χρησιμοποιώντας' - Για να αντιστοιχίσετε μια τιμή σε μια στατική μεταβλητή.
Στα παραπάνω παράδειγμα , χρησιμοποιήσαμε το χαρακτηριστικό 'id' για τον εντοπισμό του στοιχείου ιστού 'Email'. Ομοίως, μπορούμε να χρησιμοποιήσουμε τους ακόλουθους εντοπιστές με τους σχολιασμούς @FindBy:
- όνομα τάξης
- css
- όνομα
- xpath
- όνομα ετικέτας
- linkText
- partialLinkText
# 2) initElements ():
Το initElements είναι μια στατική μέθοδος της κατηγορίας PageFactory που χρησιμοποιείται για την προετοιμασία όλων των στοιχείων ιστού που βρίσκονται στο σχολιασμό @FindBy. Έτσι, δημιουργώντας εύκολα τις κατηγορίες σελίδων.
initElements(WebDriver driver, java.lang.Class pageObjectClass)
Πρέπει επίσης να καταλάβουμε ότι το POM ακολουθεί τις αρχές OOPS.
- Τα WebElements δηλώνονται ως μεταβλητές ιδιωτικών μελών (Απόκρυψη δεδομένων).
- Δεσμευτικά WebElements με αντίστοιχες μεθόδους (Encapsulation).
Βήματα για τη δημιουργία POM χρησιμοποιώντας πρότυπο εργοστασιακής σελίδας
# 1) Δημιουργήστε ένα ξεχωριστό αρχείο κλάσης Java για κάθε ιστοσελίδα.
#δύο) Σε κάθε κλάση, όλα τα WebElements πρέπει να δηλώνονται ως μεταβλητές (χρησιμοποιώντας σχολιασμό - @FindBy) και να αρχικοποιούνται χρησιμοποιώντας τη μέθοδο initElement (). Τα WebElements που δηλώθηκαν πρέπει να αρχικοποιηθούν για να χρησιμοποιηθούν στις μεθόδους δράσης.
# 3) Ορίστε τις αντίστοιχες μεθόδους που δρουν σε αυτές τις μεταβλητές.
Ας πάρουμε ένα παράδειγμα ενός απλού σεναρίου:
- Ανοίξτε τη διεύθυνση URL μιας εφαρμογής.
- Πληκτρολογήστε τη διεύθυνση email και τα δεδομένα κωδικού πρόσβασης.
- Κάντε κλικ στο κουμπί Είσοδος.
- Επαληθεύστε το επιτυχές μήνυμα σύνδεσης στη σελίδα αναζήτησης.
Επίπεδο σελίδας
Εδώ έχουμε 2 σελίδες,
- Αρχική σελίδα - Η σελίδα που ανοίγει κατά την εισαγωγή του URL και όπου εισάγουμε τα δεδομένα για σύνδεση.
- Σελίδα αναζήτησης - Μια σελίδα που εμφανίζεται μετά από μια επιτυχημένη σύνδεση.
Στο Page Layer, κάθε σελίδα στην εφαρμογή Web δηλώνεται ως ξεχωριστή κλάση Java και αναφέρονται οι εντοπιστές και οι ενέργειές της.
Βήματα για τη δημιουργία POM με παράδειγμα σε πραγματικό χρόνο
# 1) Δημιουργήστε μια τάξη Java για κάθε σελίδα:
Σε αυτό παράδειγμα , θα έχουμε πρόσβαση σε 2 ιστοσελίδες, «Αρχική σελίδα» και «Αναζήτηση».
Ως εκ τούτου, θα δημιουργήσουμε 2 τάξεις Java στο Page Layer (ή σε ένα πακέτο, com.automation.pages).
Package Name :com.automation.pages HomePage.java SearchPage.java
# 2) Ορίστε WebElements ως μεταβλητές χρησιμοποιώντας το Σχολιασμό @FindBy:
Θα αλληλεπιδρούσαμε με:
- Πεδίο Email, Password, Login στην Αρχική σελίδα.
- Επιτυχές μήνυμα στη σελίδα αναζήτησης.
Έτσι θα ορίσουμε WebElements χρησιμοποιώντας το @FindBy
Για παράδειγμα: Εάν πρόκειται να προσδιορίσουμε το EmailAddress χρησιμοποιώντας το αναγνωριστικό χαρακτηριστικού, τότε η μεταβλητή δήλωση είναι
//Locator for EmailId field @FindBy(how=How.ID,using='EmailId') private WebElementEmailIdAddress;
# 3) Δημιουργήστε μεθόδους για ενέργειες που εκτελούνται στο WebElements.
Οι παρακάτω ενέργειες εκτελούνται στο WebElements:
- Πληκτρολογήστε ενέργεια στο πεδίο Διεύθυνση email.
- Πληκτρολογήστε ενέργεια στο πεδίο Κωδικός πρόσβασης.
- Κάντε κλικ στην ενέργεια στο κουμπί σύνδεσης.
Για παράδειγμα, Οι μέθοδοι που καθορίζονται από τον χρήστη δημιουργούνται για κάθε ενέργεια στο WebElement όπως,
public void typeEmailId(String Id){ driver.findElement(EmailAddress).sendKeys(Id) }
Εδώ, το αναγνωριστικό μεταδίδεται ως παράμετρος στη μέθοδο, καθώς η εισαγωγή θα σταλεί από το χρήστη από την κύρια δοκιμαστική περίπτωση.
Σημείωση :Πρέπει να δημιουργηθεί ένας κατασκευαστής σε κάθε κλάση στο Page Layer, προκειμένου να ληφθεί η παρουσία προγράμματος οδήγησης από την Κύρια κλάση στο Test Layer και επίσης να αρχικοποιηθούν τα WebElements (Page Objects) που δηλώνονται στην τάξη σελίδων χρησιμοποιώντας το PageFactory.InitElement () .
Δεν ξεκινάμε το πρόγραμμα οδήγησης εδώ, αλλά η παρουσία του λαμβάνεται από την Κύρια τάξη όταν δημιουργείται το αντικείμενο της τάξης Page Layer.
InitElement () - χρησιμοποιείται για την αρχικοποίηση των WebElements που δηλώθηκαν, χρησιμοποιώντας την παρουσία προγράμματος οδήγησης από την κύρια κλάση. Με άλλα λόγια, τα WebElements δημιουργούνται χρησιμοποιώντας την παρουσία προγράμματος οδήγησης. Μόνο μετά την προετοιμασία των WebElements, μπορούν να χρησιμοποιηθούν στις μεθόδους για την εκτέλεση ενεργειών.
Δημιουργούνται δύο τάξεις Java για κάθε σελίδα όπως φαίνεται παρακάτω:
HomePage.java
//package com.automation.pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class HomePage { WebDriver driver; // Locator for Email Address @FindBy(how=How.ID,using='EmailId') private WebElement EmailIdAddress; // Locator for Password field @FindBy(how=How.ID,using='Password ') private WebElement Password; // Locator for SignIn Button @FindBy(how=How.ID,using='SignInButton') private WebElement SignInButton; // Method to type EmailId public void typeEmailId(String Id){ driver.findElement(EmailAddress).sendKeys(Id) } // Method to type Password public void typePassword(String PasswordValue){ driver.findElement(Password).sendKeys(PasswordValue) } // Method to click SignIn Button public void clickSignIn(){ driver.findElement(SignInButton).click() } // Constructor // Gets called when object of this page is created in MainClass.java public HomePage(WebDriver driver) { // 'this' keyword is used here to distinguish global and local variable 'driver' //gets driver as parameter from MainClass.java and assigns to the driver instance in this class this.driver=driver; PageFactory.initElements(driver,this); // Initialises WebElements declared in this class using driver instance. } }
SearchPage.Java
//package com.automation.pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class SearchPage{ WebDriver driver; // Locator for Success Message @FindBy(how=How.ID,using='Message') private WebElement SuccessMessage; // Method that return True or False depending on whether the message is displayed public Boolean MessageDisplayed(){ Boolean status = driver.findElement(SuccessMessage).isDisplayed(); return status; } // Constructor // This constructor is invoked when object of this page is created in MainClass.java public SearchPage(WebDriver driver) { // 'this' keyword is used here to distinguish global and local variable 'driver' //gets driver as parameter from MainClass.java and assigns to the driver instance in this class this.driver=driver; PageFactory.initElements(driver,this); // Initialises WebElements declared in this class using driver instance. } }
Δοκιμή επιπέδου
Οι δοκιμαστικές περιπτώσεις εφαρμόζονται σε αυτήν την τάξη. Δημιουργούμε ένα ξεχωριστό πακέτο, com.automation.test και, στη συνέχεια, δημιουργούμε ένα Java Class εδώ (MainClass.java)
Βήματα για τη δημιουργία δοκιμαστικών περιπτώσεων:
- Αρχικοποιήστε το πρόγραμμα οδήγησης και ανοίξτε την εφαρμογή.
- Δημιουργήστε ένα αντικείμενο της κλάσης PageLayer (για κάθε ιστοσελίδα) και μεταβιβάστε την παρουσία προγράμματος οδήγησης ως παράμετρο.
- Χρησιμοποιώντας το αντικείμενο που δημιουργήθηκε, πραγματοποιήστε μια κλήση προς τις μεθόδους στην Κατηγορία PageLayer (για κάθε ιστοσελίδα) για να εκτελέσετε ενέργειες / επαλήθευση.
- Επαναλάβετε το βήμα 3 έως ότου εκτελεστούν όλες οι ενέργειες και μετά κλείστε το πρόγραμμα οδήγησης.
//package com.automation.test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class MainClass { public static void main(String() args) { System.setProperty('webdriver.chrome.driver','./exefiles/chromedriver.exe'); WebDriver driver= new ChromeDriver(); driver.manage().window().maximize(); driver.get('URL mentioned here'); // Creating object of HomePage and driver instance is passed as parameter to constructor of Homepage.Java HomePage homePage= new HomePage(driver); // Type EmailAddress homePage.typeEmailId('abc@ymail.com'); // EmailId value is passed as paramter which in turn will be assigned to the method in HomePage.Java // Type Password Value homePage.typePassword('password123'); // Password value is passed as paramter which in turn will be assigned to the method in HomePage.Java // Click on SignIn Button homePage.clickSignIn(); // Creating an object of LoginPage and driver instance is passed as parameter to constructor of SearchPage.Java SearchPage searchPage= new SearchPage(driver); //Verify that Success Message is displayed Assert.assertTrue(searchPage.MessageDisplayed()); //Quit browser driver.quit(); } }
Ιεραρχία τύπου σχολιασμού που χρησιμοποιείται για τη δήλωση στοιχείων Web
Οι σχολιασμοί χρησιμοποιούνται για τη δημιουργία στρατηγικής τοποθεσίας για τα στοιχεία διεπαφής χρήστη.
# 1) @FindBy
Όσον αφορά το Pagefactory, το @FindBy λειτουργεί ως μαγικό ραβδί. Προσθέτει όλη τη δύναμη στην ιδέα. Γνωρίζετε τώρα ότι ο σχολιασμός @FindBy στο Pagefactory εκτελεί το ίδιο με αυτό του driver.findElement () στο συνηθισμένο μοντέλο αντικειμένου σελίδας. Χρησιμοποιείται για τον εντοπισμό WebElement / WebElements με ένα κριτήριο .
# 2) @FindBys
Χρησιμοποιείται για τον εντοπισμό του WebElement με περισσότερα από ένα κριτήρια και πρέπει να πληρούν όλα τα κριτήρια. Αυτά τα κριτήρια πρέπει να αναφέρονται σε σχέση γονέα-παιδιού. Με άλλα λόγια, αυτό χρησιμοποιεί τη σχέση AND υπό όρους για τον εντοπισμό των WebElements χρησιμοποιώντας τα καθορισμένα κριτήρια. Χρησιμοποιεί πολλά @FindBy για να καθορίσει κάθε κριτήριο.
Για παράδειγμα:
Πηγαίος κώδικας HTML ενός WebElement:
Σε POM:
@FindBys({ @FindBy(id = 'searchId_1'), @FindBy(name = 'search_field') }) WebElementSearchButton;
Στο παραπάνω παράδειγμα, το WebElement «SearchButton» βρίσκεται μόνο αν υπάρχει ταιριάζει και στα δύο τα κριτήρια των οποίων η τιμή αναγνωριστικού είναι 'searchId_1' και η τιμή ονόματος είναι 'search_field'. Λάβετε υπόψη ότι τα πρώτα κριτήρια ανήκουν σε μια γονική ετικέτα και τα δεύτερο κριτήρια για μια θυγατρική ετικέτα.
# 3) @FindAll
Χρησιμοποιείται για τον εντοπισμό του WebElement με περισσότερα από ένα κριτήρια και πρέπει να πληροί τουλάχιστον ένα από τα δεδομένα κριτήρια. Αυτό χρησιμοποιεί σχέσεις OR υπό όρους για τον εντοπισμό WebElements. Χρησιμοποιεί πολλά @FindBy για να καθορίσει όλα τα κριτήρια.
Για παράδειγμα:
Κωδικός πηγής HTML:
Σε POM:
@FindBys({ @FindBy(id = 'UsernameNameField_1'), // doesn’t match @FindBy(name = 'User_Id') //matches @FindBy(className = “UserName_r”) //matches }) WebElementUserName;
Στο παραπάνω παράδειγμα, το WebElement «Όνομα χρήστη βρίσκεται αν είναι ταιριάζει με τουλάχιστον ένα των κριτηρίων που αναφέρονται.
# 4) @CacheLookUp
Όταν το WebElement χρησιμοποιείται συχνότερα σε δοκιμαστικές περιπτώσεις, το Selenium αναζητά το WebElement κάθε φορά που εκτελείται το δοκιμαστικό σενάριο. Σε αυτές τις περιπτώσεις, όπου ορισμένα WebElements χρησιμοποιούνται παγκοσμίως για όλα τα TC ( Για παράδειγμα, Το σενάριο σύνδεσης συμβαίνει για κάθε TC), αυτός ο σχολιασμός μπορεί να χρησιμοποιηθεί για τη διατήρηση αυτών των WebElements στη μνήμη cache μόλις διαβαστεί για πρώτη φορά.
Αυτό, με τη σειρά του, βοηθά τον κώδικα να εκτελείται ταχύτερα επειδή κάθε φορά που δεν χρειάζεται να αναζητά το WebElement στη σελίδα, αλλά μπορεί να πάρει την αναφορά του από τη μνήμη.
Αυτό μπορεί να είναι ως πρόθεμα με οποιοδήποτε από τα @FindBy, @FindBys και @FindAll.
Για παράδειγμα:
@CacheLookUp @FindBys({ @FindBy(id = 'UsernameNameField_1'), @FindBy(name = 'User_Id') @FindBy(className = “UserName_r”) }) WebElementUserName;
Σημειώστε επίσης ότι αυτός ο σχολιασμός θα πρέπει να χρησιμοποιείται μόνο σε WebElements των οποίων η τιμή χαρακτηριστικού (όπως xpath, όνομα id, όνομα κλάσης κ.λπ.) δεν αλλάζει αρκετά συχνά. Μόλις το WebElement εντοπιστεί για πρώτη φορά, διατηρεί την αναφορά του στη μνήμη cache.
Έτσι, τότε συμβαίνει μια αλλαγή στο χαρακτηριστικό WebElement μετά από λίγες ημέρες, το Selenium δεν θα μπορεί να εντοπίσει το στοιχείο, επειδή έχει ήδη την παλιά του αναφορά στη μνήμη cache και δεν θα λάβει υπόψη την πρόσφατη αλλαγή στο WebElement.
Περισσότερα στο PageFactory.initElements ()
Τώρα που καταλαβαίνουμε τη στρατηγική του Pagefactory για την αρχικοποίηση των στοιχείων ιστού χρησιμοποιώντας το InitElements (), ας προσπαθήσουμε να κατανοήσουμε τις διαφορετικές εκδόσεις της μεθόδου.
Η μέθοδος, όπως γνωρίζουμε, παίρνει το αντικείμενο του προγράμματος οδήγησης και το αντικείμενο της τρέχουσας κλάσης ως παραμέτρους εισόδου και επιστρέφει το αντικείμενο σελίδας, αρχίζοντας με έμμεσο και προληπτικό τρόπο όλα τα στοιχεία της σελίδας.
Στην πράξη, η χρήση του κατασκευαστή όπως φαίνεται στην παραπάνω ενότητα είναι προτιμότερη από τους άλλους τρόπους χρήσης του.
Εναλλακτικοί τρόποι κλήσης της μεθόδου είναι:
# 1) Αντί να χρησιμοποιήσετε το δείκτη 'αυτό', μπορείτε να δημιουργήσετε το τρέχον αντικείμενο κλάσης, να μεταβιβάσετε την παρουσία προγράμματος οδήγησης σε αυτό και να καλέσετε τη στατική μέθοδο initElements με παραμέτρους, δηλαδή το αντικείμενο προγράμματος οδήγησης και το αντικείμενο κλάσης που μόλις δημιουργήθηκε.
public PagefactoryClass(WebDriver driver) { //version 2 PagefactoryClass page=new PagefactoryClass(driver); PageFactory.initElements(driver, page); }
#δύο) Ο τρίτος τρόπος για την αρχικοποίηση στοιχείων χρησιμοποιώντας την κλάση Pagefactory είναι με τη χρήση του api που ονομάζεται “reflect”. Ναι, αντί να δημιουργήσετε ένα αντικείμενο κλάσης με μια «νέα» λέξη-κλειδί, το classname.class μπορεί να περάσει ως μέρος της παραμέτρου εισαγωγής initElements ().
public PagefactoryClass(WebDriver driver) { //version 3 PagefactoryClass page=PageFactory.initElements(driver, PagefactoryClass.class); }
Συχνές Ερωτήσεις
Ε # 1) Ποιες είναι οι διαφορετικές στρατηγικές εντοπισμού που χρησιμοποιούνται για το @FindBy;
Απάντηση: Η απλή απάντηση σε αυτό είναι ότι δεν υπάρχουν διαφορετικές στρατηγικές εντοπισμού που χρησιμοποιούνται για το @FindBy.
Χρησιμοποιούν τις ίδιες 8 στρατηγικές εντοπισμού που χρησιμοποιεί η μέθοδος findElement () στις συνήθεις POM:
- ταυτότητα
- όνομα
- όνομα τάξης
- xpath
- css
- όνομα ετικέτας
- linkText
- partialLinkText
Ε # 2) Υπάρχουν διαφορετικές εκδόσεις στη χρήση των σχολίων @FindBy;
Απάντηση: Όταν υπάρχει ένα στοιχείο ιστού προς αναζήτηση, χρησιμοποιούμε τον σχολιασμό @FindBy. Θα επεξεργαστούμε τους εναλλακτικούς τρόπους χρήσης του @FindBy μαζί με τις διαφορετικές στρατηγικές εντοπισμού επίσης.
Έχουμε ήδη δει πώς να χρησιμοποιήσουμε την έκδοση 1 του @FindBy:
@FindBy(id = 'cidkeyword') WebElement Symbol;
Η έκδοση 2 του @FindBy μεταβιβάζει την παράμετρο εισαγωγής ως Πως και Χρησιμοποιώντας .
Πως ψάχνει για τη στρατηγική εντοπισμού χρησιμοποιώντας την οποία θα αναγνωριστεί το webelement. Η λέξη-κλειδί χρησιμοποιώντας καθορίζει την τιμή εντοπισμού.
Δείτε παρακάτω για καλύτερη κατανόηση,
- Το How.ID αναζητά το στοιχείο χρησιμοποιώντας ταυτότητα στρατηγική και το στοιχείο που προσπαθεί να προσδιορίσει έχει id = λέξη-κλειδί.
@FindBy(how = How.ID, using = ' cidkeyword') WebElement Symbol;
- Πώς.CLASS_NAME αναζητά το στοιχείο χρησιμοποιώντας όνομα τάξης στρατηγική και το στοιχείο που προσπαθεί να προσδιορίσει έχει κλάση = νέα τάξη.
@FindBy(how = How.CLASS_NAME, using = 'newclass') WebElement Symbol;
Q # 3) Υπάρχει διαφορά μεταξύ των δύο εκδόσεων του @FindBy;
Απάντηση: Η απάντηση είναι Όχι, δεν υπάρχει διαφορά μεταξύ των δύο εκδόσεων. Είναι απλώς ότι η πρώτη έκδοση είναι μικρότερη και ευκολότερη σε σύγκριση με τη δεύτερη έκδοση.
Ε # 4) Τι μπορώ να χρησιμοποιήσω στο εργοστάσιο σελίδας σε περίπτωση που υπάρχει μια λίστα με στοιχεία ιστού που θα εντοπιστούν;
Απάντηση: Στο συνηθισμένο σχέδιο σχεδίασης αντικειμένων σελίδας, έχουμε το driver.findElements () για να εντοπίσουμε πολλά στοιχεία που ανήκουν στην ίδια κλάση ή όνομα ετικέτας, αλλά πώς εντοπίζουμε τέτοια στοιχεία στην περίπτωση του μοντέλου αντικειμένου σελίδας με το Pagefactory; Ο ευκολότερος τρόπος για να επιτύχετε τέτοια στοιχεία είναι να χρησιμοποιήσετε τον ίδιο σχολιασμό @FindBy.
Καταλαβαίνω ότι αυτή η γραμμή φαίνεται να είναι μια κεφαλή για πολλούς από εσάς. Αλλά ναι, είναι η απάντηση στην ερώτηση.
Ας δούμε το παρακάτω παράδειγμα:
Χρησιμοποιώντας το συνηθισμένο μοντέλο αντικειμένου σελίδας χωρίς Pagefactory, χρησιμοποιείτε το driver.findElements για να εντοπίσετε πολλά στοιχεία όπως φαίνεται παρακάτω:
private List multipleelements_driver_findelements = driver.findElements (By.class(“last”));
Το ίδιο μπορεί να επιτευχθεί χρησιμοποιώντας το μοντέλο αντικειμένου σελίδας με το Pagefactory όπως δίνεται παρακάτω:
@FindBy (how = How.CLASS_NAME, using = 'last') private List multipleelements_FindBy;
Βασικά, η αντιστοίχιση των στοιχείων σε μια λίστα τύπου WebElement κάνει το τέχνασμα ανεξάρτητα από το αν το Pagefactory έχει χρησιμοποιηθεί ή όχι κατά την αναγνώριση και τον εντοπισμό των στοιχείων.
Ε # 5) Μπορούν να χρησιμοποιηθούν τόσο το σχέδιο αντικειμένων σελίδας χωρίς σελίδα εργοστασίου όσο και με το Pagefactory στο ίδιο πρόγραμμα;
Απάντηση: Ναι, τόσο ο σχεδιασμός αντικειμένου σελίδας χωρίς Pagefactory όσο και με το Pagefactory μπορούν να χρησιμοποιηθούν στο ίδιο πρόγραμμα. Μπορείτε να ακολουθήσετε το πρόγραμμα που δίνεται παρακάτω στο Απάντηση στην ερώτηση # 6 για να δείτε πώς χρησιμοποιούνται και τα δύο στο πρόγραμμα.
Ένα πράγμα που πρέπει να θυμάστε είναι ότι η ιδέα του Pagefactory με τη δυνατότητα προσωρινής αποθήκευσης πρέπει να αποφεύγεται σε δυναμικά στοιχεία, ενώ ο σχεδιασμός αντικειμένου σελίδας λειτουργεί καλά για δυναμικά στοιχεία. Ωστόσο, το Pagefactory ταιριάζει μόνο στατικά στοιχεία.
Ε # 6) Υπάρχουν εναλλακτικοί τρόποι ταυτοποίησης στοιχείων βάσει πολλαπλών κριτηρίων;
διαφορά μεταξύ δοκιμής φορτίου και δοκιμών απόδοσης
Απάντηση: Η εναλλακτική λύση για τον προσδιορισμό στοιχείων βάσει πολλαπλών κριτηρίων είναι η χρήση των σχολιασμών @FindAll και @FindBys. Αυτοί οι σχολιασμοί βοηθούν στον εντοπισμό μεμονωμένων ή πολλαπλών στοιχείων ανάλογα με τις τιμές που λαμβάνονται από τα κριτήρια που περνούν σε αυτό.
# 1) @FindAll:
Το @FindAll μπορεί να περιέχει πολλά @FindBy και θα επιστρέψει όλα τα στοιχεία που ταιριάζουν με οποιοδήποτε @FindBy σε μία λίστα. Το @FindAll χρησιμοποιείται για την επισήμανση ενός πεδίου σε ένα αντικείμενο σελίδας για να υποδείξει ότι η αναζήτηση θα πρέπει να χρησιμοποιεί μια σειρά ετικετών @FindBy. Στη συνέχεια, θα αναζητήσει όλα τα στοιχεία που ταιριάζουν με οποιοδήποτε από τα κριτήρια FindBy.
Σημειώστε ότι τα στοιχεία δεν είναι εγγυημένα ότι είναι σε σειρά εγγράφων.
Η σύνταξη για χρήση του @FindAll έχει ως εξής:
@FindAll( { @FindBy(how = How.ID, using = 'foo'), @FindBy(className = 'bar') } )
Εξήγηση: Το @FindAll θα αναζητήσει και θα εντοπίσει ξεχωριστά στοιχεία σύμφωνα με καθένα από τα κριτήρια @FindBy και θα τα απαριθμήσει. Στο παραπάνω παράδειγμα, θα αναζητήσει πρώτα ένα στοιχείο του οποίου το id = 'foo' και στη συνέχεια, θα αναγνωρίσει το δεύτερο στοιχείο με το className = 'bar'.
Υποθέτοντας ότι εντοπίστηκε ένα στοιχείο για κάθε κριτήριο FindBy, το @FindAll θα έχει ως αποτέλεσμα την καταχώριση 2 στοιχείων, αντίστοιχα. Θυμηθείτε, μπορεί να υπάρχουν πολλά στοιχεία που προσδιορίζονται για κάθε κριτήριο. Έτσι, με απλά λόγια, @ Βρείτε όλα ενεργεί ισοδύναμα με το Ή τελεστής με τα κριτήρια @FindBy.
# 2) @FindBys:
Το FindBys χρησιμοποιείται για την επισήμανση ενός πεδίου σε ένα αντικείμενο σελίδας για να υποδείξει ότι η αναζήτηση θα πρέπει να χρησιμοποιεί μια σειρά ετικετών @FindBy σε μια αλυσίδα όπως περιγράφεται στο ByChained. Όταν τα απαιτούμενα αντικείμενα WebElement πρέπει να ταιριάζουν με όλα τα δεδομένα κριτήρια, χρησιμοποιήστε σχολιασμό @FindBys.
Η σύνταξη για χρήση του @FindBys έχει ως εξής:
@FindBys( { @FindBy(name=”foo”) @FindBy(className = 'bar') } )
Εξήγηση: Το @FindBys θα αναζητήσει και θα εντοπίσει στοιχεία που συμμορφώνονται με όλα τα κριτήρια @FindBy και θα τα απαριθμήσει. Στο παραπάνω παράδειγμα, θα αναζητήσει στοιχεία των οποίων το όνομα = 'foo' και className = 'bar'.
Το @FindAll θα έχει ως αποτέλεσμα την καταχώριση ενός στοιχείου εάν υποθέσουμε ότι υπήρχε ένα στοιχείο που προσδιορίστηκε με το όνομα και το όνομα κλάσης στα δεδομένα κριτήρια.
Εάν δεν υπάρχει ένα στοιχείο που να πληροί όλες τις συνθήκες FindBy που έχουν περάσει, τότε το αποτέλεσμα του @FindBys θα είναι μηδενικά στοιχεία. Θα μπορούσε να υπάρχει μια λίστα στοιχείων ιστού που να προσδιορίζονται εάν όλες οι συνθήκες ικανοποιούν πολλά στοιχεία. Με απλά λόγια, @ FindBys ενεργεί ισοδύναμα με το ΚΑΙ τελεστής με τα κριτήρια @FindBy.
Ας δούμε την εφαρμογή όλων των παραπάνω σχολίων μέσω ενός λεπτομερούς προγράμματος:
Θα τροποποιήσουμε το πρόγραμμα www.nseindia.com που δόθηκε στην προηγούμενη ενότητα για να κατανοήσουμε την εφαρμογή των σχολιασμών @FindBy, @FindBys και @FindAll
# 1) Το αποθετήριο αντικειμένων του PagefactoryClass ενημερώνεται ως εξής:
Λίστα newlist = driver.findElements (By.tagName ('a'));
@FindBy (πώς = Πώς. TAG_NAME , χρησιμοποιώντας = 'a')
ιδιωτικός Λίστα εύρεσης τιμής;
@FindAll ({ @FindBy (className = 'sel'), @FindBy (xpath = '// a (@ id = 'tab5 ′)')}})
ιδιωτικός Λίστα εύρεσης
@FindBys ({ @FindBy (className = 'sel'), @FindBy (xpath = '// a (@ id = 'tab5 ′)')}})
ιδιωτικός Λίστα εύρεσης τιμή;
# 2) Μια νέα μέθοδος seeHowFindWorks () γράφεται στο PagefactoryClass και καλείται ως η τελευταία μέθοδος στην κύρια τάξη.
Η μέθοδος έχει ως εξής:
private void seeHowFindWorks() { System.out.println('driver.findElements(By.tagName()) '+newlist.size()); System.out.println('count of @FindBy- list elements '+findbyvalue.size()); System.out.println('count of @FindAll elements '+findallvalue.size()); for(int i=0;i Δίνεται παρακάτω το αποτέλεσμα που εμφανίζεται στο παράθυρο της κονσόλας μετά την εκτέλεση του προγράμματος:
Ας προσπαθήσουμε τώρα να κατανοήσουμε λεπτομερώς τον κώδικα:
# 1) Μέσω του μοτίβου σχεδίασης αντικειμένου σελίδας, το στοιχείο 'newlist' προσδιορίζει όλες τις ετικέτες με το άγκυρα 'a'. Με άλλα λόγια, λαμβάνουμε μια μέτρηση όλων των συνδέσμων στη σελίδα.
Μάθαμε ότι το pagefactory @FindBy κάνει την ίδια δουλειά με αυτή του driver.findElement (). Το στοιχείο findbyvalue δημιουργείται για να πάρει τον αριθμό όλων των συνδέσμων στη σελίδα μέσω μιας στρατηγικής αναζήτησης που έχει μια έννοια εργοστασίου σελίδας.
Αποδεικνύεται σωστό ότι τόσο το driver.findElement () όσο και το @FindBy κάνουν την ίδια δουλειά και προσδιορίζουν τα ίδια στοιχεία. Αν κοιτάξετε το στιγμιότυπο οθόνης του παραθύρου της κονσόλας που προκύπτει παραπάνω, ο αριθμός των συνδέσμων που προσδιορίζονται με τη νέα λίστα στοιχείων και του εύρους εύρεσης είναι ίσος, δηλαδή. 299 σύνδεσμοι που βρέθηκαν στη σελίδα.
Το αποτέλεσμα έδειξε ως εξής:
driver.findElements(By.tagName()) 299 count of @FindBy- list elements 299
#δύο) Εδώ αναλύουμε τη λειτουργία του σχολιασμού @FindAll που θα σχετίζεται με τη λίστα των στοιχείων ιστού με το όνομα findallvalue.
Κοιτάζοντας προσεκτικά κάθε κριτήριο @FindBy στο σχολιασμό @FindAll, τα πρώτα κριτήρια @FindBy αναζητούν στοιχεία με το className = 'sel' και το δεύτερο κριτήριο @FindBy αναζητά ένα συγκεκριμένο στοιχείο με XPath = '// a (@ id = 'tab5')
Ας πατήσουμε τώρα το F12 για να ελέγξουμε τα στοιχεία της σελίδας nseindia.com και να λάβουμε ορισμένες σαφήνεια στα στοιχεία που αντιστοιχούν στα κριτήρια @FindBy.
Υπάρχουν δύο στοιχεία στη σελίδα που αντιστοιχούν στο className = 'sel':
προς την) Το στοιχείο 'Βασικές αρχές' έχει την ετικέτα λίστας, δηλαδή
με className = 'sel'. Δείτε το στιγμιότυπο παρακάτω
σι) Ένα άλλο στοιχείο 'Βιβλίο παραγγελίας' έχει ένα XPath με μια ετικέτα αγκύρωσης που έχει το όνομα της τάξης ως 'sel'.
ντο) Το δεύτερο @FindBy με XPath έχει μια ετικέτα αγκύρωσης του οποίου ταυτότητα είναι ' καρτέλα5 '. Υπάρχει μόνο ένα στοιχείο που προσδιορίζεται ως απάντηση στην αναζήτηση που είναι Βασικές αρχές.
Δείτε το στιγμιότυπο παρακάτω:
Όταν εκτελέστηκε η δοκιμή nseindia.com, λάβαμε τον αριθμό των στοιχείων που αναζητήθηκαν.
@FindAll as 3. Τα στοιχεία για εύρεση τιμής όταν εμφανίστηκαν ήταν: Βασικά ως το 0ουστοιχείο ευρετηρίου, Βιβλίο παραγγελίας ως το 1αγστοιχείο ευρετηρίου και Βασικές αρχές ξανά ως 2αρστοιχείο ευρετηρίου. Έχουμε ήδη μάθει ότι το @FindAll αναγνωρίζει ξεχωριστά στοιχεία για κάθε κριτήριο @FindBy.
Σύμφωνα με το ίδιο πρωτόκολλο, για την πρώτη αναζήτηση κριτηρίου, δηλαδή className = 'sel', εντόπισε δύο στοιχεία που πληρούν την προϋπόθεση και απέκτησε το 'Βασικές αρχές' και το 'Βιβλίο παραγγελίας'.
Στη συνέχεια, μεταφέρθηκε στα επόμενα κριτήρια @FindBy και σύμφωνα με το xpath που δόθηκε για το δεύτερο @FindBy, θα μπορούσε να πάρει το στοιχείο 'Βασικές αρχές'. Γι 'αυτό, εντόπισε τελικά 3 στοιχεία, αντίστοιχα.
Επομένως, δεν λαμβάνει τα στοιχεία που ικανοποιούν καμία από τις συνθήκες @FindBy, αλλά ασχολείται ξεχωριστά με καθένα από τα @FindBy και προσδιορίζει τα στοιχεία επίσης. Επιπλέον, στο τρέχον παράδειγμα, είδαμε επίσης ότι δεν παρακολουθεί εάν τα στοιχεία είναι μοναδικά ( Π.χ. Το στοιχείο 'Βασικές αρχές' σε αυτήν την περίπτωση που εμφανίστηκε δύο φορές ως μέρος του αποτελέσματος των δύο κριτηρίων @FindBy)
# 3) Εδώ αναλύουμε τη λειτουργία του σχολιασμού @FindBys που θα σχετίζεται με τη λίστα των στοιχείων ιστού με το όνομα findbysvalue. Εδώ επίσης, το πρώτο κριτήριο @FindBy αναζητά στοιχεία με το className = 'sel' και το δεύτερο κριτήριο @FindBy αναζητά ένα συγκεκριμένο στοιχείο με xpath = '// a (@ id =' tab5 ').
Τώρα που γνωρίζουμε, τα στοιχεία που προσδιορίστηκαν για την πρώτη συνθήκη @FindBy είναι «Βασικές αρχές» και «Βιβλίο παραγγελιών» και αυτό του δεύτερου κριτηρίου @FindBy είναι «Βασικές αρχές».
Λοιπόν, πώς θα προκύψει το @FindBys διαφορετικό από το @FindAll; Μάθαμε στην προηγούμενη ενότητα ότι το @FindBys είναι ισοδύναμο με τον τελεστή AND υπό όρους και ως εκ τούτου αναζητά ένα στοιχείο ή τη λίστα στοιχείων που ικανοποιεί όλες τις συνθήκες @FindBy.
Σύμφωνα με το τρέχον παράδειγμά μας, η τιμή 'Βασικές αρχές' είναι το μόνο στοιχείο που έχει κλάση = 'sel' και id = 'tab5', ικανοποιώντας και τις δύο προϋποθέσεις. Αυτός είναι ο λόγος για τον οποίο το μέγεθος @FindBys στο outcase είναι 1 και εμφανίζει την τιμή ως 'Fundamentals'.
Προσωρινή αποθήκευση των στοιχείων στο εργοστάσιο
Κάθε φορά που φορτώνεται μια σελίδα, όλα τα στοιχεία της σελίδας ανατρέχουν ξανά κάνοντας κλήση μέσω του @FindBy ή του driver.findElement () και υπάρχει μια νέα αναζήτηση για τα στοιχεία στη σελίδα.
Τις περισσότερες φορές όταν τα στοιχεία είναι δυναμικά ή συνεχίζουν να αλλάζουν κατά τη διάρκεια του χρόνου εκτέλεσης, ειδικά αν είναι στοιχεία AJAX, είναι σίγουρα λογικό ότι με κάθε φόρτωση σελίδας υπάρχει μια νέα αναζήτηση για όλα τα στοιχεία στη σελίδα.
Όταν η ιστοσελίδα έχει στατικά στοιχεία, η προσωρινή αποθήκευση του στοιχείου μπορεί να βοηθήσει με πολλούς τρόπους. Όταν τα στοιχεία αποθηκεύονται στην κρυφή μνήμη, δεν χρειάζεται να εντοπίσουν ξανά τα στοιχεία κατά τη φόρτωση της σελίδας, αλλά μπορεί να αναφέρει το αποθετήριο στοιχείων της κρυφής μνήμης. Αυτό εξοικονομεί πολύ χρόνο και αυξάνει την καλύτερη απόδοση.
Το Pagefactory παρέχει αυτήν τη δυνατότητα προσωρινής αποθήκευσης των στοιχείων χρησιμοποιώντας έναν σχολιασμό @CacheLookUp .
Ο σχολιασμός λέει στο πρόγραμμα οδήγησης να χρησιμοποιεί την ίδια παρουσία του εντοπιστή από το DOM για τα στοιχεία και να μην τα ψάξει ξανά, ενώ η μέθοδος initElements του pagefactory συμβάλλει σημαντικά στην αποθήκευση του αποθηκευμένου στατικού στοιχείου. Το initElements κάνει τη δουλειά αποθήκευσης των στοιχείων.
Αυτό καθιστά την έννοια του εργοστασίου ειδική σε σχέση με το κανονικό μοτίβο σχεδιασμού αντικειμένων σελίδας. Έρχεται με τα δικά του πλεονεκτήματα και μειονεκτήματα τα οποία θα συζητήσουμε λίγο αργότερα. Για παράδειγμα, το κουμπί σύνδεσης στην αρχική σελίδα του Facebook είναι ένα στατικό στοιχείο, το οποίο μπορεί να αποθηκευτεί στην κρυφή μνήμη και είναι ένα ιδανικό στοιχείο για κρυφή μνήμη.
Ας δούμε τώρα πώς να εφαρμόσουμε τον σχολιασμό @CacheLookUp
Θα πρέπει πρώτα να εισαγάγετε ένα πακέτο για το Cachelookup όπως παρακάτω:
import org.openqa.selenium.support.CacheLookup
Ακολουθεί το απόσπασμα που εμφανίζει τον ορισμό ενός στοιχείου χρησιμοποιώντας το @CacheLookUp. Μόλις πραγματοποιηθεί αναζήτηση για πρώτη φορά στο UniqueElement, το initElement () αποθηκεύει την προσωρινά αποθηκευμένη έκδοση του στοιχείου έτσι ώστε την επόμενη φορά που το πρόγραμμα οδήγησης δεν θα αναζητήσει το στοιχείο, αλλά αναφέρεται στην ίδια προσωρινή μνήμη και εκτελεί την ενέργεια στο στοιχείο δεξιά Μακριά.
@FindBy(id = 'unique') @CacheLookup private WebElement UniqueElement;
Ας δούμε τώρα μέσω ενός πραγματικού προγράμματος για το πώς οι ενέργειες στο στοιχείο ιστού προσωρινής αποθήκευσης είναι ταχύτερες από αυτές στο στοιχείο ιστού χωρίς προσωρινή αποθήκευση:
Βελτιώνοντας περαιτέρω το πρόγραμμα nseindia.com έχω γράψει μια άλλη νέα μέθοδο monitorPerformance () στην οποία δημιουργώ ένα προσωρινά αποθηκευμένο στοιχείο για το πλαίσιο αναζήτησης και ένα στοιχείο χωρίς προσωρινή αποθήκευση για το ίδιο πλαίσιο αναζήτησης.
Στη συνέχεια, προσπαθώ να λάβω το όνομα ετικέτας του στοιχείου 3000 φορές τόσο για το προσωρινά αποθηκευμένο όσο και για το μη αποθηκευμένο στοιχείο και προσπαθώ να μετρήσω το χρόνο που απαιτείται για την ολοκλήρωση της εργασίας τόσο από το προσωρινά αποθηκευμένο όσο και από το μη αποθηκευμένο στοιχείο.
Έχω εξετάσει 3000 φορές έτσι ώστε να μπορούμε να δούμε μια ορατή διαφορά στα χρονικά διαστήματα των δύο. Θα περιμένω ότι το προσωρινά αποθηκευμένο στοιχείο θα πρέπει να ολοκληρώσει τη λήψη του ονόματος ετικέτας 3000 φορές σε λιγότερο χρόνο σε σύγκριση με αυτό του μη αποθηκευμένου στοιχείου.
Γνωρίζουμε τώρα γιατί το προσωρινά αποθηκευμένο στοιχείο πρέπει να λειτουργεί γρηγορότερα, δηλαδή στον οδηγό καθοδηγείται να μην αναζητήσει το στοιχείο μετά την πρώτη αναζήτηση, αλλά να συνεχίσει να εργάζεται απευθείας σε αυτό και αυτό δεν συμβαίνει με το μη προσωρινά αποθηκευμένο στοιχείο όπου γίνεται η αναζήτηση του στοιχείου και 3000 φορές και στη συνέχεια η δράση εκτελείται σε αυτό.
Παρακάτω είναι ο κωδικός για τη μέθοδο παρακολούθησης Απόδοση ():
private void monitorPerformance() { //non cached element long NoCache_StartTime = System.currentTimeMillis(); for(int i = 0; i <3000; i ++) { Searchbox.getTagName(); } long NoCache_EndTime = System.currentTimeMillis(); long NoCache_TotalTime=(NoCache_EndTime-NoCache_StartTime)/1000; System.out.println('Response time without caching Searchbox ' + NoCache_TotalTime+ ' seconds'); //cached element long Cached_StartTime = System.currentTimeMillis(); for(int i = 0; i < 3000; i ++) { cachedSearchbox.getTagName(); } long Cached_EndTime = System.currentTimeMillis(); long Cached_TotalTime=(Cached_EndTime - Cached_StartTime)/1000; System.out.println('Response time by caching Searchbox ' + Cached_TotalTime+ ' seconds'); }
Κατά την εκτέλεση, θα δούμε το παρακάτω αποτέλεσμα στο παράθυρο της κονσόλας:
Σύμφωνα με το αποτέλεσμα, η εργασία στο στοιχείο χωρίς κρυφή μνήμη ολοκληρώθηκε το 82 δευτερόλεπτα ενώ ο χρόνος που απαιτείται για την ολοκλήρωση της εργασίας στο προσωρινά αποθηκευμένο στοιχείο ήταν μόνο 37 δευτερόλεπτα. Αυτή είναι πράγματι μια ορατή διαφορά στο χρόνο απόκρισης τόσο του προσωρινά αποθηκευμένου όσο και του μη αποθηκευμένου στοιχείου.
Ε # 7) Ποια είναι τα πλεονεκτήματα και τα μειονεκτήματα του σχολιασμού @CacheLookUp στην έννοια του Pagefactory;
Απάντηση:
Πλεονεκτήματα @CacheLookUp και καταστάσεις εφικτές για τη χρήση του:
Το @CacheLookUp είναι εφικτό όταν τα στοιχεία είναι στατικά ή δεν αλλάζουν καθόλου κατά τη φόρτωση της σελίδας. Τέτοια στοιχεία δεν αλλάζουν το χρόνο εκτέλεσης. Σε τέτοιες περιπτώσεις, συνιστάται να χρησιμοποιήσετε τον σχολιασμό για να βελτιώσετε τη συνολική ταχύτητα της εκτέλεσης της δοκιμής.
Μειονεκτήματα του σχολιασμού @CacheLookUp:
Το μεγαλύτερο μειονέκτημα της αποθήκευσης στοιχείων με τον σχολιασμό είναι ο φόβος να λαμβάνετε συχνά StaleElementReferenceExceptions.
Τα δυναμικά στοιχεία ανανεώνονται αρκετά συχνά με εκείνα που είναι ευπαθή να αλλάξουν γρήγορα μέσα σε λίγα δευτερόλεπτα ή λεπτά του χρονικού διαστήματος.
Παρακάτω είναι μερικές τέτοιες περιπτώσεις των δυναμικών στοιχείων:
- Έχοντας ένα χρονόμετρο στην ιστοσελίδα που ενημερώνει το χρονόμετρο κάθε δευτερόλεπτο.
- Ένα πλαίσιο που ενημερώνει συνεχώς την αναφορά καιρού.
- Μια σελίδα που αναφέρει τις ζωντανές ενημερώσεις του Sensex.
Αυτά δεν είναι ιδανικά ή εφικτά για τη χρήση του σχολιασμού @CacheLookUp καθόλου. Εάν το κάνετε, διατρέχετε τον κίνδυνο να λάβετε την εξαίρεση του StaleElementReferenceExceptions.
Κατά την προσωρινή αποθήκευση τέτοιων στοιχείων, κατά την εκτέλεση της δοκιμής, το DOM των στοιχείων αλλάζει, ωστόσο το πρόγραμμα οδήγησης αναζητά την έκδοση του DOM που είχε ήδη αποθηκευτεί κατά την προσωρινή αποθήκευση. Αυτό κάνει το παλιό στοιχείο να αναζητηθεί από το πρόγραμμα οδήγησης που δεν υπάρχει πλέον στην ιστοσελίδα. Γι 'αυτό το StaleElementReferenceException ρίχνεται.
Κατηγορίες εργοστασίων:
Το Pagefactory είναι μια έννοια που βασίζεται σε πολλές εργοστασιακές κλάσεις και διεπαφές. Θα μάθουμε για μερικές εργοστασιακές τάξεις και διεπαφές εδώ σε αυτήν την ενότητα. Λίγα από τα οποία θα εξετάσουμε είναι Εργοστάσιο AjaxElementLocator , Εργοστάσιο ElementLocator και DefaultElementFactory.
Αναρωτηθήκαμε ποτέ εάν το Pagefactory παρέχει κάποιο τρόπο για να ενσωματώσει την έμμεση ή ρητή αναμονή για το στοιχείο έως ότου ικανοποιηθεί μια συγκεκριμένη προϋπόθεση ( Παράδειγμα: Μέχρι ένα στοιχείο να είναι ορατό, ενεργοποιημένο, με δυνατότητα κλικ κ.λπ.); Εάν ναι, εδώ είναι η κατάλληλη απάντηση σε αυτό.
Εργοστάσιο AjaxElementLocator είναι ένας από τους σημαντικότερους συντελεστές μεταξύ όλων των κατηγοριών εργοστασίων. Το πλεονέκτημα του AjaxElementLocatorFactory είναι ότι μπορείτε να εκχωρήσετε μια τιμή χρονικού ορίου για ένα στοιχείο ιστού στην κλάση σελίδας Object.
Παρόλο που το Pagefactory δεν παρέχει μια ρητή λειτουργία αναμονής, ωστόσο, υπάρχει μια παραλλαγή για την υπονοούμενη αναμονή χρησιμοποιώντας την τάξη Εργοστάσιο AjaxElementLocator . Αυτή η κλάση μπορεί να χρησιμοποιηθεί ενσωματωμένη όταν η εφαρμογή χρησιμοποιεί στοιχεία και στοιχεία Ajax.
Δείτε πώς μπορείτε να το εφαρμόσετε στον κώδικα. Μέσα στον κατασκευαστή, όταν χρησιμοποιούμε τη μέθοδο initElements (), μπορούμε να χρησιμοποιήσουμε το AjaxElementLocatorFactory για να παρέχουμε μια σιωπηρή αναμονή στα στοιχεία.
PageFactory.initElements(driver, this); can be replaced with PageFactory.initElements( new AjaxElementLocatorFactory(driver, 20), this);
Η παραπάνω δεύτερη γραμμή του κώδικα υποδηλώνει ότι το πρόγραμμα οδήγησης θα ορίσει χρονικό όριο 20 δευτερολέπτων για όλα τα στοιχεία της σελίδας όταν κάθε ένα από τα φορτία του και αν κανένα από τα στοιχεία δεν βρεθεί μετά από αναμονή 20 δευτερολέπτων, ρίχνει το «NoSuchElementException» για αυτό το στοιχείο που λείπει.
Μπορείτε επίσης να ορίσετε την αναμονή όπως παρακάτω:
public pageFactoryClass(WebDriver driver) { ElementLocatorFactory locateMe = new AjaxElementLocatorFactory(driver, 30); PageFactory.initElements(locateMe, this); this.driver = driver; }
Ο παραπάνω κώδικας λειτουργεί τέλεια επειδή η κλάση AjaxElementLocatorFactory εφαρμόζει τη διεπαφή ElementLocatorFactory.
Εδώ, η γονική διεπαφή (ElementLocatorFactory) αναφέρεται στο αντικείμενο της θυγατρικής τάξης (AjaxElementLocatorFactory). Ως εκ τούτου, η έννοια Java του 'upcasting' ή του 'πολυμορφισμού χρόνου εκτέλεσης' χρησιμοποιείται κατά την εκχώρηση χρονικού ορίου χρησιμοποιώντας το AjaxElementLocatorFactory.
Όσον αφορά τον τρόπο λειτουργίας του τεχνικά, το AjaxElementLocatorFactory δημιουργεί πρώτα ένα AjaxElementLocator χρησιμοποιώντας ένα SlowLoadableComponent που ενδέχεται να μην είχε τελειώσει τη φόρτωση όταν επιστρέψει το φορτίο (). Μετά από μια κλήση για φόρτωση (), η μέθοδος isLoaded () θα πρέπει να συνεχίσει να αποτυγχάνει μέχρι να φορτωθεί πλήρως το στοιχείο.
Με άλλα λόγια, όλα τα στοιχεία θα αναζητηθούν πρόσφατα κάθε φορά που ένα στοιχείο έχει πρόσβαση στον κώδικα, επικαλούμενος μια κλήση στο locator.findElement () από την κλάση AjaxElementLocator που στη συνέχεια εφαρμόζει ένα χρονικό όριο μέχρι τη φόρτωση μέσω της κλάσης SlowLoadableComponent.
Επιπλέον, μετά την εκχώρηση χρονικού ορίου μέσω του AjaxElementLocatorFactory, τα στοιχεία με το σχολιασμό @CacheLookUp δεν θα αποθηκεύονται πλέον στην κρυφή μνήμη καθώς ο σχολιασμός θα αγνοηθεί.
Υπάρχει επίσης μια παραλλαγή στον τρόπο μπορείς τηλεφώνησε στο initElements () μέθοδος και πώς εσείς δεν θα έπρεπε τηλεφώνησε στο Εργοστάσιο AjaxElementLocator για να ορίσετε χρονικό όριο για ένα στοιχείο.
# 1) Μπορείτε επίσης να καθορίσετε ένα όνομα στοιχείου αντί του αντικειμένου προγράμματος οδήγησης όπως φαίνεται παρακάτω στη μέθοδο initElements ():
PageFactory.initElements( , this);
Η μέθοδος initElements () στην παραπάνω παραλλαγή καλεί εσωτερικά μια κλήση στην κλάση DefaultElementFactory και ο κατασκευαστής του DefaultElementFactory δέχεται το αντικείμενο διεπαφής SearchContext ως παράμετρο εισαγωγής. Το αντικείμενο προγράμματος οδήγησης ιστού και ένα στοιχείο ιστού ανήκουν και τα δύο στη διεπαφή SearchContext.
Σε αυτήν την περίπτωση, η μέθοδος initElements () θα αρχικοποιηθεί εκ των προτέρων μόνο στο αναφερόμενο στοιχείο και δεν θα αρχικοποιηθούν όλα τα στοιχεία στην ιστοσελίδα.
#δύο) Ωστόσο, εδώ είναι μια ενδιαφέρουσα ανατροπή αυτού του γεγονότος που αναφέρει πώς δεν πρέπει να καλέσετε το αντικείμενο AjaxElementLocatorFactory με συγκεκριμένο τρόπο. Εάν χρησιμοποιώ την παραπάνω παραλλαγή του initElements () μαζί με το AjaxElementLocatorFactory, τότε θα αποτύχει.
Παράδειγμα: Ο παρακάτω κώδικας, δηλαδή το όνομα του στοιχείου διέλευσης αντί του αντικειμένου προγράμματος οδήγησης στον ορισμό AjaxElementLocatorFactory, θα αποτύχει να λειτουργήσει ως κατασκευαστής για την κλάση AjaxElementLocatorFactory, παίρνει μόνο αντικείμενο προγράμματος οδήγησης Ιστού ως παράμετρο εισαγωγής και επομένως, το αντικείμενο SearchContext με στοιχείο ιστού δεν θα λειτουργούσε.
PageFactory.initElements(new AjaxElementLocatorFactory(, 10), this);
Ε # 8) Χρησιμοποιείτε το εργοστάσιο εργοστασίου μια εφικτή επιλογή σε σχέση με το κανονικό μοτίβο σχεδιασμού αντικειμένου σελίδας;
Απάντηση: Αυτή είναι η πιο σημαντική ερώτηση που έχουν οι άνθρωποι και γι 'αυτό σκέφτηκα να το αντιμετωπίσω στο τέλος του σεμιναρίου. Γνωρίζουμε τώρα το 'in and out' για το Pagefactory ξεκινώντας από τις έννοιες, τους σχολιασμούς που χρησιμοποιούνται, τις πρόσθετες λειτουργίες που υποστηρίζει, την εφαρμογή μέσω κώδικα, τα πλεονεκτήματα και τα μειονεκτήματα
Ωστόσο, παραμένουμε με αυτό το ουσιαστικό ερώτημα ότι αν το εργοστάσιο της σελίδας έχει τόσα πολλά καλά πράγματα, γιατί δεν πρέπει να εμμείνουμε στη χρήση του.
Το Pagefactory συνοδεύεται από την έννοια του CacheLookUp που είδαμε ότι δεν είναι εφικτό για δυναμικά στοιχεία όπως οι τιμές του στοιχείου που ενημερώνονται συχνά. Επομένως, το pagefactory χωρίς CacheLookUp, είναι καλή επιλογή να πάτε; Ναι, εάν τα xpath είναι στατικά.
Ωστόσο, το μειονέκτημα είναι ότι η εφαρμογή της σύγχρονης εποχής είναι γεμάτη με βαριά δυναμικά στοιχεία, όπου γνωρίζουμε ότι ο σχεδιασμός αντικειμένου σελίδας χωρίς το pagefactory λειτουργεί τελικά καλά, αλλά το concept του pagefactory λειτουργεί εξίσου καλά με τα δυναμικά xpaths; Μάλλον όχι. Εδώ είναι ένα γρήγορο παράδειγμα:
Στην ιστοσελίδα nseindia.com, βλέπουμε έναν πίνακα όπως φαίνεται παρακάτω.
Το xpath του πίνακα είναι
'//*(@id='tab9Content')/table/tbody/tr(+count+)/td(1)'
Θέλουμε να ανακτήσουμε τιμές από κάθε σειρά για την πρώτη στήλη 'Αγορά ποσότητας'. Για να γίνει αυτό, θα πρέπει να αυξήσουμε τον μετρητή σειρών, αλλά ο δείκτης στηλών θα παραμείνει 1. Δεν υπάρχει τρόπος να περάσουμε αυτό το δυναμικό XPath στον σχολιασμό @FindBy, καθώς ο σχολιασμός δέχεται τιμές που είναι στατικές και δεν μπορεί να μεταδοθεί μεταβλητή το.
Εδώ είναι όπου το εργοστάσιο αποτυγχάνει εντελώς, ενώ το συνηθισμένο POM λειτουργεί τέλεια με αυτό. Μπορείτε εύκολα να χρησιμοποιήσετε ένα ευρετήριο για βρόχο για αύξηση του εύρους γραμμής χρησιμοποιώντας τέτοια δυναμικά xpaths στη μέθοδο driver.findElement ().
συμπέρασμα
Το Page Object Model είναι μια σχεδιαστική ιδέα ή μοτίβο που χρησιμοποιείται στο πλαίσιο αυτοματισμού Selenium.
Η ονομασία της μεταφοράς μεθόδων είναι φιλική προς το χρήστη στο μοντέλο αντικειμένου σελίδας. Ο Κώδικας στο POM είναι κατανοητός, επαναχρησιμοποιήσιμος και διατηρήσιμος. Στο POM, εάν υπάρχει κάποια αλλαγή στο στοιχείο ιστού τότε, αρκεί να κάνετε τις αλλαγές στην αντίστοιχη τάξη, αντί να επεξεργαστείτε όλες τις τάξεις.
Το Pagefactory όπως και το συνηθισμένο POM είναι μια υπέροχη ιδέα για εφαρμογή. Ωστόσο, πρέπει να γνωρίζουμε πού είναι εφικτό το συνηθισμένο POM και πού ταιριάζει το Pagefactory. Στις στατικές εφαρμογές (όπου τόσο το XPath όσο και τα στοιχεία είναι στατικά), το Pagefactory μπορεί να εφαρμοστεί ελεύθερα με πρόσθετα οφέλη από την καλύτερη απόδοση.
Εναλλακτικά, όταν η εφαρμογή περιλαμβάνει δυναμικά και στατικά στοιχεία, ενδέχεται να έχετε μια μικτή εφαρμογή του pom με το Pagefactory και αυτό χωρίς το Pagefactory σύμφωνα με τη σκοπιμότητα για κάθε στοιχείο ιστού.
Συγγραφέας: Αυτό το σεμινάριο έχει γραφτεί από την Shobha D. Εργάζεται ως επικεφαλής έργου και διαθέτει 9+ χρόνια εμπειρίας σε χειροκίνητο, αυτοματισμό (Selenium, IBM Rational Functional Tester, Java) και API Testing (SOAPUI and Restured in Java) .
Τώρα σε εσάς, για περαιτέρω εφαρμογή του Pagefactory.
Καλή εξερεύνηση !!!
=> Επισκεφθείτε εδώ για να μάθετε το σελήνιο από το μηδέν.
Συνιστώμενη ανάγνωση
- 30+ καλύτερα σεμινάρια σεληνίου: Μάθετε το σελήνιο με πραγματικά παραδείγματα
- Αποτελεσματικά σενάρια Selenium και Αντιμετώπιση προβλημάτων - Σελήνιο Σεμινάριο # 27
- Αποσφαλμάτωση σεναρίων σεληνίου με αρχεία καταγραφής (Tutorial Log4j) - Σεμινάριο σεμινάριο # 26
- Εισαγωγή στο JUnit Framework και τη χρήση του στο Σελήνιο Σενάριο - Σελήνιο Tutorial # 11
- 7 Παράγοντες που επηρεάζουν την εκτίμηση δοκιμής του έργου αυτοματισμού σεληνίου - Σελήνιο σεμινάριο # 32
- Ισχυρισμοί στο Σελήνιο χρησιμοποιώντας πλαίσια Junit και TestNG
- Πώς να χρησιμοποιήσετε το TestNG Framework για τη δημιουργία σεναρίων Selenium - TestNG Selenium Tutorial # 12
- Μάθετε πώς να χρησιμοποιείτε σχολιασμούς TestNG στο Σελήνιο (με παραδείγματα)