概要
- Playwrightはダウンロードの処理中に
TargetClosedErrorを報告した。 download.save_as()が失敗する前に、Microsoft Edgeはすでに終了していた。- 新しいプロファイルでは、最初のブラウザプロセスで5回のダウンロードが完了したが、そのプロファイルを後続のEdgeプロセスで再利用すると障害が発生した。
- したがって、最初のアプリケーション例外は症状として扱った。調査対象をPlaywrightからCDPトランスポート、さらにEdgeプロセス自体へと下位層に移した。
最初の兆候
調査は、次の2つのログエントリから始まった。
browser_disconnected reason=unexpected
Download.save_as: Target page, context or browser has been closed
これらのメッセージだけを見ると、アプリケーションのライフサイクルに問題があるように思える。ページを閉じるのが早すぎたか、save_as()を呼び出すタイミングが間違っていた可能性がある。
プロセスレベルのログによって、その解釈は変わった。Playwrightが保存処理を完了しようとする前に、Edgeが終了していた。処理の順序は次のとおりだった。
Edge process terminates
CDP connection closes
Browser, Context, and Page become unavailable
download.save_as() reports TargetClosedError
Playwrightの例外は正確だったが、ブラウザが消失した理由までは説明していなかった。
関連するコンポーネント
| コンポーネント | テストでの役割 |
|---|---|
| Playwright | 最初の再現テストでブラウザを起動し、制御する |
| Microsoft Edge | ページ処理とダウンロード処理を実行する |
| CDP | ブラウザ自動化コマンドを伝送する |
| ユーザーデータディレクトリ | Edgeプロセス間でプロファイルの状態を永続化する |
| パイプまたはポート | CDPのトランスポート経路を提供する |
| Crashpad | プロセスのクラッシュ情報を記録する |
Playwrightのlaunch_persistent_context()は、指定されたユーザーデータディレクトリを使用してブラウザを起動する。これは、自動化されたワークフローで実行間にCookieやローカルストレージを保持する必要がある場合に便利である。
一方、この利便性によって複数の層が1回のAPI呼び出しにまとめられる。PlaywrightがEdgeを起動し、CDP経由で通信し、Edgeがネットワークリクエストを実行し、オペレーティングシステムがダウンロードされたファイルを書き込む。API境界で発生する汎用的なエラーは、これらのどの層に起因する可能性もある。
最初の再現パターン
当初の結果は、既存のプロファイルに問題があることを示唆しているように見えた。
| 条件 | 観測結果 |
|---|---|
| 使用済みのプロファイル | ダウンロードワークフロー中に異常終了を繰り返した |
| 新しいプロファイル、1つのEdgeプロセスで5回ダウンロード | 5 / 5回成功 |
しかし、Edgeを再起動すると、新しいプロファイルでの結果は再現しなかった。
New profile, first Edge process -> five downloads succeed
Same profile, later Edge process -> crash on the second or third launch
個別に作成した複数のプロファイルでも、同じパターンが見られた。重要な条件は、単にプロファイルが古いか新しいかではなく、同じプロファイルの状態が別のEdgeプロセスによって再利用されたかどうかだった。
作業仮説
この段階では、次の説明が考えられた。
- 元のプロファイルに限定された破損。
- ヘッドレスモード固有の挙動。
download.save_as()によって引き起こされるエラー。- Playwright固有のブラウザ引数またはCDPコマンドの順序。
- Edge内部のネイティブ障害。
以降のテストでは、一度に1つの条件だけを変更した。可能な限り同じ環境、入力ファイル、終了手順を使用して、成功と失敗を記録した。
テスト環境
この一連の結果は、2026年9月3日に観測された。
| 項目 | バージョン |
|---|---|
| オペレーティングシステム | Windows 11 Home x64、ビルド26200 |
| Microsoft Edge Stable | 152.0.4191.53、x64 |
| Playwright for Python | 1.62.0 |
| Playwright同梱のChromium | 151.0.7922.34 |
| Python / Node.js | 3.12.14 / 24.18.1 |
これらの観測結果は、すべてのEdge 152環境が影響を受けることを示すものではない。この時点では、原因となったソースコンポーネントも、リグレッションが発生したバージョン範囲も特定されていなかった。
次のテスト
次の記録では、最も明白な代替仮説を検証する。新しく作成したプロファイル、ヘッドありとヘッドレスでの動作、そしてsave_as()を使用する場合と使用しない場合のダウンロード処理である。