在 go-rod
中,WaitLoad
和 WaitStable
是两个常见的等待方法,但它们的核心目标和应用场景完全不同。以下是它们的详细区别:
1. WaitLoad
用途:
- 等待页面或资源加载完成。
- 通常用于监听页面级别的加载事件(如导航到新页面后的完整加载过程)。
行为:
- 默认等待触发浏览器的
window.onload
事件,表示当前页面的所有资源(HTML、CSS、JS、图片等)都已加载完成。 - 可以指定超时时间(否则会使用全局默认超时)。
典型场景:
- 导航到新页面后,等待页面完全加载。
- 等待某个外部资源(如图片、脚本)加载完成。
- 需要确保整个页面结构和依赖资源就绪后再执行后续操作。
示例代码:
// 等待页面完全加载
page.MustNavigate("https://example.com").MustWaitLoad()
// 或者等待某个元素的资源加载完成
element.MustWaitLoad()
2. WaitStable
用途:
- 等待元素的状态稳定(即其内容或属性不再频繁变化)。
- 主要针对动态内容(如 JavaScript 异步更新的 DOM 元素)。
行为:
- 监测目标元素的某些特征(如文本内容、属性值、DOM 结构),直到这些特征在一段时间内保持不变(默认检测间隔为 50ms,持续 3 秒无变化视为稳定)。
- 可以自定义判断稳定的逻辑(如只监控特定属性)。
典型场景:
- 点击按钮后等待某个异步加载的区域内容更新完成。
- 等待表格数据通过 AJAX 动态填充完毕。
- 确保某个元素的内容不再被 JavaScript 修改后再提取数据。
示例代码:
// 等待元素内容稳定
element.MustWaitStable()
// 自定义等待条件:等待元素的 "data-ready" 属性变为 "true"
element.WaitStable(func(e *rod.Element) bool {
return e.Attribute("data-ready") == "true"
})
关键区别对比
特性 | WaitLoad | WaitStable |
---|---|---|
目标对象 | 页面或资源加载 | 元素内容/属性稳定性 |
触发条件 | 页面资源加载完成(window.onload ) | 元素内容/属性在一段时间内无变化 |
适用场景 | 页面导航、静态资源加载 | 动态内容更新、AJAX 数据填充 |
默认超时时间 | 依赖全局配置(默认 30 秒) | 默认检测 3 秒内无变化 |
可定制性 | 较低(仅能控制超时) | 高(可通过函数自定义稳定条件) |
3. 实际应用举例
场景 1:导航后等待页面完全加载
page.MustNavigate("https://example.com")
page.MustWaitLoad() // 确保所有资源加载完成
场景 2:点击按钮后等待动态内容更新
// 点击按钮触发异步请求
page.MustElement("#loadDataButton").Click()
// 等待目标元素内容稳定
result := page.MustElement("#dynamicContent").MustWaitStable().Text()
fmt.Println(result)
场景 3:自定义等待条件
// 等待元素的 class 包含 "loaded"
element.WaitStable(func(e *rod.Element) bool {
return strings.Contains(e.MustAttribute("class"), "loaded")
})
4. 注意事项
WaitLoad
的局限性:- 如果页面中有无限加载的资源(如长轮询、WebSocket),
window.onload
可能永远不会触发,需手动控制超时。
- 如果页面中有无限加载的资源(如长轮询、WebSocket),
WaitStable
的局限性:- 如果元素内容始终处于周期性变化(如实时计数器),可能导致死锁,需设置合理的超时或自定义条件。
组合使用:
在复杂场景下可以结合两者:page.MustNavigate("https://example.com").MustWaitLoad() // 等待页面加载 element := page.MustElement("#content").MustWaitStable() // 等待动态内容稳定
总结
WaitLoad
更像“全局等待”,适合页面级别或资源级别的加载完成检查。WaitStable
更像“局部等待”,专注于单个元素的内容/属性是否稳定,特别适合应对动态渲染的前端框架(如 React/Vue)。
根据你的需求选择合适的方法,可以显著提升自动化脚本的稳定性和效率。