Page Object Model (POM) & Page Factory in Selenium
Τι είναι το Model Object Model;
Μοντέλο αντικειμένου σελίδας (POM) είναι ένα μοτίβο σχεδίασης, που χρησιμοποιείται ευρέως στον αυτοματισμό δοκιμών που δημιουργεί Αποθετήριο αντικειμένων για στοιχεία διεπαφής χρήστη ιστού. Το πλεονέκτημα του μοντέλου είναι ότι μειώνει την αντιγραφή κώδικα και βελτιώνει τη συντήρηση της δοκιμής.
Σύμφωνα με αυτό το μοντέλο, για κάθε ιστοσελίδα στην εφαρμογή, θα πρέπει να υπάρχει μια αντίστοιχη κατηγορία σελίδας. Αυτή η κλάση Σελίδα θα προσδιορίσει τα WebElements αυτής της ιστοσελίδας και επίσης περιέχει μεθόδους Page που εκτελούν λειτουργίες σε αυτά τα WebElements. Το όνομα αυτών των μεθόδων θα πρέπει να δίνεται σύμφωνα με την εργασία που εκτελούν, δηλαδή, εάν ένας φορτωτής περιμένει να εμφανιστεί η πύλη πληρωμής, το όνομα της μεθόδου POM μπορεί να είναι waitForPaymentScreenDisplay().
Γιατί το μοντέλο αντικειμένου σελίδας;
Έναρξη αυτοματισμού διεπαφής χρήστη Selenium Το WebDriver ΔΕΝ είναι δύσκολο έργο. Απλά πρέπει να βρείτε στοιχεία, να εκτελέσετε λειτουργίες σε αυτό.
Σκεφτείτε αυτό το απλό σενάριο για να συνδεθείτε σε έναν ιστότοπο
Όπως μπορείτε να παρατηρήσετε, το μόνο που κάνουμε είναι να βρίσκουμε στοιχεία και να συμπληρώνουμε τιμές για αυτά τα στοιχεία.
Αυτό είναι ένα μικρό σενάριο. Η συντήρηση σεναρίου φαίνεται εύκολη. Αλλά με το χρόνο η σουίτα δοκιμών θα μεγαλώσει. Καθώς προσθέτετε όλο και περισσότερες γραμμές στον κώδικά σας, τα πράγματα γίνονται δύσκολα.
Το κύριο πρόβλημα με τη συντήρηση σεναρίων είναι ότι εάν 10 διαφορετικά σενάρια χρησιμοποιούν το ίδιο στοιχείο σελίδας, με οποιαδήποτε αλλαγή σε αυτό το στοιχείο, πρέπει να αλλάξετε και τα 10 σενάρια. Αυτό είναι χρονοβόρο και επιρρεπές σε σφάλματα.
Μια καλύτερη προσέγγιση στη συντήρηση του σεναρίου είναι η δημιουργία ενός ξεχωριστού αρχείου κλάσης που θα βρίσκει στοιχεία ιστού, θα τα συμπληρώνει ή θα τα επαληθεύει. Αυτή η κλάση μπορεί να επαναχρησιμοποιηθεί σε όλα τα σενάρια που χρησιμοποιούν αυτό το στοιχείο. Στο μέλλον, εάν υπάρξει αλλαγή στο στοιχείο web, θα πρέπει να κάνουμε την αλλαγή σε 1 μόνο αρχείο κλάσης και όχι σε 10 διαφορετικά σενάρια.
Αυτή η προσέγγιση ονομάζεται Page Object Model in Selenium. Βοηθά να γίνει ο κώδικας πιο ευανάγνωστος, διατηρήσιμος και επαναχρησιμοποιήσιμος.
Πλεονεκτήματα του POM
- Το μοτίβο σχεδίασης αντικειμένου σελίδας λέει ότι οι λειτουργίες και οι ροές στη διεπαφή χρήστη πρέπει να διαχωρίζονται από την επαλήθευση. Αυτή η ιδέα κάνει τον κώδικά μας πιο καθαρό και κατανοητό.
- Το δεύτερο πλεονέκτημα είναι ότι το αποθετήριο αντικειμένων είναι ανεξάρτητο από δοκιμαστικές περιπτώσεις, επομένως μπορούμε να χρησιμοποιήσουμε το ίδιο αποθετήριο αντικειμένων για διαφορετικό σκοπό με διαφορετικά εργαλεία. Για παράδειγμα, μπορούμε να ενσωματώσουμε το μοντέλο αντικειμένου σελίδας Selenium με TestNG/JUnit για λειτουργικό Δοκιμές και ταυτόχρονα με το JBehave/Cucumber για δοκιμές αποδοχής.
- Ο κώδικας μειώνεται και βελτιστοποιείται λόγω των επαναχρησιμοποιήσιμων μεθόδων σελίδας στις κλάσεις POM.
- Οι μέθοδοι λαμβάνουν πιο ρεαλιστικά ονόματα που μπορούν εύκολα να αντιστοιχιστούν με τη λειτουργία που συμβαίνει στο περιβάλλον χρήστη. δηλ. εάν πατήσουμε το κουμπί στην αρχική σελίδα, το όνομα της μεθόδου θα είναι σαν 'gotoHomePage()'.
Πώς να εφαρμόσετε το POM;
Απλό POM:
Είναι η βασική δομή του πλαισίου μοντέλου αντικειμένου σελίδας όπου όλα τα Στοιχεία Ιστού του AUT και η μέθοδος που λειτουργεί σε αυτά τα Στοιχεία Ιστού διατηρούνται μέσα σε ένα αρχείο κλάσης. Μια εργασία όπως η επαλήθευση θα πρέπει να είναι ξεχωριστή ως μέρος των μεθόδων δοκιμής.
Πλήρες Παράδειγμα
δοκιμαστική θήκη: Μεταβείτε στον ιστότοπο επίδειξης Guru99.
Βήμα 1) Μεταβείτε στον ιστότοπο επίδειξης Guru99
Βήμα 2) Στην αρχική σελίδα υπάρχει το κείμενο ελέγχου «Guru99 Bank».
Βήμα 3) Συνδεθείτε στην εφαρμογή
Βήμα 4) Βεβαιωθείτε ότι η αρχική σελίδα περιέχει κείμενο ως "Αναγνωριστικό Manger: επίδειξη"
Εδώ έχουμε να κάνουμε με 2 σελίδες
- Είσοδος σελίδας
- Αρχική σελίδα (εμφανίζεται μόλις συνδεθείτε)
Αντίστοιχα, δημιουργούμε 2 POM in Selenium τάξεις
Guru99 Σελίδα σύνδεσης POM
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class Guru99Login { WebDriver driver; By user99GuruName = By.name("uid"); By password99Guru = By.name("password"); By titleText =By.className("barone"); By login = By.name("btnLogin"); public Guru99Login(WebDriver driver){ this.driver = driver; } //Set user name in textbox public void setUserName(String strUserName){ driver.findElement(user99GuruName).sendKeys(strUserName); } //Set password in password textbox public void setPassword(String strPassword){ driver.findElement(password99Guru).sendKeys(strPassword); } //Click on login button public void clickLogin(){ driver.findElement(login).click(); } //Get the title of Login Page public String getLoginTitle(){ return driver.findElement(titleText).getText(); } /** * This POM method will be exposed in test case to login in the application * @param strUserName * @param strPasword * @return */ public void loginToGuru99(String strUserName,String strPasword){ //Fill user name this.setUserName(strUserName); //Fill password this.setPassword(strPasword); //Click Login button this.clickLogin(); } }
Αρχική σελίδα Guru99 POM in Selenium
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class Guru99HomePage { WebDriver driver; By homePageUserName = By.xpath("//table//tr[@class='heading3']"); public Guru99HomePage(WebDriver driver){ this.driver = driver; } //Get the User name from Home Page public String getHomePageDashboardUserName(){ return driver.findElement(homePageUserName).getText(); } }
Guru99 Simple POM in Selenium Δοκιμή
package test; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import pages.Guru99HomePage; import pages.Guru99Login; public class Test99GuruLogin { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; Guru99Login objLogin; Guru99HomePage objHomePage; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("http://demo.guru99.com/V4/"); } /** * This test case will login in http://demo.guru99.com/V4/ * Verify login page title as guru99 bank * Login to application * Verify the home page using Dashboard message */ @Test(priority=0) public void test_Home_Page_Appear_Correct(){ //Create Login Page object objLogin = new Guru99Login(driver); //Verify login page title String loginPageTitle = objLogin.getLoginTitle(); Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank")); //login to application objLogin.loginToGuru99("mgr123", "mgr!23"); // go the next page objHomePage = new Guru99HomePage(driver); //Verify home page Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mgr123")); }
Σε τι βρίσκεται το Page Factory Selenium?
Page Factory in Selenium είναι μια ενσωματωμένη έννοια πλαισίου μοντέλου αντικειμένου σελίδας για Selenium WebDriver αλλά είναι πολύ βελτιστοποιημένο. Χρησιμοποιείται για την προετοιμασία των αντικειμένων Σελίδας ή για την προετοιμασία του ίδιου του αντικειμένου Σελίδας. Χρησιμοποιείται επίσης για την προετοιμασία στοιχείων κλάσης Σελίδας χωρίς τη χρήση "FindElement/s".
Και εδώ, ακολουθούμε την έννοια του διαχωρισμού του χώρου αποθήκευσης αντικειμένων σελίδας και των μεθόδων δοκιμής. Επιπλέον, με τη βοήθεια της κλάσης PageFactory in Selenium, χρησιμοποιούμε σχολιασμούς @FindBy για να βρείτε το WebElement. Χρησιμοποιούμε τη μέθοδο initElements για την προετοιμασία στοιχείων ιστού
@FindBy μπορεί να δεχθεί tagName, partalLinkText, name, linkText, id, css, className, xpath ως ιδιότητες.
Ας δούμε το ίδιο παράδειγμα με το παραπάνω χρησιμοποιώντας το Page Factory
Σελίδα σύνδεσης Guru99 με το Page Factory
package PageFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class Guru99Login { /** * All WebElements are identified by @FindBy annotation */ WebDriver driver; @FindBy(name="uid") WebElement user99GuruName; @FindBy(name="password") WebElement password99Guru; @FindBy(className="barone") WebElement titleText; @FindBy(name="btnLogin") WebElement login; public Guru99Login(WebDriver driver){ this.driver = driver; //This initElements method will create all WebElements PageFactory.initElements(driver, this); } //Set user name in textbox public void setUserName(String strUserName){ user99GuruName.sendKeys(strUserName); } //Set password in password textbox public void setPassword(String strPassword){ password99Guru.sendKeys(strPassword); } //Click on login button public void clickLogin(){ login.click(); } //Get the title of Login Page public String getLoginTitle(){ return titleText.getText(); } /** * This POM method will be exposed in test case to login in the application * @param strUserName * @param strPasword * @return */ public void loginToGuru99(String strUserName,String strPasword){ //Fill user name this.setUserName(strUserName); //Fill password this.setPassword(strPasword); //Click Login button this.clickLogin(); } }
Αρχική σελίδα Guru99 με το Page Factory
package PageFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class Guru99HomePage { WebDriver driver; @FindBy(xpath="//table//tr[@class='heading3']") WebElement homePageUserName; public Guru99HomePage(WebDriver driver){ this.driver = driver; //This initElements method will create all WebElements PageFactory.initElements(driver, this); } //Get the User name from Home Page public String getHomePageDashboardUserName(){ return homePageUserName.getText(); } }
Guru99 TestCase με έννοια Page Factory
package test; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import PageFactory.Guru99HomePage; import PageFactory.Guru99Login; public class Test99GuruLoginWithPageFactory { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; Guru99Login objLogin; Guru99HomePage objHomePage; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("http://demo.guru99.com/V4/"); } /** * This test go to http://demo.guru99.com/V4/ * Verify login page title as guru99 bank * Login to application * Verify the home page using Dashboard message */ @Test(priority=0) public void test_Home_Page_Appear_Correct(){ //Create Login Page object objLogin = new Guru99Login(driver); //Verify login page title String loginPageTitle = objLogin.getLoginTitle(); Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank")); //login to application objLogin.loginToGuru99("mgr123", "mgr!23"); // go the next page objHomePage = new Guru99HomePage(driver); //Verify home page Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mgr123")); } }
Η πλήρης δομή του έργου θα μοιάζει με το διάγραμμα:
AjaxElementLocatorFactory
AjaxElementLocatorFactory είναι μια χαλαρή ιδέα φόρτωσης του PageFactory στο Selenium. Χρησιμοποιείται για την εύρεση των στοιχείων Ιστού μόνο όταν τα στοιχεία χρησιμοποιούνται σε οποιαδήποτε λειτουργία. Εκχωρεί ένα χρονικό όριο για τα WebElements στην κλάση σελίδας αντικειμένου. Ένα από τα βασικά πλεονεκτήματα της χρήσης του μοτίβου PageFactory in Selenium είναι η κλάση AjaxElementLocatorFactory.
Εδώ, όταν εκτελείται μια λειτουργία σε ένα στοιχείο, η αναμονή για την ορατότητά του ξεκινά μόνο από εκείνη τη στιγμή. Εάν το στοιχείο δεν βρεθεί στο δεδομένο χρονικό διάστημα, Δοκιμαστική θήκη Η εκτέλεση θα δημιουργήσει εξαίρεση "NoSuchElementException".
Σύνοψη
- Μοντέλο αντικειμένου σελίδας σε Selenium Το WebDriver είναι ένα μοτίβο σχεδίασης αποθήκης αντικειμένων.
- Selenium Το μοντέλο αντικειμένου σελίδας δημιουργεί τον κώδικα δοκιμής μας με δυνατότητα συντήρησης, επαναχρησιμοποιήσιμου.
- Το Page Factory είναι ένας βελτιστοποιημένος τρόπος δημιουργίας αποθετηρίου αντικειμένων στην έννοια του πλαισίου μοντέλου αντικειμένου σελίδας.
- Το AjaxElementLocatorFactory είναι μια έννοια τεμπέλης φόρτωσης στο Page Factory – μοτίβο σχεδίασης αντικειμένων σελίδας για την αναγνώριση WebElements μόνο όταν χρησιμοποιούνται σε οποιαδήποτε λειτουργία.
Κατεβάστε το Selenium Αρχεία έργου για την επίδειξη σε αυτό το σεμινάριο