Lehekülje objekti mudel ja tehas Selenium
Mis on leheobjekti mudel?
Lehekülje objekti mudel (POM) on disainimuster, mida kasutatakse laialdaselt testimise automatiseerimises, mis loob veebiliidese elementide jaoks objektihoidla. Mudeli eeliseks on see, et see vähendab koodi dubleerimist ja parandab testi hooldust.
Selle mudeli kohaselt peaks rakenduse iga veebilehe jaoks olema vastav leheklass. See leheklass tuvastab selle veebilehe veebielemendid ja sisaldab ka lehemeetodeid, mis teostavad nende veebielementidega toiminguid. Nende meetodite nimed tuleks anda vastavalt nende teostatavale ülesandele, st kui laadija ootab makselüüsi ilmumist, võib POM-i meetodi nimi olla waitForPaymentScreenDisplay().
Miks leheobjekti mudel?
Kasutajaliidese automatiseerimise käivitamine Selenium WebDriver EI OLE raske ülesanne. Peate lihtsalt leidma elemendid, tegema sellega toiminguid.
Kaaluge seda lihtsat skripti veebisaidile sisselogimiseks
Nagu näete, ei tee me muud, kui otsime elemente ja täidame nende elementide väärtusi.
See on väike skript. Skripti hooldus tundub lihtne. Kuid aja jooksul testikomplekt kasvab. Kui lisate oma koodile järjest rohkem ridu, muutuvad asjad keeruliseks.
Skriptihoolduse peamine probleem seisneb selles, et kui 10 erinevat skripti kasutavad sama leheelementi, peate selle elemendi mis tahes muudatuse korral muutma kõiki 10 skripti. See on aeganõudev ja veaterohke.
Parem lähenemine skriptide hooldusele on luua eraldi klassifail, mis leiab veebielemendid, täidab need või kontrollib neid. Seda klassi saab uuesti kasutada kõigis seda elementi kasutavates skriptides. Tulevikus, kui veebielemendis toimub muudatus, peame muudatuse tegema ainult ühes klassifailis, mitte kümnes erinevas skriptis.
Seda lähenemisviisi nimetatakse leheobjekti mudeliks Selenium. See aitab muuta koodi loetavamaks, hooldatavamaks ja korduvkasutatavamaks.
POM-i eelised
- Leheobjekti kujundusmuster ütleb, et kasutajaliidese toimingud ja vood tuleks kinnitamisest eraldada. See kontseptsioon muudab meie koodi puhtamaks ja hõlpsasti mõistetavaks.
- Teine eelis on see, et objektihoidla on testjuhtumitest sõltumatu, nii et saame kasutada sama objektihoidlat erinevatel eesmärkidel erinevate tööriistadega. Näiteks saame integreerida leheobjekti mudeli Selenium koos TestNG/JUnit funktsionaalseks Testimine ja samal ajal JBehave/Cucumber vastuvõtutesti jaoks.
- POM-klasside korduvkasutatavate lehtede meetodite tõttu muutub kood vähemaks ja optimeerituks.
- Meetodid saavad realistlikumad nimed, mida saab hõlpsasti kaardistada kasutajaliideses toimuva toiminguga. st kui pärast nupule klõpsamist jõuame avalehele, on meetodi nimi nagu 'gotoHomePage()'.
Kuidas POM-i rakendada?
Lihtne POM:
See on leheobjekti mudeli raamistiku põhistruktuur, kus kõik veebielemendid AUT ja nendel veebielementidel töötavat meetodit hoitakse klassifailis. Selline ülesanne nagu kontrollimine peaks olema testimeetodite osana eraldi.
Täielik näide
TestCase: Minge Guru99 demo saidile.
Samm 1) Minge Guru99 demo saidile
Samm 2) Avalehel on kontrolltekst “Guru99 pank”.
Samm 3) Logige rakendusse sisse
Samm 4) Veenduge, et avalehel oleks tekst „halduri ID: demo”
Siin on meil tegemist 2 leheküljega
- Sisselogimise lehele
- Avaleht (kuvatakse pärast sisselogimist)
Sellest lähtuvalt loome 2 POM-i Selenium klassid
Guru99 sisselogimisleht 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 avaleht POM sisse 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 Lihtne POM sisse Selenium Katsejuhtum
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("https://demo.guru99.com/V4/"); } /** * This test case will login in https://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")); }
Milles on Page Factory Selenium?
Lehe tehas sisse Selenium on sisseehitatud leheobjekti mudeli raamistiku kontseptsioon Selenium WebDriver, kuid see on väga optimeeritud. Seda kasutatakse leheobjektide lähtestamiseks või lehe objekti enda initsialiseerimiseks. Seda kasutatakse ka leheklassi elementide lähtestamiseks ilma "FindElement/s" kasutamata.
Ka siin järgime leheobjektide hoidla ja testimismeetodite eraldamise kontseptsiooni. Lisaks klassi PageFactory in abiga Selenium, kasutame märkusi @FindBy et leida WebElement. Veebielementide lähtestamiseks kasutame meetodit initElements
@FindBy võib vastu võtta tagName, osalineLinkText, nimi, lingitekst, id, css, klassinimi, xpath atribuutidena.
Vaatame sama näidet nagu ülal, kasutades Page Factory
Guru99 sisselogimisleht koos Page Factoryga
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 koduleht koos lehetehasega
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 koos Page Factory kontseptsiooniga
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("https://demo.guru99.com/V4/"); } /** * This test go to https://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")); } }
Projekti täielik struktuur näeb välja nagu diagramm:
AjaxElementLocatorFactory
AjaxElementLocatorFactory on PageFactory laisk laadimiskontseptsioon Selenium. Seda kasutatakse veebielementide leidmiseks ainult siis, kui elemente kasutatakse mis tahes toimingus. See määrab objekti leheklassile WebElementsi ajalõpu. Üks peamisi eeliseid mustri PageFactory kasutamisel Selenium on AjaxElementLocatorFactory klass.
Siin, kui elemendiga tehakse toiming, algab selle nähtavuse ootamine alles sellest hetkest. Kui elementi antud ajaintervalli jooksul ei leitud, Testjuhtum täitmine teeb erandi „NoSuchElementException”.
kokkuvõte
- Lehekülje objekti mudel sisse Selenium WebDriver on objektihoidla kujundusmuster.
- Selenium leheobjektimudel loob meie testimiskoodi hooldatava ja korduvkasutatava.
- Page Factory on optimeeritud viis objektihoidla loomiseks leheobjektimudeli raamistiku kontseptsioonis.
- AjaxElementLocatorFactory on Page Factory laisk laadimise kontseptsioon – leheobjekti kujundusmuster WebElementide tuvastamiseks ainult siis, kui neid kasutatakse mis tahes toimingus.