페이지 객체 모델 및 팩토리 Selenium

⚡ 스마트 요약

페이지 객체 모델 및 페이지 팩토리 Selenium 견고하고 유지 관리가 가능한 테스트 자동화 프레임워크를 구축하기 위한 구조화된 디자인 패턴을 정의합니다. WebElements와 그 동작을 캡슐화하는 페이지별 클래스를 만드는 데 중점을 두어 중복을 줄이고 가독성과 확장성을 향상시킵니다. Selenium 테스트 스크립트.

  • 핵심 개념: 각 애플리케이션 페이지는 WebElements와 해당 요소에서 수행되는 작업을 모두 포함하는 전용 페이지 클래스에 해당하므로 UI ​​구조와 테스트 논리를 명확하게 구분할 수 있습니다.
  • 구현 초점: POM은 재사용 가능하고 중앙화된 요소 관리를 촉진합니다. 즉, 페이지 요소를 수정하면 여러 스크립트가 아닌 단 하나의 클래스만 업데이트하면 됩니다.
  • 디자인의 장점: 이 모델은 프레임워크와 통합할 수 있는 더 깔끔하고 모듈식이며 도구에 독립적인 객체 저장소를 보장합니다. TestNG, JUnit, Cucumber, 또는 JBehave.
  • 명명 규칙 : 페이지 클래스 내의 메서드는 실제 UI 작업을 미러링해야 합니다(예: gotoHomePage()), 자동화 워크플로의 의미적 명확성을 강화합니다.
  • 강화된 구조: Page Factory는 다음을 사용하여 POM을 개선합니다. @FindBy 주석 및 PageFactory.initElements() 자동 WebElement 초기화를 위해 반복적인 작업을 제거합니다. findElement 전화.
  • 성능 최적화: AjaxElementLocatorFactory 지연 로딩을 도입하여 요소가 액세스될 때만 위치를 지정하여 실행 효율성을 개선하고 동적 페이지 동작을 우아하게 처리합니다.
  • 결과: 통합된 접근 방식은 최신 기술에 맞춰 유지 관리 가능하고 읽기 쉬우며 확장 가능한 테스트 자동화 아키텍처를 제공합니다. Selenium 관행.

페이지 개체 모델

페이지 객체 모델이란 무엇이며, 주요 구성 요소는 무엇인가요?

페이지 개체 모델(POM) 테스트 자동화에 널리 사용되는 디자인 패턴으로, 웹 UI 요소에 대한 객체 저장소를 생성합니다. 이 모델의 장점은 코드 중복을 줄이고 테스트 유지 관리를 개선한다는 것입니다.

이 모델에서는 애플리케이션의 각 웹 페이지마다 해당 페이지 클래스가 있어야 합니다. 이 페이지 클래스는 해당 웹 페이지의 웹 요소(WebElements)를 식별하고, 해당 웹 요소에 대한 작업을 수행하는 페이지 메서드도 포함합니다. 이러한 메서드의 이름은 수행하는 작업에 따라 지정해야 합니다. 예를 들어, 로더가 결제 ​​게이트웨이가 나타날 때까지 기다리는 경우 POM 메서드 이름은 waitForPaymentScreenDisplay()가 될 수 있습니다.

페이지 객체 모델의 주요 구성 요소

  • 페이지 클래스: 각 웹 페이지를 별도의 클래스로 표현합니다.
  • 위치: ID, XPath 또는 CSS 선택기를 사용하여 웹 요소를 식별합니다.
  • 행동 양식: .page 요소에서 수행되는 작업이나 작업을 포함합니다.
  • 재사용 성: Promo테스트 코드 재사용 및 테스트 전반의 유지관리가 쉬워집니다.
  • 우려사항 분리: 더 나은 구성을 위해 테스트 논리와 독립적으로 페이지 구조를 유지합니다.

페이지 개체 모델

왜 페이지 객체 모델인가?

UI 자동화 시작 Selenium 웹드라이버 어려운 작업은 아닙니다. 단지 요소를 찾아서 연산을 수행하면 됩니다.

웹사이트에 로그인하는 간단한 스크립트를 살펴보겠습니다.

페이지 개체 모델

보시다시피 우리가 하는 일은 요소를 찾고 해당 요소에 대한 값을 채우는 것뿐입니다.

이 스크립트는 시간이 많이 걸리고 오류가 발생하기 쉽습니다. 처음에는 쉬워 보이지만 테스트 스위트가 확장됨에 따라 요소 변경 사항을 관리하기가 어려워집니다. 하지만 시간이 지남에 따라 테스트 스위트는 점점 더 커집니다. 코드에 줄을 더 많이 추가할수록 상황이 어려워집니다.

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

스크립트 유지 관리를 위한 더 나은 방법은 웹 요소를 찾고, 채우고, 검증하는 별도의 클래스 파일을 만드는 것입니다. 이 클래스는 같은 요소와 상호 작용하는 여러 테스트 스크립트에서 재사용될 수 있습니다. 앞으로 웹 요소에 변경 사항이 발생하면 10개의 스크립트가 아닌 단 하나의 클래스 파일에서 변경 사항을 적용해야 합니다.

이 접근 방식을 페이지 개체 모델이라고 합니다. Selenium. 이는 코드의 가독성, 유지 관리 및 재사용성을 높이는 데 도움이 됩니다.

 페이지 개체 모델

👉 무료 라이브 등록 Selenium 하이라이트

POM의 장점

  1. 페이지 객체 디자인 패턴은 UI의 작업과 흐름을 검증과 분리해야 한다고 말합니다. 이 개념은 코드를 더 깔끔하고 이해하기 쉽게 만듭니다.
  2. 두 번째 이점은 객체 저장소가 테스트 케이스와 독립적이기 때문에 동일한 객체 저장소를 다른 도구로 다른 목적으로 사용할 수 있다는 것입니다. 예를 들어, 페이지 객체 모델을 다음에서 통합할 수 있습니다. Selenium 과 TestNG/JUnit 기능성 지원 동시에 JBehave/Cucumber 승인 테스트를 위해.
  3. POM 클래스의 페이지 메서드를 재사용하므로 코드가 더 작아지고 최적화됩니다.
  4. 메서드에는 UI에서 발생하는 작업에 쉽게 매핑할 수 있는 보다 현실적인 이름이 지정됩니다. 예를 들어, 버튼을 클릭한 후 홈페이지에 도착하면 메서드 이름은 'gotoHomePage()'와 같습니다.

POM을 구현하는 방법 Selenium?

Page Object Model 프레임워크의 기본 구조에 있는 간단한 PLog는 다음과 같습니다. AUT 이러한 웹 요소에서 작동하는 메서드는 clog 파일 내부에 유지됩니다. 검증과 같은 작업은 테스트 메서드의 일부로 분리되어야 합니다.

POM 구현

완전한 예

테스트케이스: Guru99 데모 사이트로 이동합니다.

1단계) Guru99 데모 사이트로 이동

POM 구현

2단계) 홈페이지에서 "Guru99 Bank"라는 텍스트가 있는지 확인하세요.

POM 구현

3단계) ​​애플리케이션에 로그인하세요.

POM 구현

4단계) 홈 페이지에 "관리자 ID: 데모"라는 텍스트가 포함되어 있는지 확인합니다.

POM 구현

이 예에서는 두 페이지를 다루고 있습니다.

  1. 페이지 로그인
  2. 홈 페이지(로그인하면 표시됨)

따라서 우리는 2개의 POM을 생성합니다. Selenium 수업

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;
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        driver.findElement(user99GuruName).sendKeys(strUserName);
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
         driver.findElement(password99Guru).sendKeys(strPassword);
    }
    //Click on the login button
    public void clickLogin(){
            driver.findElement(login).click();
    }
    //Get the title of Login Page
    public String getLoginTitle(){
     return    driver.findElement(titleText).getText();
    }
    /**
     * This POM method allows the test case to perform the login operation
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();        
    }
}

Guru99 홈 페이지 POM in Selenium

package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99HomePage {
    WebDriver driver;
    By homePageUserName = By.xpath("//table//tr[@class='heading3']");
    public Guru99HomePage(WebDriver driver){
        this.driver = driver;
    }
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    driver.findElement(homePageUserName).getText();
        }
}

Guru99 단순 POM Selenium 테스트 케이스

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pages.Guru99HomePage;
import pages.Guru99Login;
public class Test99GuruLogin {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage;
    @BeforeTest
    public void setup(){
	System.setProperty("webdriver.gecko.driver", driverPath);        
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test case will login in https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }

페이지 팩토리란 무엇인가요? Selenium?

페이지 팩토리 Selenium 내장된 페이지 개체 모델 프레임워크 개념입니다. Selenium 실행 속도가 아닌, 어노테이션을 사용하여 반복적인 요소 조회를 줄여 유지 관리성을 향상시키는 WebDriver입니다. 페이지 객체를 초기화하거나 페이지 객체 자체를 인스턴스화하는 데 사용됩니다. 또한 "FindElement"를 사용하지 않고 페이지 클래스 요소를 초기화하는 데에도 사용됩니다.

여기에서도 페이지 개체 저장소와 테스트 방법을 분리하는 개념을 따릅니다. 또한 PageFactory 클래스의 도움으로 Selenium, 우리는 주석을 사용합니다 @FindBy WebElement를 찾으려면 initElements 메서드를 사용하여 웹 요소를 초기화합니다.

페이지 팩토리 인 Selenium

@FindBy 받아 들일 수있다 tagName, 부분 링크 텍스트, 이름, linkText, id, css, className, xpath 속성으로.

Page Factory를 사용하여 위와 동일한 예를 살펴보겠습니다.

Guru99 Page Factory 로그인 페이지

package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99Login {
    /**
     * All WebElements are identified by @FindBy annotation
     */
    WebDriver driver;
    @FindBy(name="uid")
    WebElement user99GuruName;
    @FindBy(name="password")
    WebElement password99Guru;    
    @FindBy(className="barone")
    WebElement titleText;
    @FindBy(name="btnLogin")
    WebElement login;
    public Guru99Login(WebDriver driver){
        this.driver = driver;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }
    //Set user name in textbox
    public void setUserName(String strUserName){
        user99GuruName.sendKeys(strUserName);     
    }
    //Set password in password textbox
    public void setPassword(String strPassword){
    password99Guru.sendKeys(strPassword);
    }
    //Click on login button
    public void clickLogin(){
            login.click();

    }  
    //Get the title of Login Page
    public String getLoginTitle(){
     return    titleText.getText();
    }
    /**
     * This POM method will be exposed in test case to login in the application
     * @param strUserName
     * @param strPasword
     * @return
     */
    public void loginToGuru99(String strUserName,String strPasword){
        //Fill user name
        this.setUserName(strUserName);
        //Fill password
        this.setPassword(strPasword);
        //Click Login button
        this.clickLogin();           
    }
}

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;
        //This initElements method will create all WebElements
        PageFactory.initElements(driver, this);
    }   
    //Get the User name from Home Page
        public String getHomePageDashboardUserName(){
         return    homePageUserName.getText();
        }
}

Page Factory 개념을 사용한 Guru99 TestCase

package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import PageFactory.Guru99HomePage;
import PageFactory.Guru99Login;
public class Test99GuruLoginWithPageFactory {
    String driverPath = "C:\\geckodriver.exe";    
    WebDriver driver;
    Guru99Login objLogin;
    Guru99HomePage objHomePage; 
    @BeforeTest
    public void setup(){
        System.setProperty("webdriver.gecko.driver", driverPath);       
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        driver.get("https://demo.guru99.com/V4/");
    }
    /**
     * This test go to https://demo.guru99.com/V4/
     * Verify login page title as guru99 bank
     * Login to application
     * Verify the home page using Dashboard message
     */
    @Test(priority=0)
    public void test_Home_Page_Appear_Correct(){
        //Create Login Page object
    objLogin = new Guru99Login(driver);
    //Verify login page title
    String loginPageTitle = objLogin.getLoginTitle();
    Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
    //login to application
    objLogin.loginToGuru99("mgr123", "mgr!23");
    // go the next page
    objHomePage = new Guru99HomePage(driver);
    //Verify home page
    Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
    }
}

전체 프로젝트 구조는 다이어그램과 같습니다.

페이지 팩토리 Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory PageFactory의 지연 로딩 개념입니다. Selenium. 웹 요소가 어떤 작업에 사용될 때만 해당 요소를 찾는 데 사용됩니다. WebElements에 대한 시간 제한을 객체 페이지 클래스에 할당합니다. PageFactory 패턴을 사용하는 주요 이점 중 하나는 Selenium AjaxElementLocatorFactory 클래스입니다.

여기서 요소에 작업이 수행되면 해당 요소의 가시성 대기는 해당 순간부터 시작됩니다. 주어진 시간 간격 내에 요소가 발견되지 않으면, 테스트 케이스 실행하면 'NoSuchElementException' 예외가 발생합니다.

AjaxElement 로케이터 팩토리

예 :

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

를 다운로드 Selenium 이 튜토리얼의 데모용 프로젝트 파일

자주 묻는 질문

페이지 객체 모델은 웹 페이지 요소를 별도의 클래스로 추상화하는 디자인 패턴입니다. UI 상호작용과 테스트 로직을 분리하여 자동화를 간소화하고, 명확성과 확장성을 높이며, 코드 중복을 줄입니다.

In SeleniumPOM은 각 웹 페이지를 로케이터와 액션을 포함하는 전용 클래스로 표현합니다. UI 요소를 캡슐화하여 테스트 스크립트가 기본 페이지 구조 변경과 독립적으로 유지될 수 있도록 합니다.

POM은 독립형 프레임워크가 아닌 디자인 패턴입니다. 모든 자동화 프레임워크에 통합되어 테스트를 효율적으로 구성하고, 더 나은 구성, 재사용성 및 유지 관리성을 보장할 수 있습니다.

POM은 각 웹 페이지를 정의된 로케이터와 메서드를 가진 클래스로 모델링하는 설계 원칙입니다. 테스트 로직을 UI 요소에서 분리하여 가독성, 확장성 및 장기적인 유지 관리를 향상시킵니다.

POM은 페이지 추상화를 위한 디자인 구조를 정의하는 반면, Page Factory는 주석과 메서드를 제공합니다.@FindBy) 웹 요소를 효율적으로 초기화하는 데 사용됩니다. Page Factory는 POM을 개선한 구현 방식입니다.

POM은 요소 로케이터와 페이지 작업을 전용 클래스 내에 중앙 집중화합니다. 모든 UI 수정은 한 곳에서만 업데이트되므로 재작업을 최소화하고 코드 재사용성을 향상시키며 테스트 유지 관리를 가속화합니다.

네. AI 기반 테스트 생성기는 UI 계층 구조를 분석하여 POM 클래스를 자동으로 생성하고, 관심사를 논리적으로 분리하는 동시에 엔드투엔드 테스트 생성 속도를 높일 수 있습니다.

POM은 모듈식이고 재사용 가능한 테스트 구성 요소를 장려하여 로케이터를 자동으로 업데이트하는 AI 기반 테스트 유지 관리 도구와의 통합을 가능하게 하여 스크립트 취약성과 유지 관리 오버헤드를 줄입니다.

이 게시물을 요약하면 다음과 같습니다.