Pythonでのブラウザーオートメーション: Playwright、Seleniumおよびその他
PythonによるブラウザオートメーションとE2Eテストの比較。
Pythonにおけるブラウザーオートメーションスタックの選択は、速度、安定性、メンテナンスに影響を与えます。
この概要では、
Playwright vs Selenium vs Puppeteer vs LambdaTest vs ZenRows vs Gauge
を比較します。Pythonに焦点を当てながら、Node.jsや他の言語がどの場面で役立つかについても記載しています。
ここに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上での仕様ファーストのテスト設計を実現してください。
有用なリンク
- Playwright: Web Scraping & Testing
- GitHub上での人気Pythonプロジェクトトップ17
- Pythonでのユニットテスト
- Pythonのクリーンアーキテクチャのための設計パターン
- Pythonチートシート
- LLMs構造化出力:Ollama、Qwen3とPythonまたはGo
- PythonでHTMLをMarkdownに変換:包括的なガイド
- PythonでMCPサーバーを構築:ウェブ検索&スクレイピング