자동화테스트/Selenium2018. 12. 6. 08:00

Page Object Model에 대해 배우기 전에,

왜 POM인가?

Selenium WebDriver에서 UI 자동화를 시작하는 것은 어려운 작업이 아닙니다. 요소를 찾고 조작을 수행하면됩니다.

웹 사이트에 로그인하려면이 간단한 스크립트를 고려하십시오.

Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서

보시다시피, 우리가하는 일은 요소를 찾고 그 요소에 값을 채우는 것입니다.

이것은 작은 스크립트입니다. 스크립트 유지 관리가 쉬워 보입니다. 그러나 시간이 지남에 따라 테스트 스위트가 늘어날 것입니다. 코드에 점점 더 많은 라인을 추가하면 상황이 어려워집니다.

스크립트 유지 보수의 가장 큰 문제점은 10 개의 다른 스크립트가 동일한 요소를 사용하고 해당 요소가 변경되면 10 개의 스크립트를 모두 변경해야한다는 것입니다. 이것은 시간이 오래 걸리며 오류가 발생하기 쉽습니다.

스크립트 유지 관리에 더 나은 방법은 웹 요소를 찾고 채우거나 확인하는 별도의 클래스 파일을 만드는 것입니다. 이 클래스는 해당 요소를 사용하는 모든 스크립트에서 재사용 할 수 있습니다. 웹 요소에 변경 사항이있는 경우 향후 10 개의 다른 스크립트가 아닌 1 개의 클래스 파일 만 변경해야합니다.

이러한 접근 방식을  POM (Page Object Model)이라고 합니다. 이 코드는 데 도움이  더 많은 읽을 유지 보수 및  재사용.

     Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서

POM이란 무엇입니까?

  • 페이지 객체 모델  은  웹 UI 요소에 대한 객체 저장소 를 만드는 디자인 패턴  입니다.
  • 이 모델에서는 응용 프로그램의 각 웹 페이지마다 해당 페이지 클래스가 있어야합니다.
  • 이 Page 클래스는 해당 웹 페이지의 WebElements를 찾으며 해당 WebElements에서 작업을 수행하는 Page 메서드를 포함합니다.
  • 이 메소드의 이름은 수행중인 태스크에 따라 지정되어야합니다. 즉, 로더가 지불 게이트웨이가 표시되기를 기다리는 경우 POM 메소드 이름은 waitForPaymentScreenDisplay ()가 될 수 있습니다.

Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서

POM의 장점

  1. Page Object Patten은 UI에서의 작업과 흐름은 검증과 분리되어야한다고 말합니다. 이 개념은 코드를보다 명확하고 이해하기 쉽게 만듭니다.
  2. 두 번째 이점은  객체 저장소가 테스트 케이스 와 독립적 이므로 다른 툴을 사용하여 동일한 목적을 위해 동일한 객체 저장소를 사용할 수 있다는 것입니다. 예를 들어 기능 테스트를 위해 POM을 TestNG / JUnit과 통합 하고 수용 테스트를 위해 JBehave / Cucumber와 동시에 테스트 할 수 있습니다.
  3. 코드는 POM 클래스의 재사용 가능한 페이지 메소드 때문에 덜 최적화됩니다.
  4. 메서드  는 UI에서 발생하는 작업과 쉽게 매핑 할 수있는  좀 더 사실적인 이름 을 가져옵니다  예를 들어 홈 페이지에있는 버튼을 클릭하면 메소드 이름은 'gotoHomePage ()'와 같습니다.    

POM을 구현하는 방법?

간단한 POM :

이것은 AUT 의 모든 웹 요소  와 이러한 웹 요소에서 작동하는 메소드가 클래스 파일 내에 유지 되는 Page Object Model (POM)의 기본 구조입니다.  검증 과 같은 작업   은 Test 메소드의 일부로 분리  되어야합니다  .    

Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서

완전한 예

TestCase :  Guru99 데모 사이트로 이동하십시오.

1 단계) Guru99 데모 사이트로 이동하십시오.Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서
2 단계) 홈 페이지 확인 텍스트  "Guru99 Bank"  있음Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서
3 단계) 신청서에 로그인하십시오.Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서
4 단계 : 홈페이지에 "Manger Id : demo"라는 텍스트가 있는지 확인합니다.Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서

다음은 2 페이지를 다루고 있습니다.

  1. 로그인 페이지
  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 메소드를 사용하여 웹 요소를 초기화합니다.

Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서

@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"));

    }

    

}

프로젝트 구조 전체가 다이어그램처럼 보일 것입니다 :

Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서

AjaxElementLocatorFactory

    Page Factory 패턴을 사용할 때의 주요 이점 중 하나는 AjaxElementLocatorFactory 클래스입니다.

그것은 게으른 로딩 컨셉을 다루고 있습니다. 즉, WebElement의 타임 아웃은 AjaxElementLocatorFactory의 도움을 받아 Object 페이지 클래스에 할당 될 것입니다.

여기에서, 한 요소에 대해 연산이 수행 될 때 그 가시성이 그 순간부터 시작될 때까지 기다린다. 요소가 주어진 시간 간격에서 발견되지 않으면 테스트 케이스 실행은 'NoSuchElementException'예외를 발생시킵니다.

Selenium의 Page Object Model (POM) 및 페이지 팩토리 : 전체 자습서

개요

  1. Page Object Model은 Selenium WebDriver의 Object Repository 디자인 패턴입니다.
  2. POM은 유지 보수가 가능하고 재사용 가능한 테스트 코드를 생성합니다.
  3. 페이지 팩토리는 POM 개념으로 객체 저장소를 만드는 최적의 방법입니다.
  4. AjaxElementLocatorFactory는 임의의 작업에서 WebElements를 사용할 때만 식별 할 수 있도록 페이지 팩토리 패턴의 지연로드 개념입니다.


이 튜토리얼의 데모 용 Selenium Project 파일은 첨부하였습니다.

POMExample_v1.zip


"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
Posted by 프리스케이터