今回は、プレビュー版ですが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 ==================================================
エビデンス画像(agree.png)
まとめ
playwirght for Pythonは、WebDriver等で悩まされた画面待ち制御から解放してくれそうです。クロスブラウザやマルチプラットフォーム対応はありがたいです。また、pythonなので、豊富なライブラリや柔軟な記載ができます。きっとRPAやE2Eテストに活躍してくれるでしょう。バージョン1.0が待ち遠しいですね。
以上、playwright for Pythonの紹介でした。
コメント