Pythonでのブラウザーオートメーション: Playwright、Seleniumおよびその他

PythonによるブラウザオートメーションとE2Eテストの比較。

目次

Pythonにおけるブラウザーオートメーションスタックの選択は、速度、安定性、メンテナンスに影響を与えます。
この概要では、
Playwright vs Selenium vs Puppeteer vs LambdaTest vs ZenRows vs Gauge
を比較します。Pythonに焦点を当てながら、Node.jsや他の言語がどの場面で役立つかについても記載しています。

Playwright trace viewer ここにPlaywright trace viewerのスクリーンショットがあります。

それぞれの使用場面

Playwright (Python)
PlaywrightはMicrosoftが提供するオープンソースのブラウザーオートメーションライブラリです。Chromium、Firefox、WebKitに対してChrome DevTools Protocol (CDP)またはWebSocketを通じて通信し、3つのエンジンにわたって1つのAPIを使用できます。自動待機機能が搭載されており、クリック、フィールド入力などのすべてのアクションの前に要素が表示され、安定し、操作可能になるまで待機します。これにより、テストの不安定さや手動のsleepまたはWebDriverWaitの必要性が減少します。設定は最小限で(pip install playwrightその後playwright install)、Python APIは同期および非同期の両方で第一級です。新しいE2Eテストスイート、スクリプティング、オートメーション(例えば、PythonでMCPサーバーを構築)に使用してください。Python、JavaScript、TypeScriptの例を含む完全なウォークスルーについては、Playwright: Web Scraping & Testingを参照してください。アプリの他の部分ではPythonでのユニットテストを使用し、Playwrightはブラウザーレイヤーに限定して使用してください。デメリット:Seleniumよりも新しいため、サードパーティの統合やレガシーマテリアルが少ない;非常に古いブラウザの公式サポートがない。

Selenium (Python)
Seleniumは、ブラウザーオートメーションの長年の標準です。Selenium Project(オープンソース、OpenJS Foundationが後援)はWebDriver APIを提供します:ブラウザ固有のドライバー(ChromeDriver、GeckoDriverなど)にコマンドを送信し、実際のブラウザーと通信します。Seleniumは多くの言語(Python、Java、C#、JavaScriptなど)をサポートし、レガシーブラウザーを含む幅広いブラウザーをサポートします。Selenium 4+にはSelenium Managerが含まれており、手動でドライバーバイナリをダウンロードまたはパスを設定する必要がなくなり、クライアントが正しいドライバーを自動で取得します。APIは自動待機を提供していません。通常、WebDriverWaitと期待条件を使用して不安定なテストを避ける必要があります。既存のWebDriverスイートを維持する必要がある、最も広いエコシステムと言語サポートが必要な、または古いブラウザーをサポートする必要がある場合はSeleniumを使用してください。Pythonのクリーンアーキテクチャのための設計パターンを使用する際には、ドライバーを小さなアダプターの背後でラップしてください。デメリット:Playwrightと比べて、慎重な待機戦略がないと一般的に遅く、より脆い;より多くのブーリュートコードが必要。

Puppeteer
PuppeteerはGoogleのNode.jsライブラリで、ヘッドレスChrome/Chromium(およびChromiumベースのEdge)を制御するために使用されます。Chrome DevTools Protocolを直接使用し、JavaScript/TypeScriptチームがChrome専用のオートメーション、PDF生成、スクレイピングを行う際のデファクトオプションです。公式のPythonバインディングは存在しない;APIはNode.js専用です。スタックがPythonであれば、Playwright(同じ「CDP制御」のアイデアで、Pythonが第一級)またはSeleniumを使用してください。Node.jsでChromium専用が必要な場合は、Puppeteerは文書化が充実した強力なオプションです。デメリット:Chrome/Chromiumのみ;FirefoxやWebKitはなし;Pythonはサポートされていない。

LambdaTest
LambdaTestは商用クラウドテストプラットフォームです。ローカルで同じSeleniumまたはPlaywright(またはCypressなど)のスクリプトを書く代わりに、LambdaTestのグリッドに接続してブラウザーを起動します。彼らはクラウドで実際のブラウザーと実際のデバイス(モバイルも含む)を提供し、自分のラボを管理しなくても、多くのOS/ブラウザー/バージョンの組み合わせを並列してテストできます。結果、動画、ログのダッシュボードが提供されます。クロスブラウザーカバレッジ、大規模な並列実行、モバイルエミュレーションが必要で、インフラストラクチャをホストしたくない場合はLambdaTestを使用してください。Gaugeもサポートしています:Gaugeの仕様をLambdaTestのSeleniumグリッドで実行できます。デメリット:有料(無料トライアルあり);テストはネットワークを介して実行されるため、遅延や可用性はそのサービスに依存します。

ZenRows
ZenRowsは商用ウェブスクレイピングおよびアンチ検出サービスです。Scraping Browserは、Playwright(または他のCDP互換ツール)を通じて制御できるクラウドブラウザーです:スクリプトをWebSocketエンドポイントに接続し、ZenRows側で住宅用プロキシ、IPローテーション、アンチボット回避(例:Cloudflare、DataDome)、オプションのCAPTCHA処理を備えたブラウザーが動作します。Playwrightのロジックを変更する必要はありません—ブラウザーのエンドポイントのみを変更します。スクレイピングが目的でブロックやレート制限に遭遇する場合はZenRowsを使用してください。自分のアプリで単純なE2Eテストを行う場合、ローカルのPlaywrightまたはSeleniumが通常十分です。デメリット:有料;スクレイピングに特化しており、LambdaTestのような汎用的なテストグリッドには向いていない。

Gauge
GaugeはThoughtworksから提供されるオープンソーステストフレームワークです。仕様とレポートに焦点を当てています:Markdown(または他の形式)で仕様を記述し、シナリオとステップを記述し、Python(またはJava、JavaScriptなど)でステップを実装し、Selenium(または他のドライバー)を使用してブラウザーを操作します。GaugeはSeleniumまたはPlaywrightを置き換えるものではなく、それらの上に構築され、構造、再利用性、読みやすいレポートを提供します。既存のSelenium(または類似)のセットアップの上にBDDスタイルの仕様、生きているドキュメント、明確なテストレポートが必要な場合はGaugeを使用してください。LambdaTestはGaugeテストをそのグリッドで実行することも可能です。デメリット:学習およびメンテナンスに余分なレイヤーが必要;ブラウザーオートメーションドライバー(例:Selenium)を選び、構成する必要があります。

実行場所

  • Playwright: ローカルまたはCI;Python 3.8+;Windows、macOS、Linux。WebSocketまたはCDPエンドポイントに接続してクラウド/リモートブラウザー(例:ZenRows、LambdaTest)も使用可能。
  • Selenium: ローカルまたはCI;WebDriverクライアントを持つ任意の言語;Selenium GridまたはLambdaTestなどのプロバイダーでスケーリング。
  • Puppeteer: Node.js専用;通常、マシンまたはDocker上のChrome/Chromium。
  • LambdaTest: クラウド専用;LambdaTestのグリッド上でSelenium/Playwright(またはSelenium上のGauge)を実行。
  • ZenRows: クラウドスクレイピングブラウザー;Python(例:Playwright)または他のCDP互換ツールからドライブ。
  • Gauge: マシンまたはCI上で実行;Selenium(または他のドライバー)を使用;LambdaTestのグリッドをターゲットにすることも可能。

Pythonエコシステムのトレンドの速報については、GitHub上での人気Pythonプロジェクトトップ17を参照してください。多くのオートメーションおよびテストツールがそこにある。

Pythonでそれらを使用する方法

Playwright (Python)

PlaywrightのPythonパッケージは同期および非同期APIを提供します。ブラウザは別途インストールされるため、ライブラリは小さく、必要なエンジン(Chromium、Firefox、WebKit)のみを選択できます。インストールおよびブラウザのインストール:

pip install playwright
playwright install

同期例(ナビゲート、クリック、テキスト読み取り-Playwrightは要素に対して自動待機):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    # リンクをクリックし、見出しを取得(組み込みの自動待機)
    page.get_by_role("link", name="More information...").click()
    heading = page.get_by_role("heading", name="Example Domain").text_content()
    print(heading)
    browser.close()

非同期は並列処理に推奨され、LLM構造化出力ワークフローまたはブラウザーが実行されている間にI/Oを行うスクリプトにも適しています:

from playwright.async_api import async_playwright
import asyncio

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True)
        page = await browser.new_page()
        await page.goto("https://example.com")
        print(await page.title())
        await browser.close()

asyncio.run(main())

Pythonチートシートと構文リファレンスを参照するには、ローカルにドキュメントを保持してください。

Selenium (Python)

PythonクライアントはW3C WebDriverプロトコルを使用します。Selenium 4+はSelenium Managerを使用して、正しいドライバー(ChromeDriver、GeckoDriverなど)を自動でダウンロードおよび管理するため、手動でドライバーをダウンロードする必要がありません:

pip install selenium

明示的な待機を使用した基本例(Seleniumは自動待機しない;WebDriverWaitまたは期待条件を使用):

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")
# ボディが存在するまで待機し、タイトルを取得
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
print(driver.title)
driver.quit()

クリックおよびテキスト読み取り:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")
link = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.LINK_TEXT, "More information. .."))
)
link.click()
heading = WebDriverWait(driver, 10).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, "h1"))
)
print(heading.text)
driver.quit()

Puppeteer (Node.js; 公式Pythonなし)

PuppeteerはJavaScript/Node.js専用-GoogleはPython APIを提供していません。PythonでPuppeteerのような体験が必要な場合は、Playwrightを使用してください(同じ「ChromeをCDPで制御」のアイデア、Pythonが第一級、自動待機)。非公式のポートpyppeteerもありますが、メンテナンスされていないため、新しいPython作業ではPlaywrightがより良い選択です。以下のNode.jsの例を示してAPIを比較します:

npm init -y && npm install puppeteer
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: true });
  const page = await browser.newPage();
  await page.goto("https://example.com");
  console.log(await page.title());
  await page.click("a[href='https://www.iana.org/domains/example']");
  const text = await page.$eval("h1", (el) => el.textContent);
  console.log(text);
  await browser.close();
})();

LambdaTest (Python: Selenium)

同じSelenium APIを使用します;唯一の変更点は、ローカルドライバーではなくLambdaTestのリモートWebDriverハブに接続することです。設定(ブラウザー、OS、ビルド名など)を設定し、LambdaTestダッシュボードからユーザー名とアクセスキーを渡してください:

from selenium import webdriver

options = webdriver.ChromeOptions()
options.browser_version = "latest"
options.platform_name = "Windows 11"

lt_caps = {
    "lt:options": {
        "username": "YOUR_LT_USERNAME",
        "accessKey": "YOUR_LT_ACCESS_KEY",
        "build": "Playwright-Selenium-Compare",
        "name": "Selenium on LambdaTest",
    }
}
options.set_capability("lt:options", lt_caps["lt:options"])

driver = webdriver.Remote(
    command_executor="https://YOUR_LT_USERNAME:YOUR_LT_ACCESS_KEY@hub.lambdatest.com/wd/hub",
    options=options,
)
driver.get("https://example.com")
print(driver.title)
driver.quit()

LambdaTest (Python: Playwright)

PlaywrightはCDP(Chrome DevTools Protocol)を通じてリモートブラウザーに接続できます。LambdaTestは各テスト実行ごとにCDPエンドポイントを提供します;ローカルブラウザーを起動する代わりにそれを接続します。LambdaTestのドキュメントで正確なCDP URL形式と認証を参照してください:

from playwright.sync_api import sync_playwright

# LambdaTestは各実行ごとにCDPエンドポイントを提供します;LTダッシュボードからそれを取得してください
CDP_URL = "wss://cdp.lambdatest.com/playwright?capabilities=..."  # LTダッシュボードから

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(CDP_URL)
    page = browser.new_page()
    page.goto("https://example.com")
    print(page.title())
    browser.close()

ZenRows + Playwright (Python)

ZenRowsのScraping BrowserはCDP互換なので、Playwrightのconnect_over_cdp()を使用してWebSocket URLに接続します。ブラウザーはZenRowsのクラウド内で実行され、プロキシとアンチボット処理が含まれており、スクリプトは接続方法以外は同じです。起動ステップのみが変化します:

from playwright.sync_api import sync_playwright

ZENROWS_WS = "wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY"

with sync_playwright() as p:
    browser = p.chromium.connect_over_cdp(ZENROWS_WS)
    page = browser.new_page()
    page.goto("https://example.com")
    html = page.content()
    print(html[:500])
    browser.close()

結果のHTMLを独自のパーサーに渡すか、例えばPythonでHTMLをMarkdownに変換を使用して下流処理を行うことができます。

Gauge + Selenium (Python)

GaugeはMarkdown(または他の形式)で仕様を保持し、Pythonでステップの実装を行います。各ステップはSelenium(または他のドライバー)を使用してブラウザーを開き、ナビゲートし、アサートします。例のレイアウト:

仕様 specs/example.spec:

# 例の仕様

## サイトを開きタイトルをチェック

* ブラウザーを開き「https://example.com」に移動
* ページタイトルが「Example Domain」であることを確認

ステップ step_impl/example.py:

from getgauge.python import step, before_scenario
from selenium import webdriver

driver = None

@before_scenario()
def init_driver():
    global driver
    driver = webdriver.Chrome()

@step("Open browser and go to <url>")
def open_url(url):
    driver.get(url)

@step("Page title should be <title>")
def check_title(title):
    assert driver.title == title, f"Expected {title}, got {driver.title}"

Gauge、Pythonランナー、Seleniumプラグインをインストールし、gauge run specs/で実行してください。LambdaTestで実行する場合は、before_scenarioフックでSeleniumドライバーをLambdaTestのリモートURLとキャパビリティに設定し、webdriver.Chrome()の代わりに使用してください。

まとめ

ツール Python ロール 最適な用途
Playwright はい ブラウザーオートメーション 新しいE2Eテスト、スクレイピング、マルチブラウザー、速度
Selenium はい ブラウザーオートメーション レガシーテスト、広いエコシステム、多くのブラウザー
Puppeteer いいえ ブラウザーオートメーション Node.js/Chrome専用プロジェクト
LambdaTest N/A クラウドグリッド 並列処理、クロスブラウザ、Gauge + Selenium
ZenRows Playwright経由 スクレイピングブラウザー アンチボット、プロキシ、CAPTCHA;Playwrightと併用
Gauge はい テストフレームワーク BDD仕様 + Selenium(または他のドライバー)

新しいPython作業では、Playwrightがデフォルトの選択肢です;クラウドスケールやスクレイピングの耐性が必要な場合はLambdaTestまたはZenRowsを追加してください。既存のスイートにはSeleniumを維持し、Gaugeを使用してSelenium上での仕様ファーストのテスト設計を実現してください。

有用なリンク

参考文献