Automatiseeritud testide kirjutamine on iga agara tarkvaraarendustiimi jaoks rohkem kui luksus. See on vajadus ja oluline vahend vigade kiireks leidmiseks tarkvaraarendustsüklite varases faasis. Kui on mõni uus funktsioon, mis on alles arendusfaasis, saavad arendajad käivitada automatiseeritud teste ja näha, kuidas need muud süsteemi süsteemi osad mõjutavad. Selles artiklis selgitatakse, kuidas saate lehe Object mudeli abil automatiseeritud testimist kiirendada Seleen .
Läbi testautomaatika , on veaparanduste hinda võimalik vähendada ja üldist paranemist tuua tarkvara kvaliteedi tagamine (QA) protsess. Korralike testide abil saavad arendajad vead leida ja neid lahendada juba enne kvaliteedi tagamiseks jõudmist. Testi automatiseerimine aitab meil veelgi automatiseerida pidevalt taanduvaid juhtumeid ja funktsioone. Nii on kvaliteedikontrollidel rohkem aega rakenduse muude osade testimiseks. Veelgi enam, see aitab tagada toote kvaliteeti tootmisel. Selle tulemusena saame tooteid, mis on tõhusamalt stabiilsemad, ja kvaliteedi tagamise protsessi, mis on tõhusam.
Ehkki automatiseeritud testide kirjutamine võib arendajatele ja inseneridele tunduda lihtne ülesanne, on siiski võimalus lõpetada halvasti rakendatud testidega ja koodihoolduse kõrge hind igas vilgas protsessis. Katsete kaasamine võib osutuda kulukaks mis tahes väleda arendusprojekti muutuste või funktsioonide pakkumine. Veebilehe ühe elemendi muutmine, millele tugineb 20 testi, nõuab, et üks läbiks need 20 testrutiini ja värskendaks igaüks selle äsja sisse viidud muudatusega kohanemiseks. See ei saa mitte ainult olla aeganõudev, vaid ka tõsine motiveeriv tegur automatiseeritud testide varajase rakendamise osas.
Aga mis oleks, kui saaksime muudatused teha ainult ühes kohas ja kui kõik asjakohased testiprotseduurid seda kasutaksid? Selles artiklis heidame pilgu seleeni automatiseeritud testidele ja sellele, kuidas saaksime Page Object mudeleid kasutades kirjutada hooldatavaid ja korduvkasutatavaid testrutiine.
Lehe objekti mudel on seleeni objektikujundusmuster, kus veebilehtedel on klassid ja lehe erinevad elemendid on klassi muutujadena määratletud. Kõiki võimalikke kasutajate interaktsioone saab seejärel klassis meetoditena rakendada:
clickLoginButton(); setCredentials(user_name,user_password);
Kuna klassides on hästi nimetatud meetodeid hõlpsasti loetav, töötab see elegantse viisina testrutiinide rakendamiseks, mis on nii loetavad kui ka tulevikus hõlpsamini hooldatavad või värskendatavad. Näiteks:
Lehe objekti mudeli toetamiseks kasutame Lehevabrik . Seleniumis asuv lehttehas on leheobjekti laiendus ja seda saab kasutada mitmel viisil. Sel juhul kasutame veebilehe klassides või lehe objektides määratletud veebielementide initsialiseerimiseks lehte Factory.
Enne veebielementide muutujate kasutamist tuleb veebielemente sisaldavad veebilehe klassid või leheobjektid initsialiseerida lehe Factory abil. Seda saab teha lihtsalt algatused funktsioon lehel Tehas:
LoginPage page = new LoginPage(driver); PageFactory.initElements(driver, page);
Või veelgi lihtsam:
LoginPage page = PageFactory.intElements(driver,LoginPage.class)
Või veebisaidi klassi konstruktori sees:
public LoginPage(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
Lehevabrik lähtestab iga Veebielement muutuja koos viitega tegeliku veebilehe vastavale elemendile konfigureeritud „lokaatorite” põhjal. Seda tehakse kasutades @FindBy märkused. Selle märkuse abil saame määratleda elemendi otsimise strateegia koos selle tuvastamiseks vajaliku teabega:
@FindBy(how=How.NAME, using='username') private WebElement user_name;
Iga kord, kui sellele meetodit kutsutakse Veebielement muutuja, leiab draiver selle kõigepealt praeguselt lehelt ja simuleerib seejärel interaktsiooni. Juhul, kui töötame lihtsa lehega, teame, et leiame lehelt elemendi iga kord, kui seda otsime, ja teame ka, et navigeerime lõpuks sellelt lehelt eemale ja ei naase sellele, saame vahemällu salvestada otsitud väli teise lihtsa märkuse abil:
@FindBy(how=How.NAME, using='username') @CacheLookup private WebElement user_name;
Selle kogu WebElementi muutuja määratluse saab asendada selle palju ülevaatlikuma vormiga:
@FindBy(name='username') private WebElement user_name;
The @FindBy annotatsioon toetab käputäit muid strateegiaid, mis muudavad asja natuke lihtsamaks:
id, name, className, css, tagName, linkText, partialLinkText, xpath
@FindBy(id='username') private WebElement user_name; @FindBy(name='passsword') private WebElement user_password; @FindBy(className='h3') private WebElement label; @FindBy(css=”#content”) private WebElement text;
Pärast initsialiseerimist saab neid WebElementi muutujaid kasutada lehe vastavate elementidega suhtlemiseks. Näiteks järgmine kood:
user_password.sendKeys(password);
... saatke antud klahvivajutuste jada lehe parooliväljale ja see on samaväärne järgmisega:
driver.findElement(By.name(“user_password”)).sendKeys(password);
Edasi liikudes kohtate sageli olukordi, kus peate lehel leidma elementide loendi ja just siis @FindBys tuleb kasuks:
@FindBys(@FindBy(css=”div[class=’yt-lockup-tile yt-lockup-video’]”))) private List videoElements;
Ülaltoodud kood leiab kõik div elemendid, millel on kaks klassinime 'yt-lockup-tile' ja 'yt-lockup-video'. Saame seda veelgi lihtsustada, asendades selle järgmisega:
@FindBy(how=How.CSS,using='div[class=’yt-lockup-tile yt-lockup-video’]') private List videoElements;
Lisaks saate kasutada @FindAll mitmega @FindBy märkused, et otsida elemente, mis sobivad mis tahes antud lokaatoriga:
@FindAll({@FindBy(how=How.ID, using=”username”), @FindBy(className=”username-field”)}) private WebElement user_name;
Nüüd, kui saame veebisaite kujutada Java-klassidena ja kasutada initsialiseerimiseks lehte Factory Veebielement muutujate hõlpsalt, on aeg näha, kuidas saame kirjutada lihtsad seleenitestid lehe objekti mustri ja lehevabriku abil.
Automaatse meie lehe objekti mudeli õpetuse jaoks arendaja registreerumine ApeeScape'i. Selleks peame automatiseerima järgmised toimingud:
Külastage veebisaiti www.toptal.com
Klõpsake nuppu 'Rakenda arendajana'
Kontrollige portaalilehel kõigepealt, kas see on avatud
Klõpsake nuppu “Liitu ApeeScape’iga”
Täitke vorm
Esitage vorm, klõpsates nupul „Liitu ApeeScape’iga”
Laadige alla ja installige Java JDK
Laadige alla ja installige InteliJ idee
Looge uus Maveni projekt
Linkige „Project SDK” oma JDK-ga, nt. Windowsi „C: Program Files Java jdkxxx”
Häälestusgrupi ID ja artefakti ID:
SeleniumTEST Test
junit junit ${junit.version} test org.seleniumhq.selenium selenium-firefox-driver ${selenium.version} org.seleniumhq.selenium selenium-support ${selenium.version} org.seleniumhq.selenium selenium-java ${selenium.version}
Asendage seleeni versioon ja JUniti versioon uusimate versiooninumbritega, mille leiate Google'ist ja seleeni saidilt otsides JUnit Mavenit.
Siinkohal, kui automaatne loomine on lubatud, peaksid sõltuvused hakkama automaatselt alla laadima. Kui ei, siis lihtsalt aktiveerige pistikprogrammid> install> install: installige IntelliJ Idea IDE paremal küljel paneeli Maven Projects alt.
Kui projekt on alglaaditud, saame hakata oma testipaketti looma jaotises „src / test / java”. Nimetage pakett „com.toptal“ ja looge selle alla veel kaks paketti: „com.toptal.webpages“ ja „com.toptal.tests“.
Hoiame oma leheobjekti / lehevabriku klassid jaotises „com.toptal.webpages“ ja testrutiinid jaotises „com.toptal.tests“.
Nüüd võime alustada oma Page Object klasside loomist.
Esimene, mida peame juurutama, on ApeeScape'i koduleht (www.toptal.com). Looge kursus jaotises „com.toptal.webpages” ja andke sellele nimeks „Koduleht”.
package com.toptal.webpages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.How; import org.openqa.selenium.support.PageFactory; public class HomePage { private WebDriver driver; //Page URL private static String PAGE_URL='https://www.toptal.com'; //Locators //Apply as Developer Button @FindBy(how = How.LINK_TEXT, using = 'APPLY AS A DEVELOPER') private WebElement developerApplyButton; //Constructor public HomePage(WebDriver driver){ this.driver=driver; driver.get(PAGE_URL); //Initialise Elements PageFactory.initElements(driver, this); } public void clickOnDeveloperApplyButton(){ developerApplyButton.click(); } }
ApeeScape'i kodulehel huvitab meid eelkõige üks element - see on nupp „Rakenda arendajana”. Selle elemendi leiame teksti sobitamise teel, mida me eespool teeme. Veebilehtede modelleerimisel Page Object klassidena võib elementide leidmine ja tuvastamine osutuda sageli vaevaks. Google Chrome'i või Firefoxi silumisvahendite abil saab seda lihtsamaks muuta. Paremklõpsates lehe mis tahes elemendil, saate elemendi üksikasjaliku teabe saamiseks aktiveerida kontekstimenüüst suvandi „Kontrolli elementi“.
Üks levinud (ja minu eelistatud) viis on elementide leidmine Firefoxi kasutades FireBugi laiendus , koos Firefoxi veebidraiveriga Seleenis. Pärast FireBugi laienduse installimist ja lubamist saate paremklõpsata lehel ja valida FireBugi avamiseks „Inspect element with FireBug”. FireBugi vahekaardilt HTML saate kopeerida lehe mis tahes elemendi XPathi, CSS-i tee, sildi nime või 'Id' (kui see on saadaval).
Kopeerides ülaltoodud ekraanipildi elemendi XPathi, saame selle jaoks oma leheobjekti jaoks luua välja WebElement järgmiselt:
@FindBy(xpath = '/html/body/div[1]/div/div/header/div/h1') WebElement heading;
Või lihtsuse huvides võime siin kasutada märgendi nime „h1”, kui see identifitseerib meid huvitava elemendi kordumatult:
@FindBy(tagName = 'h1') WebElement heading;
Järgmiseks vajame leheobjekti, mis esindaks arendajaportaali lehte, milleni jõuame, klõpsates nupul „Rakenda arendajana”.
Sellel lehel on meil kaks huvitavat elementi. Lehe laadimise kindlakstegemiseks tahame kontrollida pealkirja olemasolu. Ja me tahame ka a Veebielement väli nupule „Liitu ApeeScape'iga“.
package com.toptal.webpages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class DeveloperPortalPage { private WebDriver driver; @FindBy(xpath = '/html/body/div[1]/div/div/header/div/h1') private WebElement heading; @FindBy(linkText = 'JOIN TOPTAL') private WebElement joinApeeScapeButton; //Constructor public DeveloperPortalPage (WebDriver driver){ this.driver=driver; //Initialise Elements PageFactory.initElements(driver, this); } //We will use this boolean for assertion. To check if page is opened public boolean isPageOpened(){ return heading.getText().toString().contains('Developer portal'); } public void clikOnJoin(){ joinApeeScapeButton.click(); } }
Ja lõpuks, selle projekti kolmanda ja viimase lehe objekti jaoks määratleme selle, mis tähistab lehte, mis sisaldab arendaja taotlusvormi. Kuna siin peame tegelema mitmete vormiväljadega, määratleme ühe Veebielement muutuja iga vormivälja jaoks. Leiame iga välja nende ID järgi ja määratleme iga välja jaoks spetsiaalsed setteri meetodid, mis simuleerivad vastavate väljade klahvivajutusi.
package com.toptal.webpages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; public class DeveloperApplyPage { private WebDriver driver; @FindBy(tagName = 'h1') WebElement heading; @FindBy(id='developer_email') WebElement developer_email; @FindBy(id = 'developer_password') WebElement developer_password; @FindBy(id = 'developer_password_confirmation') WebElement developer_password_confirmation; @FindBy(id = 'developer_full_name') WebElement developer_full_name; @FindBy(id = 'developer_skype') WebElement developer_skype; @FindBy(id ='save_new_developer') WebElement join_toptal_button; //Constructor public DeveloperApplyPage(WebDriver driver){ this.driver=driver; //Initialise Elements PageFactory.initElements(driver, this); } public void setDeveloper_email(String email){ developer_email.clear(); developer_email.sendKeys(email); } public void setDeveloper_password(String password){ developer_password.clear(); developer_password.sendKeys(password); } public void setDeveloper_password_confirmation(String password_confirmation){ developer_password_confirmation.clear(); developer_password_confirmation.sendKeys(password_confirmation); } public void setDeveloper_full_name (String fullname){ developer_full_name.clear(); developer_full_name.sendKeys(fullname); } public void setDeveloper_skype (String skype){ developer_skype.clear(); developer_skype.sendKeys(skype); } public void clickOnJoin(){ join_toptal_button.click(); } public boolean isPageOpened(){ //Assertion return heading.getText().toString().contains('Apply to join our network as a developer'); } }
Kuna leheobjektide klassid esindavad meie lehti ja kasutajate interaktsioonid on nende meetodid, saame nüüd oma lihtsa testrutiini kirjutada lihtsate meetodikutsete ja väidete reana.
package com.toptal.tests; import com.toptal.webpages.DeveloperApplyPage; import com.toptal.webpages.DeveloperPortalPage; import com.toptal.webpages.HomePage; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import java.net.URL; import java.util.concurrent.TimeUnit; public class ApplyAsDeveloperTest { WebDriver driver; @Before public void setup(){ //use FF Driver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); } @Test public void applyAsDeveloper() { //Create object of HomePage Class HomePage home = new HomePage(driver); home.clickOnDeveloperApplyButton(); //Create object of DeveloperPortalPage DeveloperPortalPage devportal= new DeveloperPortalPage(driver); //Check if page is opened Assert.assertTrue(devportal.isPageOpened()); //Click on Join ApeeScape devportal.clikOnJoin(); //Create object of DeveloperApplyPage DeveloperApplyPage applyPage =new DeveloperApplyPage(driver); //Check if page is opened Assert.assertTrue(applyPage.isPageOpened()); //Fill up data applyPage.setDeveloper_email(' [email protected] '); applyPage.setDeveloper_full_name('Dejan Zivanovic Automated Test'); applyPage.setDeveloper_password('password123'); applyPage.setDeveloper_password_confirmation('password123'); applyPage.setDeveloper_skype('automated_test_skype'); //Click on join //applyPage.clickOnJoin(); } @After public void close(){ driver.close(); } }
Siinkohal peaks teie projekti struktuur välja nägema järgmine:
Kui soovite testi käivitada, valige puust “ApplyAsDeveloperTest”, paremklõpsake sellel ja valige Käivita ‘ApplyAsDeveloperTest’ .
Kui test on läbi viidud, näete tulemusi IDE vasakus alanurgas:
Leheobjekt ja lehevabrik muudavad Seleniumi veebilehtede modelleerimise ja testimise ning arendajate elu lihtsaks. QA-d palju lihtsam. Kui see on õigesti tehtud, saab neid leheküljeobjektide klasse taaskasutada kogu teie testipaketis ja anda endale võimalus juba varakult oma projektide jaoks automatiseeritud seleeni teste rakendada, ilma et see kahjustaks väledat arengut. Abstrakteerides kasutajate interaktsioone oma lehe objektimudelites ja hoides oma testiprotseduure kergena ja lihtsana, saate oma testipaketi kohandada muutuvate nõuetega vähese vaevaga.
Loodan, et mul on õnnestunud teile näidata, kuidas kirjutada kena ja puhas testkood, mida on lihtne hooldada. Lõpetan artikli oma lemmik QA tsitaadiga:
Seotud: Veebikraapimine peata brauseriga: nukutöölise õpetusMõtle kaks korda, kodeeri üks kord!
Lehe Object mudel on Seleenis objekti kujundusmuster. Veebilehed on esindatud klassidena ja lehe elemendid on määratletud klassi muutujatena, nii et kasutaja interaktsioone saab seejärel klassis meetoditena rakendada.
Seleen on loodud veebibrauserite automatiseerimiseks, võimaldades tarkvarainseneridel testimist oluliselt kiirendada ja automatiseerida. Kuigi testautomaatika on selle peamine kasutusala, saab seleeni kasutada ka teatud korduvate toimingute, näiteks põhiliste administreerimisülesannete automatiseerimiseks.
Seleeni testimine on seleeni tarkvara tööriistade komplekti kasutamine testide automatiseerimise hõlbustamiseks. Enamasti valivad tarkvarainsenerid selle ülesande jaoks ühe kuni kaks Seleeni tööriista, kuid erinevate vajaduste rahuldamiseks võib kasutada täiendavaid tööriistu.
Leheobjekti mudel on kujundusmuster, nagu selles osas varem välja toodud. Page Factory laiendab lehe objekti mudeli funktsionaalsust, tutvustades täpsemaid funktsioone. See võimaldab kasutajatel initsialiseerida konkreetseid elemente lehe objektimudelis, kasutades märkusi.