Browser-based updates getting stuck on the "Confirm your admin email" screen — why Playwright stalls in wp-admin のカバー画像

Susumu Takahashi

SSHアクセスがないホスティング環境では、ブラウザ自動化が代替手段となります。Playwrightはwp-adminにログインし、プラグイン更新画面を直接操作します。数ヶ月間は正常に動作していましたが、ある日スクリプトが更新画面に到達する前に停止してしまいました。

注:Playwrightはブラウザ自動化ツールです。人間が行うクリックをコードで再現します。

「管理者のメールアドレスを確認」画面とは

WordPress 5.3以降、wp-adminは定期的に(おおよそ6ヶ月ごと)プロンプトを表示し、サイト所有者に登録済みの管理者メールアドレスへのアクセス権がまだ有効であるかを確認します。これはプラグインではなく、WordPressコアの機能です。

このメールアドレスはまだ使用中ですか?
[ はい、このアドレスです ]  [ 後で確認する ]

フルスクリーンモードに入る フルスクリーンモードを終了

人間がwp-adminでクリックすれば、「後で確認する」を押して進むだけです。しかし、固定のシーケンスで書かれたPlaywrightスクリプト(ログイン後、プラグイン更新画面へ直行)はこの画面への分岐を持っていません。画面が表示されると、スクリプトはその場で停止してしまいます。

実際に起こっていること

ログイン自体は成功します。問題は到達したページです:wp-admin/index.phpではなく、URLがwp-admin/options-general.php?adminhash=...になっています。次に更新画面へ移動するはずのgoto()呼び出しは、この確認画面によってリダイレクトされるか、待機していたセレクターが表示されず、スクリプトがタイムアウトします。

# ログイン直後に確認画面をチェック
if "adminhash=" in page.url:
    page.click("text=後で確認する")

フルスクリーンモードに入る フルスクリーンモードを終了

ログイン後のURLにadminhash=が含まれるかを確認するだけで、この画面の出現を検知できます。

6ヶ月周期が原因を掴みにくくする理由

画面は毎回表示されるわけではありません。WordPressコアは前回の確認から十分な時間が経過したときのみ表示を判断します。そのため、数ヶ月間正常に動作していた自動化が突然停止し、原因を特定するのに時間がかかります。

修正方法

「後で確認する」ボタンを検知し、画面が実際に表示されたかどうかに関わらず、ログイン直後に自動でクリックする恒常的なステップを追加します。これにより、同じコードパスが確認画面の有無に関わらず動作します。

def ensure_past_email_check(page):
    if "adminhash=" in page.url:
        page.click("text=後で確認する")
        page.wait_for_load_state("networkidle")

フルスクリーンモードに入る フルスクリーンモードを終了

ログイン直後にこの関数を毎回呼び出すことで、半年に一度の予期せぬ停止を防げます。

まとめ

項目 詳細
発生条件 WordPressコアが前回の確認から十分な時間が経過したと判断したとき
症状 ログイン後のナビゲーションが確認画面に留まり、後続のステップがタイムアウトする
検知方法 ログイン後のURLにadminhash=が含まれるかを確認
修正 ログイン直後の恒常的なステップとして自動クリックを実装

Playwrightのstrictモード違反がwp-adminの繰り返されるセレクターと衝突する問題と同様に、根本原因は同じです:wp-adminは常に直線的に進むわけではなく、ブラウザ自動化は予期しない画面に対応する必要があります。SSHが利用できず、ブラウザ駆動のメンテナンスが代替手段である限り、こうした予期しない画面を検知して回避することは必須です。wp-adminへの同様の不信は、ページからスクレイピングしたバージョン番号を信頼する前に検証するケースでも見られます。