ページオブジェクトモデルの適用


ページオブジェクトモデルとは?
Page Object Modelは、ロケータ、テストボックス、テストスイートルームなどをモジュール化して個別ファイルとして管理する設計モデルです
では、なぜPOMモードを使うのでしょうか.
Page Object Modelは、コードの重複を減らし、テスト事例を維持する上で非常に効果的です.
たとえば、ログインページの1つのElementが変更されたと仮定すると、Elementを変更するすべてのテストケースを1つずつ変更する必要がある場合があります.ただし、モジュール化されたファイルでこの要素を管理する場合は、1つのファイルを変更するだけで簡単にメンテナンスできます.
したがって、メンテナンスやコード再利用を容易にし、コードの可読性と信頼性を確保するためには、POMモードを使用することが望ましい.
POM構造例
├── Config                               # 공통으로 사용하는 정보들이 담긴 폴더 (계정 정보 등)
│   ├── __init__.py 
│   └── config.py
├── Pages                                # Locator 와 page object들이 담긴 폴더
│   ├── __init__.py
│   ├── page_Base.py               
│   └── page_splash.py
├── TestBase
│   ├── WebDriverSetup.py                # WebDriver 셋팅 모듈이 담긴 폴더
│   ├── __init__.py
├── Tests                                # 테스트 케이스가 담긴 폴더
│   ├── TEST_BASIC
│   │   ├── BASIC_login.py
│   │   ├── __init__.py
│   ├── __init__.py
実際の応用POM
手順1:共通のpage Baseモジュールの作成
すべてのページに共通するメソッドはpage_Base.pyに定義されています.各ページで特に使用される機能は、このページモジュールでメソッドとして作成され、使用されます.
page_Base.py
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class BasePage:
    """ 모든 페이지에서 공통으로 사용할 메서드를 정의한다 """
    def __init__(self, driver):
        self.driver = driver

    # 엘러먼트 클릭
    def click(self, by_locator):
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator)).click()

    # 엘러먼트에 키 입력
    def send_keys(self, by_locator, text):
        WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(by_locator)).send_keys(text)

手順2:画面固有のページモジュールを作成し、場所を定義する
モニタ検出情報に基づいてロケータを定義する
次に生成されるpage_splash.pyは、アプリケーションが初めて実行された後に露出したフラッシュページのロケータを識別することによって定義される.
page_splash.py

from .page_Base import BasePage
from appium.webdriver.common.mobileby import MobileBy


class SplashPage(BasePage):
	""" 앱 최초 실행 후 스플래시 페이지의 Locator """
    btn_positive = (MobileBy.ID, "com.mrt.ducati.dev:id/btn_positive")
    
手順3:テストケースの作成
テストケースにはLocatorが定義されていません.
from TestBase.WebDriverSetup import WebDriverSetup
from Pages.page_splash import SplashPage


class LoginTest:
    def setUp(self):
        """ 본 예제에서는 생략 """

    def test_case_1(self):
        """ 테스트 케이스 작성 """
        splash = SplashPage(self.driver)
        splash.click(SplashPage.btn_positive)
        
    def tearDown(self):
        """ 본 예제에서는 생략 """