在沒有 SSH 存取權限的託管環境中,退而求其次的是瀏覽器自動化:Playwright 登入 wp-admin 並直接操作外掛程式更新畫面。這種做法數月來運作良好,直到有一天腳本在還沒進入更新畫面之前就停住了。
註:Playwright 是一種瀏覽器自動化工具。它會模擬人類的點擊動作,但以程式碼方式執行。
「確認您的管理員電子郵件」畫面是什麼
自 WordPress 5.3 起,wp-admin 會定期(大約每六個月)顯示提示,要求網站擁有者確認其註冊的管理員電子郵件地址仍然有效。這是 WordPress 核心功能,而非外掛程式。
這還是您的電子郵件地址嗎?
[ 是,這是我的電子郵件地址 ] [ 我稍後確認 ]
Enter fullscreen mode Exit fullscreen mode
人類在 wp-admin 中操作時,只要點擊「我稍後確認」即可繼續。但針對固定流程撰寫的 Playwright 腳本——登入後直接前往外掛程式更新畫面——並沒有為這個額外畫面準備分支。當此畫面出現時,腳本就會在此停住。
實際發生了什麼
登入本身是成功的。問題在於登入後所抵達的頁面:URL 不是 wp-admin/index.php,而是 wp-admin/options-general.php?adminhash=...。原本應該導航至更新畫面的 goto() 呼叫,會被此確認畫面重新導向,或是它所等待的選取器永遠不會出現,最終導致腳本逾時。
# 登入後立即檢查是否出現確認畫面
if "adminhash=" in page.url:
page.click("text=我'稍後確認")
Enter fullscreen mode Exit fullscreen mode
檢查登入後的 URL 是否包含 adminhash= 就足以偵測此畫面是否出現。
為什麼六個月週期讓問題難以發現
此畫面並非每次登入都會出現。WordPress 核心只會在距離上次確認已過足夠時間後才顯示。這表示運作數月穩定的自動化腳本可能突然停止,而因為發生頻率極低,要追溯問題根源到這個特定畫面需要更長的時間。
解決方案
無論是否真的出現此畫面,都將「我稍後確認」按鈕的偵測與自動點擊,作為登入後的固定步驟。如此一來,無論確認畫面是否出現,都能走相同的程式碼路徑。
def ensure_past_email_check(page):
if "adminhash=" in page.url:
page.click("text=我'稍後確認")
page.wait_for_load_state("networkidle")
Enter fullscreen mode Exit fullscreen mode
每次登入後立即呼叫此函式,就能讓這每半年才出現一次的意外不再是意外。
摘要
| 面向 | 說明 |
|---|---|
| 觸發時機 | WordPress 核心判斷距離上次確認已過足夠時間 |
| 症狀 | 登入後導航停留在確認畫面,後續步驟逾時 |
| 偵測方式 | 檢查登入後的 URL 是否包含 adminhash=
|
| 解決方案 | 將自動點擊設為每次登入後的固定步驟 |
如同 Playwright 嚴格模式違規與 wp-admin 重複選取器衝突 所述,這同樣歸結於同一個根本問題:wp-admin 不總是直線前進,瀏覽器自動化必須考慮到預期之外的畫面。只要無法使用 SSH,而瀏覽器驅動的維護是唯一的替代方案,偵測並略過這些非預期的畫面就不再是可選的。同樣對 wp-admin 的不信任也體現在 驗證從頁面擷取的版本號是否可信。
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.