在没有 SSH 访问权限的托管环境中,备选方案是浏览器自动化:Playwright 登录 wp-admin 并直接操作插件更新页面。这种方式几个月来运行良好,直到有一天脚本在到达更新屏幕之前就停止了。
注:Playwright 是一种浏览器自动化工具。它以代码形式重现人工点击。
“确认您的管理员邮箱”屏幕是什么
自 WordPress 5.3 起,wp-admin 会定期(大约每六个月)提示站点所有者确认他们仍能访问注册的管理员邮箱地址。这是 WordPress 核心功能,而非插件。
Is this still your address?
[ Yes, this is my address ] [ I'll wait ]
Enter fullscreen mode Exit fullscreen mode
人工操作 wp-admin 时只需点击 “I'll wait” 即可继续。但专为固定流程编写的 Playwright 脚本(登录后直接跳转到插件更新屏幕)没有处理此额外屏幕的分支。当它出现时,脚本会卡在那里。
实际发生了什么
登录本身成功了。问题是登录后所到达的页面:URL 不是 wp-admin/index.php,而是 wp-admin/options-general.php?adminhash=...。原本应将脚本带到更新屏幕的 goto() 调用要么被此确认页面重定向,要么它等待的元素从未出现,导致脚本超时。
# Check for the confirmation screen right after login
if "adminhash=" in page.url:
page.click("text=I'll wait")
Enter fullscreen mode Exit fullscreen mode
检查登录后的 URL 是否包含 adminhash= 足以检测到此屏幕的出现。
为什么六个月周期让问题难以发现
此屏幕并非每次都出现。WordPress 核心仅在上次确认经过足够时间后才显示它。这意味着已连续运行数月的自动化脚本可能会突然停止——而由于这种情况极少发生,追踪根源到此特定屏幕需要更长时间。
解决方案
检测 “I'll wait” 按钮并在登录后立即自动点击,作为固定步骤,无论该屏幕是否实际出现。这样相同的代码路径在确认屏幕出现或不出现时都能正常工作。
def ensure_past_email_check(page):
if "adminhash=" in page.url:
page.click("text=I'll wait")
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.