Selenium의 페이지 개체 모델 및 PageFactory

✒️ 페이지 개체 모델이란 무엇입니까?



POM은 웹 요소를 저장하기 위해 Object Repository를 생성하는 Selenium의 디자인 패턴입니다. POM에서는 개체 저장소와 테스트 클래스의 분리 원칙을 따릅니다. 각 개체 저장소에는 해당 웹 페이지의 요소만 포함됩니다.

✒️ POM의 장점은 무엇인가요?



✔️ 손쉬운 유지보수: POM은 모든 페이지가 분리되어 있어 어떤 웹 페이지에 변경 사항이 있을 경우 쉽게 식별하고 변경할 수 있습니다. 개체 저장소의 변경 사항은 다른 곳의 코드에 영향을 주지 않습니다.

✔️ 재사용성: 단일 객체 저장소를 다양한 TestCase에 사용할 수 있습니다. 또한 Selenium의 동일한 POM을 기능 테스트 및 승인 테스트와 같은 다양한 유형의 테스트와 동시에 통합할 수 있습니다.

✔️ 가독성: 테스터는 특정 웹 페이지에서 수행될 작업을 쉽게 식별할 수 있습니다.

⚠️ 확인 또는 어설션은 Object Repository에 속하면 안 됩니다. ⚠️



✒️ Selenium의 PageFactory는 무엇입니까?



PageFactory는 POM을 구현하는 데 매우 최적화된 방법입니다. 일반 POM의 기능을 확장하는 Selenium WebDriver에서 제공하는 class입니다.

1️⃣ @FindBy : 웹 요소를 선언하기 위해 Page Factory에서 사용되는 주석입니다. @FindBy 주석은 다음을 지원합니다. id, name, className, css, tagName, linkText, partialLinkText, xpath . 다음은 @FindBy-를 사용하여 webelement를 선언한 예입니다.

@FindBy(class="elementClass")
WebElement element;



2️⃣ initElements() : Page Factory 클래스의 static 메서드로, 주어진 클래스의 인스턴스를 인스턴스화합니다. 또한 @FindBy 주석으로 정의된 모든 웹 요소를 초기화하는 데 사용됩니다.

public RegistrationPage(WebDriver driver) {           
         this.driver = driver; 
         PageFactory.initElements(driver, this);
}



3️⃣ AjaxElementLocatorFactory: AjaxElementLocatorFactory는 PageFactory의 Lazy Loading 개념입니다. 특히 Ajax가 많은 애플리케이션에서 사용자 작업을 기반으로 런타임 중에 변경되는 동적 요소를 처리하는 데 사용됩니다. AjaxElementLocatorFactory를 사용하여 웹 요소에 대해 타임아웃을 설정할 수도 있습니다.

AjaxElementLocatorFactory ajaxFactory = new AjaxElementLocatorFactory(driver, 30);
PageFactory.initElements(ajaxFactory, this);




✒️ PageFactory의 기본 동작:


  • @FindBy를 사용하여 선언된 웹 요소가 한 번에 초기화되지만 브라우저 DOM에서 검색되지 않음
  • WebDriver는 특정 웹 요소가 호출될 때마다 또는 작업이 발생할 때마다 검색합니다.
  • 정적 요소의 경우 나중에 사용할 수 있도록 웹 요소를 캐시하는 주석을 제공합니다@CacheLookup.


  • ✒️ POM과 PageFactory의 차이점:




    페이지 개체 모델
    페이지팩토리


    페이지 개체 모델은 디자인 패턴입니다.
    PageFactory는 POM 구현을 제공하는 class입니다.

    POM에서는 모든 페이지 개체의 개별 초기화가 필요합니다.
    PageFactory에서 모든 페이지 개체는 initElements() 메서드를 사용하여 한 번에 초기화됩니다.
    By를 사용하여 웹 요소 정의
    @FindBy 주석을 사용하여 웹 요소를 정의합니다.

    POM은 지연 초기화를 지원하지 않으므로 최적이 아닙니다.
    지연 초기화를 지원하며 최적입니다.

    POM이 처리할 수 없습니다StaleElementReferenceException.
    오래된 요소가 호출될 때마다 검색하여 효율적으로 처리합니다StaleElementReferenceException.





    ✒️ @CacheLookUp 주석:


    @CacheLookUp 주석은 일반적으로 변경되지 않는 요소에 사용되는 반복 검색 대신 웹 페이지에 처음 도착할 때 WebElement의 캐시를 유지하는 데 사용됩니다.

    페이지 개체 저장소에서 WebElement가 호출될 때마다 findElement() REST 요청이 WebDriver로 전송됩니다. 이것은 페이지 로딩 후 웹 요소의 최신 버전을 찾는 Pagefactory의 중요한 이점 중 하나를 충족합니다. 그러나 프로세스가 느리고 시간 소모적입니다(분명히 많이!). 여기에서 @CacheLookUp가 문제를 해결합니다.

    ✒️ @CacheLookUp을 사용하지 않는 경우는 언제입니까?



    본질적으로 동적인 요소에는 적합하지 않습니다. AJAX 기반 애플리케이션의 경우 사용자 상호 작용에 따라 DOM이 자주 변경되는 경우 작동하지 않을 수 있습니다. @CacheLookUp 주석을 사용하면 WebDriver에서 StaleElementExceptions가 발생할 수 있습니다.

    좋은 웹페이지 즐겨찾기