🦐
【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