Skip to content
cccskills
FreePublished on GitHub

wait-strategy

隐式等待为主、显式等待仅慢路径。触发:等待策略、timeout、wait、隐式等待、显式等待。

The English summary is being prepared. Showing the original description.

Works withPlaywright
See how to install

Files included (1)

  • SKILL.md3.8 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

等待策略 — 隐式等待为主,显式等待为辅

核心原则

隐式等待覆盖 99% 场景,显式等待仅用于已知的慢路径。


一、隐式等待(默认,全局生效)

什么是隐式等待

通过 page.set_default_timeout(ms) 在 page 创建后立即设置。此后该 page 上所有 Playwright 操作(click、fill、locator.wait_for、is_visible 等)自动等待元素就绪,超时前持续重试,无需逐个调用指定 timeout。

配置位置

隐式等待的超时时长统一声明在配置文件中(如 DEFAULT_TIMEOUT 常量),在 fixture 层注入到每个 page 实例:

# 配置文件
DEFAULT_TIMEOUT = 15000   # 15 秒,兼顾网络波动

# fixture 层(function 级 / class 级均需设置)
page = context.new_page()
page.set_default_timeout(DEFAULT_TIMEOUT)

推荐时长

环境推荐值说明
内网 / CI10000 (10s)网络稳定,无需长等
外网 / 生产15000 (15s)兼顾偶发网络波动
弱网测试20000~30000专项弱网场景

二、显式等待(仅用于特殊场景)

什么时候用

场景原因做法
大文件上传 / 导入服务器处理耗时远超常规页面操作self.is_visible(LOCATOR, timeout=60000)
长轮询 / 异步任务回调后端处理完才刷新前端状态page.locator(...).wait_for(state="visible", timeout=30000)
第三方服务跳转OAuth / 支付等外部页面响应不可控page.wait_for_url("**/callback**", timeout=30000)
首次冷启动服务刚部署、首次请求慢对首个导航操作单独加大 timeout

使用方式

在调用处传入显式 timeout,覆盖隐式默认值:

# BasePage 封装方法支持 timeout 参数
def is_visible(self, locator, timeout=DEFAULT_TIMEOUT) -> bool:
    ...

# 用例中:仅对已知慢操作显式指定
def test_upload_large_file(self):
    self.page_obj.click_upload()
    assert self.page_obj.is_visible(
        self.page_obj.UPLOAD_SUCCESS_INDICATOR,
        timeout=60000   # 显式等待 60 秒,仅此一处
    ), "大文件上传超时"

禁止事项

  • 禁止 time.sleep() 硬等待 — Playwright 的自动等待机制已覆盖,硬等待浪费时间且不可靠
  • 禁止给每个操作都加显式 timeout — 这等于放弃了隐式等待的统一管理优势
  • 禁止在 PageObject 方法内部硬编码超长 timeout — 超时值应由调用方(用例层)按场景决定

三、wait_for_load_state 与隐式等待的关系

page.wait_for_load_state("networkidle") 是导航级等待,与元素级隐式等待互补,不冲突:

等待类型作用层级触发时机受 set_default_timeout 控制
wait_for_load_state导航 / 网络页面跳转、AJAX 批量请求后受 set_default_navigation_timeout 控制
隐式等待元素每次元素操作前是

推荐模式:

def click_navigate_to_target(self):
    self.click(self.TARGET_LINK)
    self.page.wait_for_load_state("networkidle")  # 等网络请求完成
    # 之后的 is_visible / click 等操作由隐式等待兜底

检查清单

  • 全局 DEFAULT_TIMEOUT 已在配置文件统一声明
  • 所有 page fixture(function 级 / class 级)均调用了 page.set_default_timeout()
  • PageObject 业务方法中无 time.sleep()
  • 显式 timeout 仅出现在已知慢路径的调用处,而非 PageObject 内部
  • PageObject 的 is_visible() 等方法保留 timeout 参数供调用方覆盖

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

为已有 PageObject 增量添加回归测试点。触发:新增测试点、添加回归点、add test point、增加覆盖、扩展页面方法。

The English summary is being prepared. Showing the original description.

DanielSuo117/velocitai159Updated Sep 28, 2026

POM 分层与 context 共享决策树。触发:架构、分层、POM、Page Object、基类设计、新增角色。

The English summary is being prepared. Showing the original description.

DanielSuo117/velocitai159Updated Sep 28, 2026

浏览器 viewport / headless / 超时分层配置。触发:viewport、浏览器配置、导航超时、headless、slow_mo、incognito。

The English summary is being prepared. Showing the original description.

DanielSuo117/velocitai159Updated Sep 28, 2026

共享 page 下用例离开起点后必须 UI 返回并断言。触发:往返闭合、case round trip、复位超时、scope 共享 page。

The English summary is being prepared. Showing the original description.

DanielSuo117/velocitai159Updated Sep 28, 2026

AST 知识图谱:变更审查、探索、调试、重构。触发:知识图谱、代码审查、影响分析、爆炸半径、重构。

The English summary is being prepared. Showing the original description.

DanielSuo117/velocitai159Updated Sep 28, 2026

一键生成 PageObject + 配套测试。触发:新增页面、生成页面、gen page、create page、添加页面对象。

The English summary is being prepared. Showing the original description.

DanielSuo117/velocitai159Updated Sep 28, 2026

See all skills by DanielSuo117

Report a problem with this skill