page object model with page factory selenium tutorial
Овај детаљни водич објашњава све о објектном моделу странице (ПОМ) помоћу Пагефацтори-а на примерима. Такође можете научити примену ПОМ-а у селену:
У овом упутству ћемо разумети како створити објектни модел странице помоћу приступа Паге Фацтори. Усредсредићемо се на:
- Фабричка класа
- Како створити основни ПОМ користећи образац Паге Фацтори
- Различите напомене коришћене у приступу фабричкој обради страница
Пре него што видимо шта је Пагефацтори и како се може користити заједно са објектним моделом Паге, схватимо шта је то Паге Објецт Модел који је познат као ПОМ.
=> Посетите овде да бисте видели серију тренинга за селен за све.
Шта ћете научити:
- Шта је објектни модел странице (ПОМ)?
- Шта је Пагефацтори?
- ПОМ помоћу фабрике страница
- Често постављана питања
- Закључак
Шта је објектни модел странице (ПОМ)?
Теоријска терминологија описује Модел објекта странице као образац дизајна који се користи за изградњу спремишта објеката за веб-елементе доступне у апликацији која се тестира. Мало је других који га називају оквиром за аутоматизацију селена за дату апликацију која се тестира.
Међутим, оно што сам разумео у вези са појмом Паге Објецт Модел је:
# 1) То је образац дизајна где имате засебну датотеку Јава класе која одговара сваком екрану или страници у апликацији. Датотека класе може садржати спремиште објеката елемената корисничког интерфејса, као и методе.
#два) У случају да на страници постоје високи веб елементи, класа спремишта објеката за страницу може се одвојити од класе која укључује методе за одговарајућу страницу.
Пример: Ако страница Региструјте рачун има много поља за унос, тада може постојати класа РегистерАццоунтОбјецтс.јава која формира спремиште објеката за елементе корисничког интерфејса на страници налога налога.
Могла би се направити посебна датотека класе РегистерАццоунт.јава која проширује или наслеђује РегистерАццоунтОбјецтс која укључује све методе које изводе различите радње на страници.
# 3) Поред тога, испод пакета може бити генерички пакет са датотеком {ропертиес, подацима Екцел теста и уобичајеним методама.
Пример: ДриверФацтори који се врло лако може користити на свим страницама у апликацији
Разумевање ПОМ-а на примеру
Проверавати овде да бисте сазнали више о ПОМ-у.
Испод је снимак веб странице:
Кликом на сваку од ових веза корисник ће се преусмерити на нову страницу.
Ево снимка како се гради структура пројекта са Селениум-ом користећи објектни модел Паге који одговара свакој страници на веб локацији. Свака Јава класа укључује спремиште објеката и методе за извођење различитих радњи унутар странице.
Поред тога, постојаће још један ЈУНИТ или ТестНГ или датотека класе Јава која позива позиве на датотеке класа ових страница.
Зашто користимо објектни модел странице?
О апликацији овог моћног селенијског оквира названог ПОМ или објектни модел странице постоји гласина. Сада се поставља питање „Зашто користити ПОМ?“.
Једноставан одговор на ово је да је ПОМ комбинација модуларних и хибридних оквира заснованих на подацима. То је приступ систематској организацији скрипти на такав начин да КА олакшава одржавање кода без муке, а такође помаже у спречавању сувишних или дуплираних кодова.
На пример, ако дође до промене вредности локатора на одређеној страници, онда је врло лако идентификовати и извршити ту брзу промену само у скрипти дотичне странице без утицаја на код негде другде.
Концепт Модел објектног модела странице користимо у програму Селениум Вебдривер из следећих разлога:
- У овом ПОМ моделу креира се спремиште објеката. Независан је од тест случајева и може се поново користити за други пројекат.
- Конвенција именовања метода је врло лака, разумљива и реалнија.
- Под објектним моделом Паге креирамо класе страница које се могу поново користити у другом пројекту.
- Модел објекта Паге једно је лако за развијени оквир због својих неколико предности.
- У овом моделу креирају се засебне класе за различите странице веб апликације као што су страница за пријављивање, почетна страница, страница са детаљима о запосленом, страница за промену лозинке итд.
- Ако дође до промене у било ком елементу веб странице, потребно је да извршимо промене само у једној класи, а не у свим разредима.
- Дизајнирана скрипта је вишекратна, читљива и одржива у приступу објектном моделу странице.
- Његова структура пројекта је прилично лака и разумљива.
- Може да користи ПагеФацтори у објектном моделу странице како би иницијализовао веб елемент и сачувао елементе у кешу.
- ТестНГ се такође може интегрисати у приступ објектном моделу странице.
Примена једноставног ПОМ-а у селену
# 1) Сценариј за аутоматизацију
Сада аутоматизујемо дати сценарио користећи објектни модел странице.
Сценарио је објашњен у наставку:
Корак 1: Покрените веб локацију „хттпс: //демо.втигер.цом“.
Корак 2: Унесите важеће акредитиве.
Корак 3: Пријавите се на сајт.
Корак 4: Потврдите почетну страницу.
Корак 5: Одјавите се са странице.
Корак 6: Затворите прегледач.
# 2) Селенијеве скрипте за горњи сценарио у ПОМ-у
Сада креирамо ПОМ структуру у Ецлипсеу, како је објашњено у наставку:
Корак 1: Направите пројекат у Ецлипсе - ПОМ структура заснована на:
а) Направите пројекат „Модел објекта странице“.
б) Направите 3 пакета у оквиру пројекта.
- библиотека
- странице
- тест случајева
Библиотека: Под ово стављамо оне кодове које треба позивати изнова и изнова у нашим тест случајевима, попут покретања прегледача, снимака екрана итд. Корисник може додати више класа под њега на основу потребе пројекта.
Пагес: У оквиру овога, класе се креирају за сваку страницу у веб апликацији и могу да додају више класа страница на основу броја страница у апликацији.
Тест случајева: Испод тога напишемо тест случаја за пријаву и можемо додати још тест случајева колико је потребно за тестирање целе апликације.
ц) Класе испод пакета приказане су на доњој слици.
Корак два: Направите следеће класе у оквиру библиотечког пакета.
Бровсер.јава: У овој класи су дефинисана 3 прегледача (Фирефок, Цхроме и Интернет Екплорер) који се позивају у случају теста за пријављивање. На основу захтева, корисник може да тестира апликацију и у различитим прегледачима.
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; } }
СцреенСхот.јава: У овој класи се напише програм за снимак екрана који се позива у тест случају када корисник жели да направи снимак екрана да ли тест пада или пролази.
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: Створите класе страница у пакету Паге.
ХомеПаге.јава: Ово је класа почетне странице у којој су дефинисани сви елементи почетне странице и методе.
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(); } }
ЛогинПаге.јава: Ово је класа странице за пријаву, у којој су дефинисани сви елементи странице за пријаву и методе.
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: Направите тест случајеве за сценарио пријављивања.
ЛогинТестЦасе.јава: Ово је класа ЛогинТестЦасе, где се извршава тест примера. Корисник такође може створити више тест случајева према потребама пројекта.
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: Извршите „ЛогинТестЦасе.јава“.
Корак 6: Излаз објектног модела странице:
- Покрените прегледач Цхроме.
- Демо веб локација је отворена у прегледачу.
- Пријавите се на демо локацију.
- Потврдите почетну страницу.
- Одјавите се са странице.
- Затворите прегледач.
Сада, истражимо главни концепт овог водича који привлачи пажњу, тј. „Пагефацтори“.
Шта је Пагефацтори?
ПагеФацтори је начин примене „Модел објекта странице“. Овде следимо принцип раздвајања спремишта предмета предмета и метода испитивања. То је уграђени концепт Паге Објецт Модел-а који је врло оптимизован.
Дајмо сада више јасности појму Пагефацтори.
# 1) Прво, концепт назван Пагефацтори пружа алтернативни начин у смислу синтаксе и семантике за стварање спремишта објеката за веб елементе на страници.
#два) Друго, користи мало другачију стратегију за иницијализацију веб елемената.
# 3) Спремиште објеката за УИ веб елементе може се направити помоћу:
- Уобичајени „ПОМ без Пагефацтори“ и,
- Можете и да користите „ПОМ са Пагефацтори“.
Доље је дат сликовни приказ истог:
Сада ћемо размотрити све аспекте који разликују уобичајени ПОМ од ПОМ од Пагефацтори.
а) Разлика у синтакси лоцирања елемента помоћу уобичајеног ПОМ у односу на ПОМ са Пагефацтори.
На пример , Кликните овде да бисте пронашли поље за претрагу које се приказује на страници.
ПОМ без Пагефацтори:
# 1) Испод је како лоцирате поље за претрагу помоћу уобичајеног ПОМ-а:
WebElement searchNSETxt=driver.findElement(By.id(“searchBox”));
# 2) Следећи корак преноси вредност „инвестиција“ у поље Сеарцх НСЕ.
searchNSETxt.sendkeys(“investment”);
ПОМ који користи Пагефацтори:
# 1) Можете да пронађете поље за претрагу помоћу Пагефацтори-а као што је приказано доле.
Напомена @ФиндБи се користи у Пагефацтори за идентификацију елемента док ПОМ без Пагефацтори користи дривер.финдЕлемент () метода за лоцирање елемента.
Друга изјава за Пагефацтори након @ФиндБи додељује тип типа ВебЕлемент класа која ради тачно слично додељивању имена елемента типа ВебЕлемент класа као повратни тип методе дривер.финдЕлемент () која се користи у уобичајеном ПОМ-у (у овом примеру претражитеНСЕТкт).
Погледаћемо @ФиндБи детаљно напомене у предстојећем делу овог водича.
@FindBy(id = 'searchBox') WebElement searchNSETxt;
#два) Следећи корак прослеђује вредност „инвестиција“ у поље Сеарцх НСЕ, а синтакса остаје иста као и у уобичајеном ПОМ (ПОМ без Пагефацтори).
searchNSETxt.sendkeys(“investment”);
б) Разлика у стратегији иницијализације веб елемената користећи уобичајени ПОМ у односу на ПОМ са Пагефацтори.
Коришћење ПОМ-а без Пагефацтори:
Доље је дат исечак кода за постављање путање Цхроме управљачког програма. Инсталира се инстанца ВебДривер са именом управљачки програм и ЦхромеДривер се додељује „управљачком програму“. Затим се исти објекат покретачког програма користи за покретање веб странице Националне берзе, проналажење сеарцхБок-а и унос вредности низа у поље.
Поента коју бих овде желео да истакнем је да када се ради о ПОМ-у без фабричке странице, инстанца управљачког програма се креира у почетку и сваки веб елемент се свеже иницијализује сваки пут када се тај веб елемент позива помоћу дривер.финдЕлемент () или управљачког програма .финдЕлементс ().
Због тога се новим кораком дривер.финдЕлемент () за елемент, ДОМ структура поново скенира и на тој страници се врши освежена идентификација елемента.
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”);
Коришћење ПОМ-а са Пагефацтори:
Поред употребе ознаке @ФиндБи уместо методе дривер.финдЕлемент (), доњи исечак кода се додатно користи за Пагефацтори. Метода статиц инитЕлементс () класе ПагеФацтори користи се за иницијализацију свих УИ елемената на страници чим се страница учита.
public PagefactoryClass(WebDriver driver) { this.driver = driver; PageFactory.initElements(driver, this); }
Горња стратегија чини приступ ПагеФацтори мало другачијим од уобичајеног ПОМ-а. У уобичајеном ПОМ-у, веб елемент мора бити експлицитно иницијализован, док се у приступу Пагефацтори сви елементи иницијализују са инитЕлементс () без експлицитне иницијализације сваког веб елемента.
На пример: Ако је ВебЕлемент декларисан, али није иницијализован у уобичајеном ПОМ-у, тада се баца грешка „иницијализација променљиве“ или НуллПоинтерЕкцептион. Стога у уобичајеном ПОМ-у сваки ВебЕлемент мора бити експлицитно иницијализован. ПагеФацтори има предност у односу на уобичајени ПОМ у овом случају.
Немојмо иницијализовати веб елемент БДате (ПОМ без Пагефацтори), можете видети да се приказује грешка ’Инитиализе вариабле’ (Покрени променљиву) и позива корисника да је иницијализује на нулу, стога не можете претпоставити да се елементи имплицитно иницијализују приликом њиховог лоцирања.
Елемент БДате је експлицитно иницијализован (ПОМ без Пагефацтори):
Сада, погледајмо неколико случајева комплетног програма који користи ПагеФацтори да бисмо искључили било какве нејасноће у разумевању аспекта примене.
Пример 1:
- Идите на „хттп://ввв.нсеиндиа.цом/“
- У падајућем менију поред поља за претрагу изаберите „Деривати валута“.
- Потражите „УСДИНР“. Потврдите текст „Амерички долар-индијска рупија - УСДИНР“ на резултујућој страници.
Структура програма:
- Ствара се ПагефацториЦласс.јава која укључује спремиште објеката помоћу концепта фабрике страница за нсеиндиа.цом који је конструктор за иницијализацију свих веб елемената, метода селецтЦуррентДеривативе () за одабир вредности из падајућег поља Сеарцхбок, селецтСимбол () за одабир симбола на страница која се приказује следећа и верифитект () да бисте проверили да ли је заглавље странице онакво какво се очекује.
- НСЕ_МаинЦласс.јава је датотека главне класе која позива све горе наведене методе и изводи одговарајуће радње на НСЕ локацији.
ПагефацториЦласс.јава
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'); } }
НСЕ_МаинЦласс.јава
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:
- Идите на „хттпс://ввв.схопперсстоп.цом/брандс“
- Дођите до везе Хауте цурри.
- Проверите да ли страница Хауте Цурри садржи текст „Покрени нешто ново“.
Структура програма
- креира се схопперстопПагефацтори.јава која укључује спремиште објеката помоћу концепта пагефацтори за схопперсстоп.цом који је конструктор за иницијализацију свих веб елемената, методе цлосеЕктраПопуп () за руковање искачућим оквиром упозорења који се отвара, цлицкОнХаутеЦурриЛинк () да кликнете на Хауте Цурри Повежите и верифиСтартНевСометхинг () да бисте проверили да ли страница Хауте Цурри садржи текст „Покрени нешто ново“.
- Схопперстоп_ЦаллПагефацтори.јава је главна датотека класе која позива све горе наведене методе и изводи одговарајуће радње на НСЕ локацији.
схопперстопПагефацтори.јава
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'); } }
Схопперстоп_ЦаллПагефацтори.јава
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(); } }
ПОМ помоћу фабрике страница
Видео водичи - ПОМ са фабриком страница
И део
ИИ део
Класа Фацтори користи се за једноставније и једноставније коришћење Паге Објецтс.
- Прво, морамо да пронађемо веб елементе анотацијом @ФиндБи на часовима страница .
- Затим иницијализујте елементе помоћу инитЕлементс () приликом инстанцирања класе странице.
# 1) @ФиндБи:
Ознака @ФиндБи се користи у ПагеФацтори за лоцирање и декларисање веб елемената помоћу различитих локатора.Овде прослеђујемо атрибут као и његову вредност која се користи за лоцирање веб елемента у напомену @ФиндБи и тада се проглашава ВебЕлемент.
Постоје два начина на које се напомена може користити.
На пример:
@FindBy(how = How.ID, using='EmailAddress') WebElement Email; @FindBy(id='EmailAddress') WebElement Email;
Међутим, први је стандардни начин декларисања ВебЕлементс-а.
'Како' је класа и има статичке променљиве као што су ИД, КСПАТХ, ЦЛАССНАМЕ, ЛИНКТЕКСТ итд.
'Користећи' - За додељивање вредности статичкој променљивој.
У наведеном пример , користили смо атрибут „ид“ да бисмо пронашли веб елемент „Емаил“. Слично томе, можемо користити следеће локаторе са напоменама @ФиндБи:
- Назив класе
- цсс
- име
- кпатх
- Означи име
- линкТект
- делимичноЛинкТект
# 2) инитЕлементс ():
ИнитЕлементс је статична метода класе ПагеФацтори која се користи за иницијализацију свих веб елемената који се налазе у напомени @ФиндБи. Дакле, лако инстанцирање класа Паге.
initElements(WebDriver driver, java.lang.Class pageObjectClass)
Такође би требало да схватимо да ПОМ следи ООПС принципе.
- ВебЕлементс су декларисани као променљиве приватног члана (Сакривање података).
- Везивање ВебЕлемената одговарајућим методама (енкапсулација).
Кораци за стварање ПОМ-а помоћу фабричког узорка странице
# 1) Направите засебну датотеку Јава класе за сваку веб страницу.
#два) У свакој класи сви ВебЕлементс треба декларисати као променљиве (користећи напомену - @ФиндБи) и иницијализовати методом инитЕлемент (). Проглашени ВебЕлементс морају бити иницијализовани да би се користили у акционим методама.
# 3) Дефинишите одговарајуће методе које делују на те променљиве.
Узмимо пример једноставног сценарија:
- Отворите УРЛ апликације.
- Унесите адресу е-поште и лозинку.
- Кликните на дугме Логин.
- Потврдите успешну поруку за пријаву на страници за претрагу.
Слој странице
Овде имамо 2 странице,
- Почетна страница - Страница која се отвара када се унесе УРЛ адреса и на коју уносимо податке за пријаву.
- СеарцхПаге - Страница која се приказује након успешне пријаве.
У слоју странице, свака страница у веб апликацији декларисана је као засебна Јава класа и тамо су наведени њени локатори и радње.
Кораци за стварање ПОМ-а на примеру у реалном времену
# 1) Направите Јава класу за сваку страницу:
У ово пример , приступићемо 2 веб странице, „Почетна“ и „Претрага“.
Стога ћемо створити 2 Јава класе у Паге Лаиер (или у пакету рецимо цом.аутоматион.пагес).
Package Name :com.automation.pages HomePage.java SearchPage.java
# 2) Дефинишите ВебЕлементс као променљиве помоћу Аннотатион @ФиндБи:
Били бисмо у интеракцији са:
- Е-пошта, лозинка, поље дугмета за пријаву на почетној страници.
- Успешна порука на страници за претрагу.
Тако ћемо дефинисати ВебЕлементс помоћу @ФиндБи
На пример: Ако ћемо идентификовати ЕмаилАддресс помоћу атрибута ид, онда је његова декларација променљиве
//Locator for EmailId field @FindBy(how=How.ID,using='EmailId') private WebElementEmailIdAddress;
# 3) Креирајте методе за радње изведене на ВебЕлементс-у.
Следеће акције се изводе на ВебЕлементс:
- Унесите радњу у поље Адреса е-поште.
- Унесите радњу у поље Лозинка.
- Кликните акцију на дугмету за пријаву.
На пример, Кориснички дефинисане методе креирају се за сваку радњу на ВебЕлементу као,
public void typeEmailId(String Id){ driver.findElement(EmailAddress).sendKeys(Id) }
Овде се Ид прослеђује као параметар у методи, јер ће корисник послати улаз из главног тест случаја.
Белешка :Конструктор мора бити креиран у свакој класи у слоју странице, како би се инстанца управљачког програма преузела из главне класе у тестном слоју, а такође и иницијализовали ВебЕлементс (Паге Објецтс) декларисани у класи странице помоћу странице ПагеФацтори.ИнитЕлемент () .
Ми овде не покрећемо покретачки програм, већ се његова инстанца добија од главне класе када се креира објекат класе Паге Лаиер.
ИнитЕлемент () - користи се за иницијализацију декларисаних ВебЕлементс, користећи инстанцу управљачког програма из главне класе. Другим речима, ВебЕлементс се креирају помоћу инстанце управљачког програма. Тек након што се ВебЕлементс иницијализују, они се могу користити у методама за извршавање радњи.
За сваку страницу креирају се две Јава класе, као што је приказано доле:
ХомеПаге.јава
//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. } }
СеарцхПаге.Јава
//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. } }
Тест Лаиер
Тест случајеви су примењени у овој класи. Креирамо засебни пакет рецимо цом.аутоматион.тест, а затим овде креирамо Јава класу (МаинЦласс.јава)
Кораци за стварање тест случајева:
- Иницијализујте управљачки програм и отворите апликацију.
- Направите објекат класе ПагеЛаиер (за сваку веб страницу) и проследите инстанцу управљачког програма као параметар.
- Користећи креирани објекат, упутите позив методама из класе ПагеЛаиер (за сваку веб страницу) како бисте извршили радње / верификацију.
- Понављајте корак 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(); } }
Хијерархија типа напомена која се користи за пријављивање ВебЕлементс-а
Биљешке се користе за изградњу стратегије лоцирања за елементе корисничког интерфејса.
# 1) @ Пронађи
Када је у питању Пагефацтори, @ФиндБи делује као магични штапић. Додаје сву снагу концепту. Сад сте свесни да ознака @ФиндБи у Пагефацтори-у изводи исто као она у дривер.финдЕлемент () у уобичајеном објектном моделу странице. Користи се за проналажење ВебЕлемент / ВебЕлементс са једним критеријумом .
# 2) @ФиндБис
Користи се за проналажење ВебЕлемента са више критеријума и треба да се подударају са свим датим критеријумима. Ове критеријуме треба поменути у односима родитеља и детета. Другим речима, ово користи условну везу АНД за лоцирање ВебЕлементс-а користећи наведене критеријуме. Користи вишеструки @ФиндБи за дефинисање сваког критеријума.
На пример:
ХТМЛ изворни код ВебЕлемента:
У ПОМ-у:
@FindBys({ @FindBy(id = 'searchId_1'), @FindBy(name = 'search_field') }) WebElementSearchButton;
У горњем примеру, ВебЕлемент „СеарцхБуттон“ се налази само ако се налази одговара обема критеријуми чија је вредност ид „сеарцхИд_1“, а вредност имена „сеарцх_фиелд“. Имајте на уму да први критеријуми припадају надређеној ознаци, а други критеријуми за подређену ознаку.
# 3) @ Пронађи све
Користи се за проналажење ВебЕлемента са више критеријума и треба да одговара бар једном од задатих критеријума. Ово користи ИЛИ условне везе да би се лоцирали ВебЕлементс. Користи вишеструки @ФиндБи за дефинисање свих критеријума.
На пример:
ХТМЛ СоурцеЦоде:
У ПОМ-у:
@FindBys({ @FindBy(id = 'UsernameNameField_1'), // doesn’t match @FindBy(name = 'User_Id') //matches @FindBy(className = “UserName_r”) //matches }) WebElementUserName;
У горњем примеру, ВебЕлемент „Корисничко име се налази ако је одговара барем једном поменутих критеријума.
# 4) @ЦацхеЛоокУп
Када се ВебЕлемент чешће користи у тест случајевима, Селениум тражи ВебЕлемент сваки пут када се покрене тест скрипта. У тим случајевима, у којима се одређени ВебЕлементс глобално користе за све ТЦ ( На пример, Сценарио пријаве се дешава за сваки ТЦ), ова напомена се може користити за одржавање тих ВебЕлемената у кеш меморији када се прочита први пут.
То заузврат помаже коду да се брже извршава, јер сваки пут када не мора да тражи ВебЕлемент на страници, него референцу може добити из меморије.
Ово може бити префикс са било којим од @ФиндБи, @ФиндБис и @ФиндАлл.
На пример:
@CacheLookUp @FindBys({ @FindBy(id = 'UsernameNameField_1'), @FindBy(name = 'User_Id') @FindBy(className = “UserName_r”) }) WebElementUserName;
Такође имајте на уму да ову напомену треба користити само за ВебЕлементс чија се вредност атрибута (попут кпатх, име ид, име класе итд.) Не мења често. Када се ВебЕлемент први пут пронађе, одржава своју референцу у кеш меморији.
Дакле, онда се догоди промена атрибута ВебЕлемента након неколико дана, Селениум неће моћи да пронађе елемент, јер већ има своју стару референцу у кеш меморији и неће узети у обзир недавну промену у ВебЕлементу.
Више на ПагеФацтори.инитЕлементс ()
Сада када разумемо стратегију Пагефацтори-а о иницијализацији веб елемената помоћу ИнитЕлементс (), покушајмо да разумемо различите верзије методе.
Метода као што знамо узима објект погона и објект тренутне класе као улазне параметре и враћа објект странице имплицитном и проактивном иницијализацијом свих елемената на страници.
У пракси је употреба конструктора као што је приказано у горњем одељку пожељнија од осталих начина његове употребе.
Алтернативни начини позивања методе су:
# 1) Уместо да користите показивач „тхис“, можете створити тренутни објект класе, пренијети му инстанцу управљачког програма и позвати статичку методу инитЕлементс са параметрима, тј. Објект управљачког програма и објект класе који је управо створен.
public PagefactoryClass(WebDriver driver) { //version 2 PagefactoryClass page=new PagefactoryClass(driver); PageFactory.initElements(driver, page); }
#два) Трећи начин иницијализације елемената помоћу класе Пагефацтори је употреба апи-а који се назива „одраз“. Да, уместо да креира објекат класе са „новом“ кључном речи, цласснаме.цласс може се проследити као део улазног параметра инитЕлементс ().
public PagefactoryClass(WebDriver driver) { //version 3 PagefactoryClass page=PageFactory.initElements(driver, PagefactoryClass.class); }
Често постављана питања
П # 1) Које су различите стратегије лоцирања које се користе за @ФиндБи?
Одговор: Једноставан одговор на ово је да не постоје различите стратегије лоцирања које се користе за @ФиндБи.
Користе истих 8 стратегија лоцирања које метода финдЕлемент () у уобичајеном ПОМ-у користи:
- ид
- име
- Назив класе
- кпатх
- цсс
- Означи име
- линкТект
- делимичноЛинкТект
П # 2) Постоје ли различите верзије од употребе и напомена @ФиндБи?
Одговор: Када постоји веб елемент који треба претражити, користимо напомену @ФиндБи. Разрадићемо алтернативне начине употребе @ФиндБи заједно са различитим стратегијама локатора.
Већ смо видели како се користи верзија 1 @ФиндБи:
@FindBy(id = 'cidkeyword') WebElement Symbol;
Верзија 2 @ФиндБи је прослеђивањем улазног параметра као како и Користећи .
како тражи стратегију локатора помоћу које би се идентификовао вебелемент. Кључна реч Користећи дефинише вредност локатора.
Погледајте испод за боље разумевање,
- Хов.ИД претражује елемент помоћу ид стратегија и елемент који покушава да идентификује има ид = цидкеиворд.
@FindBy(how = How.ID, using = ' cidkeyword') WebElement Symbol;
- Хов.ЦЛАСС_НАМЕ претражује елемент помоћу Назив класе стратегија и елемент који покушава да идентификује има цласс = невцласс.
@FindBy(how = How.CLASS_NAME, using = 'newclass') WebElement Symbol;
П # 3) Постоји ли разлика између две верзије @ФиндБи?
Одговор: Одговор је Не, нема разлике између две верзије. Само што је прва верзија краћа и лакша у поређењу са другом верзијом.
П # 4) Шта користим у творници страница у случају да постоји листа веб елемената који се налазе?
Одговор: У уобичајеном узорку дизајна објекта странице имамо дривер.финдЕлементс () да лоцирамо више елемената који припадају истој класи или имену ознаке, али како да лоцирамо такве елементе у случају објектног модела странице са Пагефацтори? Најлакши начин за постизање таквих елемената је коришћење исте напомене @ФиндБи.
Разумем да се чини да је ова линија за многе од вас глава по глави. Али да, то је одговор на питање.
Погледајмо пример у наставку:
Користећи уобичајени објектни модел странице без Пагефацтори-а, користите дривер.финдЕлементс за лоцирање више елемената као што је приказано доле:
private List multipleelements_driver_findelements = driver.findElements (By.class(“last”));
Исто се може постићи коришћењем објектног модела странице са Пагефацтори како је дато у наставку:
@FindBy (how = How.CLASS_NAME, using = 'last') private List multipleelements_FindBy;
У основи, додељивање елемената листи типа ВебЕлемент чини трик без обзира да ли се користи Пагефацтори током идентификовања и лоцирања елемената.
П # 5) Да ли се и објектни дизајн странице без Пагефацтори и са Пагефацтори могу користити у истом програму?
Одговор: Да, и дизајн објекта странице без Пагефацтори и са Пагефацтори могу се користити у истом програму. Можете проћи кроз програм дат испод у Одговор на питање бр. 6 да бисте видели како се обоје користе у програму.
Једна ствар коју треба запамтити је да треба избјегавати концепт Пагефацтори са предмеморираном функцијом на динамичким елементима, док дизајн објекта странице добро функционира за динамичке елементе. Међутим, Пагефацтори одговара само статичким елементима.
П # 6) Постоје ли алтернативни начини идентификовања елемената засновани на више критеријума?
веб услуге тестирање питања и одговора на интервјуу
Одговор: Алтернатива за идентификовање елемената на основу више критеријума је коришћење напомена @ФиндАлл и @ФиндБис. Ове напомене помажу да се идентификују појединачни или вишеструки елементи у зависности од вредности преузетих из критеријума прослеђених у њему.
# 1) @ Пронађи све:
@ФиндАлл може садржати вишеструке @ФиндБи и вратиће све елементе који се подударају са било којим @ФиндБи на једној листи. @ФиндАлл се користи за обележавање поља на објекту странице да би показао да би претрага требало да користи низ ознака @ФиндБи. Затим ће тражити све елементе који се подударају са било којим од критеријума ФиндБи.
Имајте на уму да елементи не гарантују редослед докумената.
Синтакса да се користи @ФиндАлл је следећа:
@FindAll( { @FindBy(how = How.ID, using = 'foo'), @FindBy(className = 'bar') } )
Објашњење: @ФиндАлл ће претражити и идентификовати одвојене елементе који одговарају сваком од критеријума @ФиндБи и навести их. У горњем примеру, прво ће претражити елемент чији је ид = ”фоо”, а затим ће идентификовати други елемент са цлассНаме = ”бар”.
Под претпоставком да је за сваки критеријум ФиндБи идентификован један елемент, @ФиндАлл ће резултирати навођењем 2 елемента. Запамтите, за сваки критеријум може бити идентификовано више елемената. Тако је једноставним речима @ ФиндАлл делује еквивалентно ИЛИ оператор на усвојеним критеријумима @ФиндБи.
# 2) @ФиндБис:
ФиндБис се користи за обележавање поља на објекту странице да би показао да би претрага требало да користи низ ознака @ФиндБи у ланцу како је описано у БиЦхаинед. Када потребни ВебЕлемент објекти морају да се подударају са свим датим критеријумима, користите напомену @ФиндБис.
Синтакса да се користи @ФиндБис је следећа:
@FindBys( { @FindBy(name=”foo”) @FindBy(className = 'bar') } )
Објашњење: @ФиндБис ће претражити и идентификовати елементе који одговарају свим критеријумима @ФиндБи и навести их. У горњем примеру ће претраживати елементе чије је име = ”фоо” и цлассНаме = ”бар”.
@ФиндАлл ће резултирати навођењем 1 елемента ако претпоставимо да је један елемент идентификован са именом и именом класе у датим критеријумима.
Ако не постоји ниједан елемент који задовољава све положене услове ФиндБи, тада ће резултанта @ФиндБис бити нула елемената. Могла би бити идентификована листа веб елемената ако сви услови задовољавају више елемената. Једноставним речима, @ ФиндБис делује еквивалентно И оператор на усвојеним критеријумима @ФиндБи.
Погледајмо спровођење свих горе наведених напомена кроз детаљан програм:
Изменићемо програм ввв.нсеиндиа.цом дат у претходном одељку како бисмо разумели примену напомена @ФиндБи, @ФиндБис и @ФиндАлл
# 1) Спремиште објеката ПагефацториЦласс се ажурира на следећи начин:
Листа невлист = дривер.финдЕлементс (Би.тагНаме („а“));
@ФиндБи (како = Како. ОЗНАЧИ ИМЕ , користећи = 'а')
приватни Листа финдбивалуе;
@ФиндАлл ({ @ФиндБи (цлассНаме = “сел”), @ФиндБи (кпатх = ”// а (@ ид =’ таб5 ′) ”)}))
приватни Листа финдаллвалуе;
@ФиндБис ({ @ФиндБи (цлассНаме = “сел”), @ФиндБи (кпатх = ”// а (@ ид =’ таб5 ′) ”)}))
приватни Листа финдбисвалуе;
# 2) Нова метода сееХовФиндВоркс () написана је у ПагефацториЦласс и позива се као последња метода у главној класи.
Метода је као у наставку:
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) Кроз образац дизајна објекта странице, елемент „нова листа“ идентификује све ознаке сидром „а“. Другим речима, добијамо број свих веза на страници.
Сазнали смо да пагефацтори @ФиндБи ради исти посао као и дривер.финдЕлемент (). Елемент финдбивалуе је створен да добије број свих веза на страници кроз стратегију претраживања која има концепт фабрике странице.
Доказује се тачним да и дривер.финдЕлемент () и @ФиндБи раде исти посао и идентификују исте елементе. Ако погледате снимак екрана резултујућег прозора конзоле горе, број веза идентификованих елементом невлист и броја финдбивалуе једнак је тј. 299 везе пронађене на страници.
Резултат је приказан као испод:
driver.findElements(By.tagName()) 299 count of @FindBy- list elements 299
#два) Овде детаљно разрађујемо рад анотације @ФиндАлл која ће се односити на листу веб елемената са именом финдаллвалуе.
Пажљиво гледајући сваки критеријум @ФиндБи у напомени @ФиндАлл, први критеријум @ФиндБи претражује елементе са цлассНаме = 'сел', а други критеријум @ФиндБи тражи одређени елемент са КСПатх = “// а (@ ид = 'таб5')
Притисните сада Ф12 да прегледамо елементе на страници нсеиндиа.цом и добијемо одређене јасноће на елементима који одговарају критеријумима @ФиндБи.
На страници постоје два елемента која одговарају цлассНаме = ”сел”:
до) Елемент „Основе“ има ознаку листе тј.
са цлассНаме = ”сел”. Погледајте Снимак испод

б) Други елемент „Књига наруџби“ има КСПатх са сидреном ознаком која има назив класе „сел“.

ц) Други @ФиндБи са КСПатх-ом има сидрену ознаку чији ид је „ таб5 ”. Као одговор на претрагу идентификован је само један елемент који је Основе.
Погледајте снимак испод:

Када је извршен тест нсеиндиа.цом, добили смо број елемената по којима је претражен.
@ФиндАлл ас 3. Елементи за финдаллвалуе када су приказани били су: Фундаменталс као 0тхиндексни елемент, Књига налога као 1стелемент индекса и поново Основе као 2нделемент индекса. Већ смо сазнали да @ФиндАлл идентификује елементе за сваки критеријум @ФиндБи посебно.
По истом протоколу, за претрагу првог критеријума, тј. ЦлассНаме = 'сел', идентификовао је два елемента која задовољавају услов и преузео је „Основе“ и „Књигу поруџбина“.
Затим се преселио на следећи критеријум @ФиндБи и по кпатх-у датом за други @ФиндБи могао је да преузме елемент „Основе“. Због тога је коначно идентификовао 3 елемента.
Дакле, не добија елементе који задовољавају било који од услова @ФиндБи, али се бави одвојено са сваким од @ФиндБи и идентификује елементе на исти начин. Поред тога, у тренутном примеру смо такође видели да не прати да ли су елементи јединствени ( На пример. Елемент „Основе“ у овом случају који је приказан два пута као део резултата два критеријума @ФиндБи)
# 3) Овде елаборирамо рад анотације @ФиндБис која ће се односити на листу веб елемената са именом финдбисвалуе. И овде први критеријум @ФиндБи тражи елементе са цлассНаме = ’сел’, а други критеријум @ФиндБи тражи одређени елемент са кпатх = “// а (@ ид =” таб5 ”).
Сад кад знамо, елементи идентификовани за први @ФиндБи услов су „Основе“ и „Књига наруџби“, а други критеријум @ФиндБи је „Основи“.
Па, како ће резултат @ФиндБис бити другачији од @ФиндАлл? У претходном одељку смо сазнали да је @ФиндБис еквивалентан условном оператору АНД и стога тражи елемент или листу елемената који задовољавају све услове @ФиндБи.
Према нашем тренутном примеру, вредност „Основе“ је једини елемент који има цласс = ”сел” и ид = ”таб5”, чиме задовољава оба услова. Због тога је величина @ФиндБис у тест коферу 1 и приказује вредност као „Основе“.
Кеширање елемената у Пагефацтори
Сваки пут када се страница учита, сви елементи на страници се поново траже позивањем позива путем @ФиндБи или дривер.финдЕлемент () и врши се нова претрага елемената на страници.
Већину времена када су елементи динамични или се непрестано мењају током извођења, посебно ако су то АЈАКС елементи, свакако има смисла да се при сваком учитавању странице врши нова претрага свих елемената на страници.
Када веб страница има статичке елементе, кеширање елемента може помоћи на више начина. Када су елементи кеширани, не мора поново да их проналази приликом учитавања странице, већ се може позивати на спремиште кешираних елемената. Ово штеди пуно времена и подиже боље перформансе.
Пагефацтори пружа ову функцију кеширања елемената помоћу напомене @ЦацхеЛоокУп .
Напомена каже возачу да користи исту инстанцу локатора из ДОМ-а за елементе и да их не претражује поново, док инитЕлементс метода Пагефацтори видљиво доприноси чувању кешираног статичког елемента. ИнитЕлементс обављају посао кеширања елемената.
То чини концепт Пагефацтори посебним у односу на уобичајени образац дизајна предмета странице. Долази са својим предностима и недостацима о којима ћемо разговарати мало касније. На пример, дугме за пријаву на Фацебоок страници је статични елемент који се може кеширати и идеалан је елемент за кеширање.
Погледајмо сада како имплементирати напомену @ЦацхеЛоокУп
Прво ћете морати да увезете пакет за Цацхелоокуп као што је приказано доле:
import org.openqa.selenium.support.CacheLookup
Испод је исечак који приказује дефиницију елемента помоћу @ЦацхеЛоокУп. Чим се УникуеЕлемент претражи први пут, инитЕлемент () чува кеширану верзију елемента тако да се следећи пут управљачки програм не тражи елемент, већ се односи на исту кеш меморију и изводи радњу на елементу десно далеко.
@FindBy(id = 'unique') @CacheLookup private WebElement UniqueElement;
Погледајмо сада кроз стварни програм како су акције на предмеморираном веб елементу брже од оних на некешираном веб елементу:
Даље унапређујући програм нсеиндиа.цом написао сам још једну нову методу мониторПерформанце () у којој креирам предмеморирани елемент за оквир за претрагу и не-предмеморирани елемент за исти оквир за претрагу.
Тада покушавам да добијем назив ознаке елемента 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) Који су позитивни и негативни аспекти напомене @ЦацхеЛоокУп у концепту Пагефацтори?
Одговор:
Прос @ЦацхеЛоокУп и ситуације изводљиве за његово коришћење:
@ЦацхеЛоокУп је изводљив када су елементи статични или се уопште не мењају док се страница учитава. Такви елементи не мењају време рада. У таквим случајевима, препоручљиво је користити напомену да бисте побољшали укупну брзину извођења теста.
Против напомене @ЦацхеЛоокУп:
Највећи недостатак кеширања елемената са напоменом је страх од честог добијања СталеЕлементРеференцеЕкцептионс.
Динамички елементи се често освежавају оним који су осетљиви на брзу промену током неколико секунди или минута временског интервала.
Испод је неколико таквих примера динамичких елемената:
- Имати штоперицу на веб страници која се непрекидно ажурира сваке секунде.
- Оквир који стално ажурира временски извештај.
- Страница која извештава о Сенсек ажурирањима уживо.
Они уопште нису идеални или изводљиви за употребу напомене @ЦацхеЛоокУп. Ако то учините, ризикујете да добијете изузетак СталеЕлементРеференцеЕкцептионс.
На кеширању таквих елемената, током извршавања теста, ДОМ елемената се мења, али управљачки програм тражи верзију ДОМ-а која је већ била сачувана током кеширања. Због тога управљачки програм који више не постоји на веб страници тражи застарели елемент. Због тога се баца СталеЕлементРеференцеЕкцептион.
Фабричка настава:
Пагефацтори је концепт изграђен на више фабричких класа и интерфејса. Овде ћемо у овом одељку научити неколико фабричких класа и интерфејса. Неколико њих ћемо погледати АјакЕлементЛоцаторФацтори , ЕлементЛоцаторФацтори и ДефаултЕлементФацтори.
Јесмо ли се икад запитали да ли Пагефацтори пружа било који начин да се укључи Имплицитно или Експлицитно чекање елемента док се не испуни одређени услов ( Пример: Док елемент није видљив, омогућен, на њега се може кликнути итд.)? Ако је одговор да, ево одговарајућег одговора на то.
АјакЕлементЛоцаторФацтори је један од значајних учесника у свим фабричким класама. Предност АјакЕлементЛоцаторФацтори је у томе што можете доделити вредност временског ограничења за веб елемент класи Објецт паге.
Иако Пагефацтори не пружа експлицитну функцију чекања, међутим, постоји варијанта имплицитног чекања помоћу класе АјакЕлементЛоцаторФацтори . Ова класа се може користити уграђено када апликација користи Ајак компоненте и елементе.
Ево како то имплементирате у код. Унутар конструктора, када користимо методу инитЕлементс (), можемо користити АјакЕлементЛоцаторФацтори да пружимо имплицитно чекање на елементе.
PageFactory.initElements(driver, this); can be replaced with PageFactory.initElements( new AjaxElementLocatorFactory(driver, 20), this);
Горњи други ред кода подразумева да ће возач поставити временско ограничење од 20 секунди за све елементе на страници када се свако његово учитавање и ако било који елемент не буде пронађен након чекања од 20 секунди, баци „НоСуцхЕлементЕкцептион“ за тај недостајући елемент.
Такође можете дефинисати чекање као у наставку:
public pageFactoryClass(WebDriver driver) { ElementLocatorFactory locateMe = new AjaxElementLocatorFactory(driver, 30); PageFactory.initElements(locateMe, this); this.driver = driver; }
Горњи код савршено функционише јер класа АјакЕлементЛоцаторФацтори имплементира интерфејс ЕлементЛоцаторФацтори.
Овде се надређени интерфејс (ЕлементЛоцаторФацтори) односи на објекат подређене класе (АјакЕлементЛоцаторФацтори). Стога се Јава концепт „надоградње“ или „рунтиме полиморфизма“ користи приликом додељивања временског ограничења помоћу АјакЕлементЛоцаторФацтори.
С обзиром на то како технички ради, АјакЕлементЛоцаторФацтори прво креира АјакЕлементЛоцатор користећи СловЛоадаблеЦомпонент који можда није завршио учитавање када се лоад () врати. Након позива за учитавање (), метода исЛоадед () треба да настави са неуспехом све док се компонента не учита у потпуности.
Другим речима, сви елементи ће се свеже тражити сваки пут када се елементу приступи у коду позивањем позива лоцатор.финдЕлемент () из класе АјакЕлементЛоцатор који затим примењује временско ограничење до учитавања кроз класу СловЛоадаблеЦомпонент.
Поред тога, након додељивања временског ограничења преко АјакЕлементЛоцаторФацтори, елементи са @ЦацхеЛоокУп напомена више неће бити у кешу, јер ће напомена бити занемарена.
Постоје и варијације како можете звати инитЕлементс () метода и како ви не треба звати АјакЕлементЛоцаторФацтори да се елементу додели временско ограничење.
# 1) Такође можете навести име елемента уместо објекта управљачког програма, као што је приказано доле у методи инитЕлементс ():
PageFactory.initElements( , this);
инитЕлементс () метода у горњој варијанти интерно позива позив класе ДефаултЕлементФацтори и конструктор ДефаултЕлементФацтори прихвата објекат интерфејса СеарцхЦонтект као улазни параметар. Објекат веб управљачког програма и веб елемент припадају интерфејсу СеарцхЦонтект.
У овом случају, метода инитЕлементс () унапред ће се иницијализовати само за поменути елемент и неће бити иницијализовани сви елементи на веб страници.
#два) Међутим, ево занимљивог преокрета у овој чињеници који наводи како не би требало да зовете АјакЕлементЛоцаторФацтори објект на специфичан начин. Ако користим горњу варијанту инитЕлементс () заједно са АјакЕлементЛоцаторФацтори, тада неће успети.
Пример: Доле наведени код, тј. Прослеђивање имена елемента уместо објекта управљачког програма дефиницији АјакЕлементЛоцаторФацтори неће успети да функционише, јер конструктор за класу АјакЕлементЛоцаторФацтори узима само објекат веб управљачког програма као улазни параметар, па стога објекат СеарцхЦонтект са веб елементом не би радио за њега.
PageFactory.initElements(new AjaxElementLocatorFactory(, 10), this);
П # 8) Да ли је коришћење Пагефацтори изводљива опција у односу на уобичајени образац дизајна објекта странице?
Одговор: Ово је најважније питање које људи имају и зато сам помислио да га одговорим на крају водича. Сада знамо „улаз и излазак“ о Пагефацтори-у, почевши од њених концепата, коришћених напомена, додатних функција које подржава, примене путем кода, предности и недостатке.
Ипак, остајемо при овом суштинском питању да ако пагефацтори има толико добрих ствари, зашто се не бисмо држали његове употребе.
Пагефацтори долази са концептом ЦацхеЛоокУп-а за који смо видели да није изводљив за динамичке елементе попут вредности елемента који се често ажурирају. Дакле, пагефацтори без ЦацхеЛоокУп-а, да ли је добра опција за одлазак? Да, ако су кпатхси статични.
Међутим, пропаст је у томе што је модерно доба апликација испуњена тешким динамичким елементима, при чему знамо да дизајн објекта странице без пагефацтори-а на крају добро функционише, али да ли концепт пагефацтори-а једнако добро функционише и са динамичким кпатхс-има? Можда не. Ево кратког примера:
На веб страници нсеиндиа.цом видимо табелу као што је дато у наставку.

Пут пута табеле је
'//*(@id='tab9Content')/table/tbody/tr(+count+)/td(1)'
Желимо да преузмемо вредности из сваког реда за прву колону „Купи количину“. Да бисмо то урадили, требат ћемо повећати бројач редова, али индекс ступаца ће остати 1. Никако не можемо прослиједити овај динамични КСПатх у напомени @ФиндБи јер напомена прихвата статичке вриједности и ниједна варијабла се не може прослиједити то.
Овде фабрика страница у потпуности заказује док уобичајени ПОМ одлично функционише са њом. Можете лако користити петљу фор да бисте повећали индекс реда користећи такве динамичке кпатх-ове у дривер.финдЕлемент () методи.
Закључак
Модел објекта странице је концепт дизајна или образац који се користи у оквиру аутоматизације Селениум.
Конвекција метода именовањем је једноставна за употребу у објектном моделу странице. Код у ПОМ-у је лако разумљив, може се поново користити и одржавати. У ПОМ-у, ако тада дође до неке промене у веб елементу, довољно је извршити промене у одговарајућој класи, уместо да уређујете све класе.
Пагефацтори, баш као и уобичајени ПОМ, диван је концепт за примену. Међутим, морамо знати где је уобичајени ПОМ изводљив и где Пагефацтори добро одговара. У статичким апликацијама (где су и КСПатх и елементи статични), Пагефацтори се може либерално имплементирати са додатним предностима бољих перформанси.
Алтернативно, када апликација укључује и динамичке и статичке елементе, можда ћете имати мешовиту примену пом са Пагефацтори и оном без Пагефацтори у складу са изводљивошћу за сваки веб елемент.
Аутор: Овај водич је написао Схобха Д. Ради као водитељ пројекта и долази са више од 9 година искуства у ручном руковању, аутоматизацији (Селениум, ИБМ Ратионал Фунцтионал Тестер, Јава) и АПИ тестирању (СОАПУИ и Будите сигурни у Јави) .
Сада прелазимо на вас, за даљу примену Пагефацтори-а.
Срећно истраживање !!!
=> Посетите овде да бисте научили селен из огреботина.
Препоручено читање
- 30+ најбољих водича за селен: научите селен на стварним примерима
- Ефикасни сценарији за скриптирање и решавање проблема са селенијем - Водич за селениј # 27
- Отклањање грешака у скриптама селена помоћу дневника (Водич за Лог4ј) - Водич за селен # 26
- Увод у ЈУнит Фрамеворк и његову употребу у скрипту Селениум - Водич за селен # 11
- 7 фактора који утичу на процену теста пројекта аутоматизације селена - Водич за селен бр. 32
- Тврдње у селенијуму помоћу Јунит и ТестНГ оквира
- Како се користи ТестНГ Фрамеворк за креирање скрипта за селен - ТестНГ Селениум Туториал # 12
- Научите како да користите напомене ТестНГ у селену (са примерима)