🦐
【Playwright】ブラウザの自動操作をしてみようとしたが...
はじめに
「ちょっとブラウザを自動操作してみたいな」と思い、軽い気持ちで Playwright を触り始めました。
…が、実際にやってみると意外といろんな壁にぶつかり、最終的に動いたのはだいぶ紆余曲折を経たあとでした。
本記事はその記録なります。
やりたいこと
VSCode上でsearch_demo.pyというファイルを実行し、ブラウザを立ち上げて検索、検索結果のスクショを撮ってくる。
スタート:とりあえず最小サンプルから動かす
- Python + VS Code で環境構築
- 仮想環境を作って
pip install playwright
- さらに
python -m playwright install
でブラウザをインストール
ここまではすんなり。
そして最小サンプル(Bingを検索してスクショを取るコード)を実行!
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.bing.com")
page.fill("input[name='q']", "Azure App Service")
page.press("input[name='q']", "Enter")
page.screenshot(path="example.png")
browser.close()
しかし…ブラウザが即落ちる
実行してみると Edge が一瞬開いたあと すぐ閉じる。
エラーメッセージはこんな感じ:
playwright._impl._errors.TargetClosedError: BrowserType.launch: Target page, context or browser has been closed
どうやら組織PCのセキュリティポリシーやEDRが「Playwrightが起動したEdge」を即終了させていた模様(おそらくウイルス対策?)
回避策を模索した
1. Edge チャネル指定
browser = p.chromium.launch(channel="msedge", headless=False)
→ ダメ。やっぱり即終了。
2. GPU無効化・ヘッドレス実行
browser = p.chromium.launch(channel="msedge", headless=True, args=["--disable-gpu"])
→ やっぱり落ちる。
3. FirefoxをインストールしてPlaywrightから起動
python -m playwright install firefox
→ Firefox版はブラウザ起動まで行けたが、検索をするまでは到達できず。私の環境では安定しませんでした。
最終手段:CDP接続
ここで出てきたのが CDP (Chrome DevTools Protocol) で既存のEdgeに接続する方法。
手順
-
まず Edge を デバッグポート付きで手動起動する:
& "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 --user-data-dir=C:\EdgeDebug
-
Playwright からは「起動」ではなく「接続」する:
browser = p.chromium.connect_over_cdp("http://127.0.0.1:9222")
これでやっと「ブラウザが落ちずに」操作できるようになった!
が、さらにハマる
- Bingの検索ボックスが見つからず
TimeoutError
- 実は Cookie同意モーダルが邪魔していた
-
input[name='q']
が効かない場合もある → 複数セレクタで対応 - もういっそ 検索クエリ付きURLに直アクセスしたほうが安定
from urllib.parse import quote_plus
keyword = "Azure App Service"
url = f"https://www.bing.com/search?q={quote_plus(keyword)}&cc=JP"
page.goto(url, wait_until="domcontentloaded")
やっと結果が取れた!
最終的に動いたコード(CDP接続+検索結果取得)はこんな感じ:
# search_demo.py — Edgeに接続(CDP)して検索URLに直アクセス
from urllib.parse import quote_plus
from playwright.sync_api import sync_playwright, TimeoutError as PWTimeout
KEYWORD = "Azure App Service"
SEARCH_URL = f"https://www.bing.com/search?q={quote_plus(KEYWORD)}&cc=JP"
with sync_playwright() as p:
# 起動ではなく接続する
browser = p.chromium.connect_over_cdp("http://127.0.0.1:9222")
# 既存のコンテキストがあれば使う、なければ作成
context = browser.contexts[0] if browser.contexts else browser.new_context(viewport={"width": 1280, "height": 800})
page = context.new_page()
# 検索結果ページへ直接
page.goto(SEARCH_URL, wait_until="domcontentloaded")
# Cookie同意が出たら処理 → もう一度URL直叩き
try:
page.locator("#bnp_btn_accept, button:has-text('Accept'), button:has-text('同意')").first.click(timeout=1500)
page.goto(SEARCH_URL, wait_until="domcontentloaded")
except PWTimeout:
pass
# 結果取得(複数セレクタで対応)
result_sel = "li.b_algo h2 a, main h2 a, [data-testid='b_algo'] h2 a"
page.wait_for_selector(result_sel, timeout=15000)
titles = [t.strip() for t in page.locator(result_sel).all_text_contents() if t.strip()][:5]
for i, t in enumerate(titles, 1):
print(f"{i}. {t}")
# デバッグ用出力
page.screenshot(path="search_result.png", full_page=True)
with open("debug.html", "w", encoding="utf-8") as f:
f.write(page.content())
# Edge自体は閉じたくないなら次の2行はコメントアウト
context.close()
browser.close()
PowerShell で以下を順に実行します:
Start-Process "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" `
-ArgumentList "--remote-debugging-port=9222 --user-data-dir=C:\EdgeDebug"
python search_demo.py
実行結果:
1. Top Azure App Service Courses Online - Updated
2. Azure App Service の概要 - Azure App Service | Microsoft Learn
3. Azure App Serviceってどんなの? #AppService - Qiita
4. Azure App Serviceの動画
5. Azure App Service
手動で立ち上げたブラウザも、実行と同時に自動で検索をかけてくれています
スクショも撮ってきてくれました
やったー!🎉
学び
- Playwrightは、社用PC環境ではブラウザ起動がブロックされることがある
- そんなときは CDP接続 が強力な回避策
まとめ
- Playwright自体は無料でオープンソース
- 環境によっては起動方法に工夫が必要
- 紆余曲折あったけど、検索結果を取ってスクショするところまで体験できた
- セキュリティの都合上、ブラウザを手動で立ち上げているため「半自動」ではあるがブラウザ自動操作を体験出来て良かった
これで「VSCode + Python + Playwrightでブラウザ自動操作」体験はひとまず達成です
Happy~
Discussion