1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Python]Page Object Modelパターンを用いたPlaywright E2Eテスト記述方法 メモ

Posted at
  • Page Object Modelパターンを利用して、PlaywrightでE2Eテストを記述する方法についてメモしておく。

POM(Page Object Model)とは

  • ページをクラスオブジェクトとして扱うブラウザ自動化テストのデザインパターンの一つ。

  • 主な概念

    • テストクラス:対象ページのテストケース。
    • ページオブジェクト
      • 各Webページオブジェクトを作成することを目的としたクラス。
      • テスト用コードとWebページアクセス用コードを分離。
    • ロケータ:ページ要素を取得させる。
  • 利点

    • 可読性の高いテストケースを書くことができる。
    • 複数のテストケース間で共有できる再利用可能なコードを作ることができる※コード重複を防ぐことができる。

事前準備

  • ライブラリ類インストール

    pip install playwright
    playwright install
    pip install pytest-playwright
    
  • テストレポートツールallureインストール

    • 筆者はWindowsを利用しているため、パッケージ管理ツールscoopを使用する。

      • scoopインストール方法はこちらを参照。
      scoop install allure
      pip install allure-pytest
      

構成

root	- 	TestBase.py
		|_	test_Google.py
		|_	pages	- 	__init__.py
					|_	google_page.py

コード

※ページクラスとテストクラスのみでロケータクラスは用意していない。

  • pages/google_page.py

    class BasePage(object):
    
        def __init__(self, page):
            self.page = page
    
        def navigate(self, url):
            self.page.goto(url)
    
    
    class SearchPage(BasePage):
    
        def is_title_matches(self):
    
            return "Google" in self.page.title()
    
        def search(self, text):
            self.page.fill('input[name="q"]', text)
            self.page.press('input[name="btnK"]', "Enter")
    
    
    class SearchResultsPage(BasePage):
    
        def is_results_found(self):
            selector = '#result-stats'
            content = self.page.locator(
                selector).text_content()
            return content != None
    
    
  • TestBase.py:テストで共通する処理を集約する。

    from playwright.sync_api import Page
    import pytest
    
    
    # 共通処理を行うベーステストクラス
    class TestBase():
        @pytest.fixture(autouse=True)
        def setup(self, page: Page):
            self.page = page
    
        def tearDown(self):
            if (self.page != None):
                print("Cleanup of test environment")
                self.page.close()
    
    
  • test_Google.py:テストケースクラス。

    from pages.google_page import SearchPage, SearchResultsPage
    import allure
    from TestBase import TestBase
    
    
    class TestGoogle(TestBase):
        @allure.title('「Playwright Python」でGoogle検索し、検索結果を取得できているか確認する')
        def test_search_in_google(self):
            search_page = SearchPage(self.page)
            search_page.navigate("https://google.com")
            # タイトル検証
            assert search_page.is_title_matches() == True
    
            search_page.search("Playwright Python")
            search_result_page = SearchResultsPage(self.page)
            # 検索結果(検索件数を取得できているか)検証
            assert search_result_page.is_results_found() == True
    
    

動作確認

  • テスト実行

    pytest test_Google.py --alluredir=allure_results
    =========================================================== test session starts ===========================================================
    platform win32 -- Python 3.8.3, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
    rootdir: ...
    collected 1 item
    
    test_Google.py .                                                                                                                     [100%]
    
    ============================================================ 1 passed in 5.04s ============================================================
    
  • テストレポート確認

    allure serve allure_results
    

    allure_report.png

参考情報

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?