低スペックなサーバー上にSelenium&Pythonによるスクレイピングのコードを移植したらTimeoutした。
他の道を求めて、AIの神聖なる御神託を仰ぎ奉ったところ、
Playwright
の啓示を賜った。
やだ素敵!
Playwrightは、Microsoftによって開発されたオープンソースのWebブラウザの自動化ライブラリ。
もともとはNode.js用に開発されたが、Python版も提供されており、ヘッドレスブラウザの操作やテスト自動化に利用できる。
Googleトレンドをみる限り、ジワジワとPlaywrightはSeleniumの人気に迫りつつあるようだ。
スクレイピング目的ではなく「自動テスト」の文脈での人気度を統計的に絞り込むと、既にPlaywrightがCypressを追い越し、Seleniumより人気が高いこと確認できる。
全く知らなかった。使って無ければ恥ずかしいレベル。
ということで、今回のブログは ヤマなし、オチなしでサクッと紹介しておく。
Playwrightの利点としては次のようなものがある。
- 軽量で高速: ヘッドレスモードでの動作が効率的
- 簡潔なAPI: コードがシンプルで読みやすい
- マルチブラウザ対応: Chromium、Firefox、WebKitをサポート
Web UI自動化テストフレームワークの特徴をまとめると、
10年以上の歴史を持つSelenium、最近人気のCypress、そして紹介するPlaywrightがある。
特徴 | Playwright | Selenium | Cypress |
---|---|---|---|
サポートされている言語 | JavaScript, Java, C#, Python | JavaScript, Java, C#, Python, Ruby | JavaScript/TypeScript |
サポートされているブラウザ | Chrome, Edge, Firefox, Safari | Chrome, Edge, Firefox, Safari, IE | Chrome, Edge, Firefox, Safari |
テストフレームワーク | 言語ごとのフレームワーク | 言語ごとのフレームワーク | 言語ごとのフレームワーク |
使いやすさ | 簡単に使える | 設定が複雑で学習曲線がある | 簡単に使える |
コードの複雑さ | シンプル | やや複雑 | シンプル |
DOM操作 | シンプル | やや複雑 | シンプル |
コミュニティの成熟度 | 徐々に成長中 | 高い成熟度 | かなり成熟している |
ヘッドレスモードサポート | はい | はい | はい |
並列処理サポート | サポートあり | サポートあり | CI/CDツールによる |
iframeサポート | サポートあり | サポートあり | プラグインを通じてサポート |
ドライバ | 必要なし | ブラウザ固有のドライバが必要 | 必要なし |
複数タブ操作 | サポートあり | サポートなし | サポートあり |
ドラッグ&ドロップ | サポートあり | サポートあり | サポートあり |
組み込みレポーティング | はい | いいえ | はい |
クロスオリジンサポート | サポートあり | サポートあり | サポートあり |
組み込みデバッグ | はい | いいえ | はい |
自動待機 | はい | いいえ | はい |
組み込みスクリーンショット/ビデオ | はい | ビデオ録画なし | はい |
Playwrightは非同期操作が基本だが、同期的に動作するAPIも提供されている。
これにより、非同期処理のオーバーヘッドも回避できる。
必要なパッケージのインストール方法
VENVを利用して仮想環境を使うとすると次のようになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 仮想環境を作成 python -m venv myenv # 仮想環境を有効化(csh/tcshの場合は「source myenv/bin/activate.csh」) source myenv/bin/activate # pipを最新バージョンにアップグレード pip install --upgrade pip # Playwrightをインストール pip install playwright # Playwrightのブラウザバイナリをインストール playwright install chromium |
ブラウザは
Chromium、Firefox、WebKit
から選択可能。
ブラウザ名 | 説明 |
---|---|
Chromium | 必要なリソースが比較的少なく、軽量な操作が可能 サーバー環境での動作が安定しており、軽量化のためのオプションも豊富 |
Firefox | Chromiumに比べるとヘッドレスモードでのパフォーマンスが若干劣る 一部の操作でリソース消費が多くなる場合がある |
WebKit | 他のブラウザに比べてリソース消費が多い Linux環境では、WebKitの依存パッケージが多く重くなる |
Playwrightの強みは複数ブラウザを共通のAPIで操作できるため、E2Eテストを効率的に行ったり、スクレイピングを安定して実行したりする際に役立つ事。
だけど、低スペックなサーバーで動かすために、これもAIから御神託を賜りChromiumを選択した。
実装サンプルは次のようになる
これもAIから賜ったコードになる。
print文が多いけど、それを除くと非常にシンプルだと分かる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import os import tempfile import shutil from playwright.sync_api import sync_playwright def test_playwright(): # 一時的なユーザーデータディレクトリを作成 temp_dir = tempfile.mkdtemp(prefix="playwright_user_data_") print(f"[INFO] Using temporary user data directory: {temp_dir}") # ディレクトリの存在を確認してログを出力 if os.path.exists(temp_dir): print(f"[DEBUG] Directory {temp_dir} exists.") else: print(f"[DEBUG] Directory {temp_dir} does not exist.") try: # Playwrightを初期化 with sync_playwright() as p: # ユーザーデータディレクトリを指定してブラウザを起動 browser_context = p.chromium.launch_persistent_context( user_data_dir=temp_dir, headless=True # ヘッドレスモードで実行 ) page = browser_context.pages[0] if browser_context.pages else browser_context.new_page() # Googleのホームページを開く page.goto("https://www.google.com") # ページタイトルを取得して表示 print("[INFO] Page title is:", page.title()) # 動作確認が成功した場合のメッセージ print("[INFO] Playwright is working correctly!") # ブラウザコンテキストを閉じる browser_context.close() print("[INFO] Playwright browser session closed.") except Exception as e: # エラーが発生した場合のメッセージ print("[ERROR] An error occurred:", str(e)) finally: # 一時ディレクトリを削除 if os.path.exists(temp_dir): shutil.rmtree(temp_dir) print(f"[INFO] Temporary user data directory {temp_dir} deleted.") else: print(f"[WARNING] Temporary user data directory {temp_dir} was not found.") if __name__ == "__main__": test_playwright() |
おわりに
軽量と言うだけあり非力なサーバーでも動作した。
今のところ全く困ってないので、今後はSeleniumよりPlaywrightを使って実装を紹介していこうと思う。
というか、ソフトウェアエンジニアは もう不要じゃない?
10年後、僕は何の仕事をしてるんだろう……。