Python応用

ブラウザを自動操作してユーザテストを行う|Playwrightとは?非エンジニアにも分かりやすく徹底解説

「テストって難しそう…」「E2Eテストって何?」そんな風に感じていませんか?実はPlaywrightを使えば、ブラウザの自動操作やユーザテストが驚くほど簡単に実現できます。この記事では、Playwrightの基本から実際のコード例まで、プログラミング初心者の方にも分かりやすく解説します!

Playwrightとは?E2Eテストの基礎から理解しよう

browser automation testing
browser automation testing / Photo by Jakub Zerdzicki via Pexels

E2Eテストってそもそも何?

E2Eテスト(End-to-End テスト)とは、ユーザーが実際にWebサービスを使う一連の流れを、自動的にシミュレートして動作確認するテストのことです。

たとえば、こんな操作を自動化できます。

  • Webサイトを開く
  • フォームに文字を入力する
  • ボタンをクリックする
  • 結果が正しく表示されているか確認する

手作業で毎回チェックするのは大変ですよね。E2Eテストを使えば、このような作業を自動でやってくれるのです。

PlaywrightはMicrosoftが開発した最新ツール

Playwrightは、Microsoftが開発したオープンソースのブラウザ自動操作ライブラリです。Python・JavaScript・TypeScript・Java・C#など複数の言語に対応しており、Chrome・Firefox・Safariの3大ブラウザをすべて操作できる点が大きな特徴です。

似たツールに「Selenium」がありますが、PlaywrightはSeleniumよりもセットアップが簡単で動作が速く、安定していると評判です。近年では多くの現場でPlaywrightが採用されています。

比較項目PlaywrightSelenium
開発元Microsoftオープンソースコミュニティ
対応ブラウザChrome / Firefox / Safari主要ブラウザ全般
セットアップ簡単(1コマンド)やや複雑
動作速度速いやや遅い
非同期処理得意工夫が必要

Playwrightのインストールと初期設定

Pythonへのインストール手順

PlaywrightはPythonのパッケージとして簡単にインストールできます。ターミナル(コマンドプロンプト)で以下のコマンドを実行しましょう。

# Playwrightライブラリのインストール
pip install playwright

# ブラウザのインストール(初回のみ必要)
playwright install

playwright installを実行すると、Chrome・Firefox・SafariベースのブラウザがPlaywright用に自動でダウンロードされます。ドライバを手動で設定する必要がないのが嬉しいですね!

実際にブラウザを動かしてみよう!基本の操作

サンプル①:Webサイトを開いてスクリーンショットを撮る

まずは一番シンプルな例から始めましょう。指定したURLを開いて、スクリーンショットを保存するコードです。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    # Chromiumブラウザを起動(headless=Falseで画面を表示)
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()

    # URLを開く
    page.goto("https://example.com")

    # スクリーンショットを保存
    page.screenshot(path="screenshot.png")
    print("スクリーンショットを保存しました!")

    browser.close()

headless=Falseにすると実際にブラウザ画面が表示されるので、動作確認がしやすくなります。本番テストではheadless=True(デフォルト)にして画面を非表示にするのが一般的です。

サンプル②:フォームへの入力とボタンクリック

次は、検索フォームにキーワードを入力してEnterキーを押す操作です。Google検索を例に使います。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()

    # Googleを開く
    page.goto("https://www.google.com")

    # 検索ボックスにキーワードを入力
    page.fill("input[name='q']", "Playwright Python")

    # Enterキーを押して検索
    page.keyboard.press("Enter")

    # 検索結果ページが表示されるまで待機
    page.wait_for_load_state("networkidle")

    # タイトルを取得して表示
    print(f"ページタイトル: {page.title()}")

    browser.close()

page.fill()でフォームに文字を入力し、page.keyboard.press()でキーボード操作ができます。wait_for_load_state()でページの読み込みを待つことで、処理の安定性が増します。

E2Eテストらしい使い方:自動でアサーション(検証)を行う

アサーションとは?

アサーションとは「期待通りの結果になっているか確認する」ことです。たとえば「ログイン後に『ようこそ』という文字が表示されているか」をチェックするような処理です。PlaywrightにはPytestと組み合わせた専用のアサーション機能が用意されています。

サンプル③:pytestと組み合わせたE2Eテスト

PlaywrightはPythonのテストフレームワークpytestと非常に相性が良いです。まずpytest-playwrightをインストールします。

pip install pytest-playwright

次に、実際のテストコードを書いてみましょう。

# test_example.py

from playwright.sync_api import Page, expect

def test_title_check(page: Page):
    """ページのタイトルが正しいか確認するテスト"""
    page.goto("https://example.com")

    # タイトルに「Example Domain」が含まれているか確認
    expect(page).to_have_title("Example Domain")
    print("タイトルの確認OK!")

def test_heading_visible(page: Page):
    """見出しテキストが表示されているか確認するテスト"""
    page.goto("https://example.com")

    # <h1>タグに「Example Domain」が表示されているか確認
    heading = page.locator("h1")
    expect(heading).to_be_visible()
    expect(heading).to_have_text("Example Domain")
    print("見出しの確認OK!")

テストの実行は以下のコマンドです。

# テストを実行(--headed オプションでブラウザ画面を表示)
pytest test_example.py --headed

# ヘッドレスモード(画面なし)で実行
pytest test_example.py

expect()を使うと、テストが失敗したとき自動的にエラーメッセージを出してくれます。どこで何が間違っているかが一目でわかるのは大変便利です。

Playwrightの便利機能をもっと活用しよう

自動待機(Auto-waiting)機能

Playwrightの大きな強みのひとつが自動待機(Auto-waiting)機能です。従来のツールでは「ボタンが表示されるまで〇秒待つ」という処理を自分で書く必要がありましたが、Playwrightは要素が操作可能になるまで自動で待ってくれます

たとえばpage.click()を呼ぶと、対象の要素が表示されて、クリック可能な状態になるまで自動的に待機してからクリックします。テストが不安定になりにくく、余計なtime.sleep()を書く必要がなくなります。

コードジェネレーター(Codegen)で自動コード生成!

「コードを書くのが大変…」という方にはCodegen機能が超おすすめです。実際にブラウザを操作すると、その操作をPlaywrightのコードとして自動生成してくれます!

# Codegenを起動(ブラウザが開いて操作を記録できる)
playwright codegen https://example.com

このコマンドを実行すると、ブラウザウィンドウとコードエディタが同時に立ち上がります。ブラウザ上でクリックや入力をするたびに、対応するPythonコードがリアルタイムで生成されます。非エンジニアの方でも直感的にテストコードが作れるので、ぜひ試してみてください!

トレース機能でテスト失敗の原因を調査

テストが失敗した原因を調べるときに便利なのがトレース(Trace)機能です。テスト中の操作をすべて記録し、後から動画やスクリーンショットで確認できます。

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch()
    context = browser.new_context()

    # トレースの記録を開始
    context.tracing.start(screenshots=True, snapshots=True)

    page = context.new_page()
    page.goto("https://example.com")
    page.click("a")  # リンクをクリック

    # トレースをファイルに保存
    context.tracing.stop(path="trace.zip")
    browser.close()

# トレースを閲覧するコマンド
# playwright show-trace trace.zip

保存したトレースはplaywright show-trace trace.zipコマンドで専用のビューアーが起動し、どのタイミングでどんな操作が行われたかをステップごとに確認できます。バグの原因特定に大活躍します!

まとめ:Playwrightで自動テストをはじめよう

この記事では、PlaywrightによるブラウザのE2E自動テストについて解説しました。最後に要点を整理しましょう。

機能説明使いどころ
基本操作クリック・入力・スクリーンショット動作確認・UIチェック
アサーション期待値との一致を確認E2Eテストの自動検証
自動待機要素の表示まで自動で待つ安定したテスト実行
Codegen操作からコードを自動生成テストコードの素早い作成
トレーステスト操作を記録・再生テスト失敗の原因調査
  • PlaywrightはMicrosoftが開発した最新のブラウザ自動操作ライブラリ
  • E2Eテストとは、ユーザーの一連の操作を自動でシミュレートするテスト手法
  • pip install playwrightplaywright installだけで簡単にセットアップ完了
  • Codegen機能でブラウザ操作を記録しテストコードを自動生成できる
  • ✅ pytestと組み合わせて本格的なE2Eテストが実現できる
  • トレース機能でテスト失敗の原因を視覚的に調査できる

「テストって難しそう」と思っていた方も、Playwrightならコードを書く量が少なく、Codegenで操作を記録するだけでテストが作れます。まずはスクリーンショットを撮るだけの簡単なコードから試してみてください。自動テストをマスターすれば、Webサービスの品質を保ちながら開発スピードも上がりますよ!

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る
徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です