Page Object Model에 대해 배우기 전에,
왜 POM인가?
Selenium WebDriver에서 UI 자동화를 시작하는 것은 어려운 작업이 아닙니다. 요소를 찾고 조작을 수행하면됩니다.
웹 사이트에 로그인하려면이 간단한 스크립트를 고려하십시오.
보시다시피, 우리가하는 일은 요소를 찾고 그 요소에 값을 채우는 것입니다.
이것은 작은 스크립트입니다. 스크립트 유지 관리가 쉬워 보입니다. 그러나 시간이 지남에 따라 테스트 스위트가 늘어날 것입니다. 코드에 점점 더 많은 라인을 추가하면 상황이 어려워집니다.
스크립트 유지 보수의 가장 큰 문제점은 10 개의 다른 스크립트가 동일한 요소를 사용하고 해당 요소가 변경되면 10 개의 스크립트를 모두 변경해야한다는 것입니다. 이것은 시간이 오래 걸리며 오류가 발생하기 쉽습니다.
스크립트 유지 관리에 더 나은 방법은 웹 요소를 찾고 채우거나 확인하는 별도의 클래스 파일을 만드는 것입니다. 이 클래스는 해당 요소를 사용하는 모든 스크립트에서 재사용 할 수 있습니다. 웹 요소에 변경 사항이있는 경우 향후 10 개의 다른 스크립트가 아닌 1 개의 클래스 파일 만 변경해야합니다.
이러한 접근 방식을 POM (Page Object Model)이라고 합니다. 이 코드는 데 도움이 더 많은 읽을 유지 보수 및 재사용.
POM이란 무엇입니까?
- 페이지 객체 모델 은 웹 UI 요소에 대한 객체 저장소 를 만드는 디자인 패턴 입니다.
- 이 모델에서는 응용 프로그램의 각 웹 페이지마다 해당 페이지 클래스가 있어야합니다.
- 이 Page 클래스는 해당 웹 페이지의 WebElements를 찾으며 해당 WebElements에서 작업을 수행하는 Page 메서드를 포함합니다.
- 이 메소드의 이름은 수행중인 태스크에 따라 지정되어야합니다. 즉, 로더가 지불 게이트웨이가 표시되기를 기다리는 경우 POM 메소드 이름은 waitForPaymentScreenDisplay ()가 될 수 있습니다.
POM의 장점
- Page Object Patten은 UI에서의 작업과 흐름은 검증과 분리되어야한다고 말합니다. 이 개념은 코드를보다 명확하고 이해하기 쉽게 만듭니다.
- 두 번째 이점은 객체 저장소가 테스트 케이스 와 독립적 이므로 다른 툴을 사용하여 동일한 목적을 위해 동일한 객체 저장소를 사용할 수 있다는 것입니다. 예를 들어 기능 테스트를 위해 POM을 TestNG / JUnit과 통합 하고 수용 테스트를 위해 JBehave / Cucumber와 동시에 테스트 할 수 있습니다.
- 코드는 POM 클래스의 재사용 가능한 페이지 메소드 때문에 덜 최적화됩니다.
- 메서드 는 UI에서 발생하는 작업과 쉽게 매핑 할 수있는 좀 더 사실적인 이름 을 가져옵니다 . 예를 들어 홈 페이지에있는 버튼을 클릭하면 메소드 이름은 'gotoHomePage ()'와 같습니다.
POM을 구현하는 방법?
간단한 POM :
이것은 AUT 의 모든 웹 요소 와 이러한 웹 요소에서 작동하는 메소드가 클래스 파일 내에 유지 되는 Page Object Model (POM)의 기본 구조입니다. 검증 과 같은 작업 은 Test 메소드의 일부로 분리 되어야합니다 .
완전한 예
TestCase : Guru99 데모 사이트로 이동하십시오.
1 단계) Guru99 데모 사이트로 이동하십시오. | |
2 단계) 홈 페이지 확인 텍스트 "Guru99 Bank" 있음 | |
3 단계) 신청서에 로그인하십시오. | |
4 단계 : 홈페이지에 "Manger Id : demo"라는 텍스트가 있는지 확인합니다. |
다음은 2 페이지를 다루고 있습니다.
- 로그인 페이지
- 홈 페이지 (로그인하면 표시됨)
따라서 2 개의 POM 클래스를 만듭니다.
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;
}
// 텍스트 상자에 사용자 이름을 설정합니다.
public void setUserName(String strUserName){
driver.findElement(user99GuruName).sendKeys(strUserName);
}
// 암호 텍스트 상자에 암호 설정
public void setPassword(String strPassword){
driver.findElement(password99Guru).sendKeys(strPassword);
}
// 로그인 버튼을 클릭하십시오.
public void clickLogin(){
driver.findElement(login).click();
}
// 로그인 페이지의 제목 가져 오기
public String getLoginTitle(){
return driver.findElement(titleText).getText();
}
/**
* 이 POM 메소드는 테스트 케이스에서 애플리케이션에 로그인하기 위해 공개됩니다.
* @param strUserName
* @param strPasword
* @return
*/
public void loginToGuru99(String strUserName,String strPasword){
// 사용자 이름 채우기
this.setUserName(strUserName);
// 암호를 입력하십시오.
this.setPassword(strPasword);
// 로그인 버튼 클릭
this.clickLogin();
}
}
Guru99 홈 페이지 POM
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;
}
// 홈 페이지에서 사용자 이름 가져 오기
public String getHomePageDashboardUserName(){
return driver.findElement(homePageUserName).getText();
}
}
Guru99 단순 POM 테스트 케이스
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 {
WebDriver driver;
Guru99Login objLogin;
Guru99HomePage objHomePage;
@BeforeTest
public void setup(){
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://demo.guru99.com/V4/");
}
/**
* 이 테스트 케이스는 http://demo.guru99.com/V4/에 로그인합니다.
* 로그인 페이지 제목을 guru99 은행으로 확인하십시오.
* 신청서에 로그인하십시오.
* 대시 보드 메시지를 사용하여 홈 페이지 확인
*/
@Test(priority=0)
public void test_Home_Page_Appear_Correct(){
// 로그인 페이지 객체를 만듭니다.
objLogin = new Guru99Login(driver);
// 로그인 페이지 제목 확인
String loginPageTitle = objLogin.getLoginTitle();
Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
// 응용 프로그램에 로그인하십시오.
objLogin.loginToGuru99("mgr123", "mgr!23");
// 다음 페이지로 이동
objHomePage = new Guru99HomePage(driver);
// 홈 페이지 확인
Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mgr123"));
}
페이지 팩토리 란 무엇입니까?
Page Factory는 Selenium WebDriver를위한 내장 된 Page Object Model 개념이지만 매우 최적화되어 있습니다.
여기서도 Page Object Repository와 Test Methods의 분리 개념을 따릅니다. 또한 PageFactory 클래스를 사용 하여 WebElement를 찾기 위해 @FindBy 주석을 사용 합니다. initElements 메소드를 사용하여 웹 요소를 초기화합니다.
@FindBy 는 속성으로 tagName, partialLinkText, name, linkText, id, css, className, xpath 를 사용할 수 있습니다.
페이지 팩토리를 사용하여 위와 같은 예제를 살펴 보겠습니다.
페이지 팩토리의 Guru99 로그인 페이지
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 {
/**
* 모든 WebElements는 @FindBy 주석으로 식별됩니다.
*/
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;
//이 initElements 메소드는 모든 WebElements를 생성합니다.
PageFactory.initElements(driver, this);
}
// 텍스트 상자에 사용자 이름을 설정합니다.
public void setUserName(String strUserName){
user99GuruName.sendKeys(strUserName);
}
// 암호 텍스트 상자에 암호 설정
public void setPassword(String strPassword){
password99Guru.sendKeys(strPassword);
}
// 로그인 버튼을 클릭하십시오.
public void clickLogin(){
login.click();
}
// 로그인 페이지의 제목 가져 오기
public String getLoginTitle(){
return titleText.getText();
}
/**
* 이 POM 메소드는 테스트 케이스에서 애플리케이션에 로그인하기 위해 공개됩니다.
* @param strUserName
* @param strPasword
* @return
*/
public void loginToGuru99(String strUserName,String strPasword){
// 사용자 이름 채우기
this.setUserName(strUserName);
// 암호를 입력하십시오.
this.setPassword(strPasword);
// 로그인 버튼 클릭
this.clickLogin();
}
}
Page Factory의 Guru99 홈 페이지
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;
//이 initElements 메소드는 모든 WebElements를 생성합니다.
PageFactory.initElements(driver, this);
}
// 홈 페이지에서 사용자 이름 가져 오기
public String getHomePageDashboardUserName(){
return homePageUserName.getText();
}
}
테스트 페이지 컨셉 Guru99 테스트 케이스
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 {
WebDriver driver;
Guru99Login objLogin;
Guru99HomePage objHomePage;
@BeforeTest
public void setup(){
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://demo.guru99.com/V4/");
}
/**
*이 테스트는 http://demo.guru99.com/V4/로 이동합니다.
* 로그인 페이지 제목을 guru99 은행으로 확인하십시오.
* 신청서에 로그인하십시오.
* 대시 보드 메시지를 사용하여 홈 페이지 확인
*/
@Test(priority=0)
public void test_Home_Page_Appear_Correct(){
// 로그인 페이지 객체를 만듭니다.
objLogin = new Guru99Login(driver);
// 로그인 페이지 제목 확인
String loginPageTitle = objLogin.getLoginTitle();
Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
// 응용 프로그램에 로그인하십시오.
objLogin.loginToGuru99("mgr123", "mgr!23");
// 다음 페이지로 이동
objHomePage = new Guru99HomePage(driver);
// 홈 페이지 확인
Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manger id : mgr123"));
}
}
프로젝트 구조 전체가 다이어그램처럼 보일 것입니다 :
AjaxElementLocatorFactory
Page Factory 패턴을 사용할 때의 주요 이점 중 하나는 AjaxElementLocatorFactory 클래스입니다.
그것은 게으른 로딩 컨셉을 다루고 있습니다. 즉, WebElement의 타임 아웃은 AjaxElementLocatorFactory의 도움을 받아 Object 페이지 클래스에 할당 될 것입니다.
여기에서, 한 요소에 대해 연산이 수행 될 때 그 가시성이 그 순간부터 시작될 때까지 기다린다. 요소가 주어진 시간 간격에서 발견되지 않으면 테스트 케이스 실행은 'NoSuchElementException'예외를 발생시킵니다.
개요
- Page Object Model은 Selenium WebDriver의 Object Repository 디자인 패턴입니다.
- POM은 유지 보수가 가능하고 재사용 가능한 테스트 코드를 생성합니다.
- 페이지 팩토리는 POM 개념으로 객체 저장소를 만드는 최적의 방법입니다.
- AjaxElementLocatorFactory는 임의의 작업에서 WebElements를 사용할 때만 식별 할 수 있도록 페이지 팩토리 패턴의 지연로드 개념입니다.
이 튜토리얼의 데모 용 Selenium Project 파일은 첨부하였습니다.
'자동화테스트 > Selenium' 카테고리의 다른 글
Maven & Jenkins with Selenium : 전체 자습서 (0) | 2018.12.08 |
---|---|
Selenium Grid Tutorial : 명령 행 및 JSON 예제 (0) | 2018.12.07 |
Selenium Webdriver의 Excel 파일에서 데이터 읽기 및 쓰기 : POI 및 JXL (0) | 2018.12.05 |
TestNG : Selenium에서 XML 및 DataProvider를 사용하여 매개 변수화 (0) | 2018.12.04 |
(selenium) 암시 적 대기 및 명시적인 셀레니움 대기 (0) | 2018.12.03 |