E2Eテスト自動化本命!playwright for Python

開発
Markus WinklerによるPixabayからの画像

※この記事にはプロモーションが含まれています。

今回は、プレビュー版ですがplaywright for Pythonを用いたWeb操作の自動化について紹介します。後発もあって、WebDriverよりも使いやすく、サポートプラットフォームを広げながらもPuppeteerと同じ操作性を有しています。

スポンサーリンク
スポンサーリンク

playwrightの特徴

playwrightはマイクロソフト社が提供するWeb自動テスト用のライブラリです。同じジャンルに、SeleniumやPuppeteerがあります。playwright for Pythonは名前の通り、Pythonで実装することができます。特徴は以下の通りです。

  • Chromium・FireFox・Webkit(safari)のクロスブラウザをサポート
  • Linux・MacOS・Windowsのマルチプラットフォームで動作
  • モバイル向けブラウザテスト可能
  • ヘッドレス・ヘッドフルモードに対応
  • UIの準備が出来るまで自動的に待機し、読み込み待ち制御等も容易
  • 変更に柔軟なノードセレクタ
  • CIにテストを組み込み可能

環境作成

playwright for Pythonを実行するには、まずPython 3.7以降が必要です。その環境に下記をインストールします。

pip install playwright
python -m playwright install
pip install pytest-playwright
pip install asyncio

pipなので、Pythonの仮想環境を用意するのがよいと思います。また、必要なブラウザコンポーネントを上記2行目で全てインストールしてくれるので、別途何かを用意することもありません。

サンプル実行

自動操作テストサイトテスト用サイト – 日本Seleniumユーザーコミュニティを利用した、サンプルプログラムを用意してみました。使い方詳細は、APIの説明を参考にしてください。

画面操作

まずは、画面を操作するサンプルです。ヘッドフルモードで、各ブラウザに対し、宿泊日・朝食無・お得な観光プラン・お名前を入力しています。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    for browser_type in [p.chromium, p.firefox, p.webkit]:
        browser = browser_type.launch(headless=False)
        page = browser.newPage()
        page.goto('http://example.selenium.jp/reserveApp_Renewal/')
        page.click('input[id=breakfast_off]')
        page.click('input[id=plan_a]')
        page.fill('input[id=guestname]', 'foo bar')
        page.fill('input[id=datePick]', '')
        page.type('input[id=datePick]', '2021/02/03')
        browser.close()
python run_play.py

pytest実行

pytestでは、ヘッドレスで上記の画面操作を次の画面に進めて、合計金額を確認しています。また、エビデンスとして画像を残しています。

なお、テストサイト仕様として、宿泊日は実行日から3ヶ月以内を指定する必要があります。

Pytest plugin for Playwrightに詳細は記載されています。

from playwright.sync_api import Page
import pytest

def test_xxx(page):
    page.goto('http://example.selenium.jp/reserveApp_Renewal/')
    page.click('input[id=breakfast_off]')
    page.click('input[id=plan_a]')
    page.fill('input[id=guestname]', 'foo bar')
    page.fill('input[id=datePick]', '')
    page.type('input[id=datePick]', '2021/02/03')
    page.click('button[id=agree_and_goto_next]')

    page.waitForSelector('text="確定"')
    page.screenshot(path='agree.png')
    total_pay = page.querySelector('h3[id="total"]').innerText().replace('合計 ', '').split('円')[0]
    
    assert(total_pay == '8000')
python -m pytest test_play.py

================================================= test session starts =================================================
platform win32 -- Python 3.9.1, pytest-6.2.1, py-1.10.0, pluggy-0.13.1
rootdir: C:\Users\userx\Desktop\新しいフォルダー
plugins: base-url-1.4.2, playwright-0.0.10
collected 1 item

test_play.py .                                                                                                   [100%]

================================================== 1 passed in 5.58s ==================================================

まとめ

playwirght for Pythonは、WebDriver等で悩まされた画面待ち制御から解放してくれそうです。クロスブラウザやマルチプラットフォーム対応はありがたいです。また、pythonなので、豊富なライブラリや柔軟な記載ができます。きっとRPAやE2Eテストに活躍してくれるでしょう。バージョン1.0が待ち遠しいですね。

以上、playwright for Pythonの紹介でした。

コメント