🦐

【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に接続する方法。

手順

  1. まず Edge を デバッグポート付きで手動起動する:

    & "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9222 --user-data-dir=C:\EdgeDebug
    
  2. 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