关于Page_Load事件发生情况

本文介绍了ASP.NET中Page_Load事件的工作原理及其在页面生命周期中的位置。Page_Load会在页面首次加载及回发时触发,通过判断Page.IsPostBack的值可以区分这两种情况。文章还探讨了如何避免因多次触发Page_Load而导致的数据覆盖问题。

Page_Load事件会在第一次加载页面时发生和将该页面回发到服务器时发生

第一种情况Page.IsPostBack返回false,第二种返回True。

若在Page_Load事件中有一些对控件的操作,比如

txtName.Text = name;
txtAuthor.Text = author;
txtCount.Text = count;

 

在另一个事件中也有类似的

string amend_name = txtName.Text;
string amend_author = txtAuthor.Text;
string amend_count = txtCount.Text;

 

此时这一事件发生amend_name的值不为TextBook中更改过的值,而为原先name的值,因为Page_Load事件也会发生。

所以,若要使得Page_Load事件只在第一次加载页面时发生可使用

if(!IsPostBack)

{

}
`wait_for_load_state()` 是 Playwright 中用于控制页面加载时机的核心方法之一。它允许你等待页面达到某个**关键生命周期状态**后再继续执行后续操作,确保自动化操作的稳定性和可靠性。 --- ## ✅ 方法定义 ```python await page.wait_for_load_state(state, timeout=None) ``` - **`state`**: 要等待的状态,可选 `'load'`, `'domcontentloaded'`, `'networkidle'` - **`timeout`**: 超时时间(毫秒),默认为 30 秒 > ⚠️ 如果指定状态未在超时时间内达成,会抛出 `TimeoutError` --- ## 🔍 三种状态详解 ### 1. `'domcontentloaded'` #### 📌 含义: HTML 文档已完全解析完成,DOM 树构建完毕。 #### 🔧 触发事件: `DOMContentLoaded` 事件触发。 #### ✅ 包括: - HTML 解析完成 - DOM 节点可用 #### ❌ 不包括: - 外部资源如图片、CSS、字体、iframe 等尚未加载完 #### ⏱️ 发生时间: 较早,在视觉渲染之前。 #### ✅ 使用场景: - 快速操作 DOM(如点击按钮、读取标题) - 页面主要逻辑由 JS 驱动,不依赖样式或图片 #### 示例代码: ```python await page.goto("https://example.com") await page.wait_for_load_state("domcontentloaded") print("DOM 已就绪,可以开始操作") ``` --- ### 2. `'load'`(✅ 默认状态) #### 📌 含义: 所有资源(包括图片、CSS、JS、字体、iframe)都已加载完成。 #### 🔧 触发事件: `window.onload` 事件触发。 #### ✅ 包括: - 所有静态资源加载完成 - 页面布局基本稳定 #### ⏱️ 发生时间: 通常比 `domcontentloaded` 晚一些。 #### ✅ 使用场景: - 截图前确保画面完整 - 操作依赖样式的元素(如定位、尺寸判断) - 需要确保图像可见性 #### 示例代码: ```python await page.goto("https://example.com") await page.wait_for_load_state("load") # 这是 goto 的默认行为 await page.screenshot(path="full_page.png") ``` --- ### 3. `'networkidle'` #### 📌 含义: 最近 **500ms 内没有新的网络请求发出**。 #### 🔧 特点: - 不关心 `onload` 是否完成 - 关注“网络活动是否停止” #### ⏱️ 发生时间: 可能晚于 `load`,也可能更早(如果异步请求少) #### ✅ 使用场景: - 单页应用(SPA)动态加载数据(React/Vue/Angular) - 等待 AJAX 请求、API 数据返回 - 懒加载内容、分页列表、搜索结果等 #### 示例代码: ```python await page.goto("https://spa-app.com") # 等待所有 API 请求完成 await page.wait_for_load_state("networkidle") print("所有网络请求已完成") ``` #### ⚠️ 注意: 某些页面会持续发送心跳包或轮询请求(如 WebSocket、埋点),导致永远达不到 `networkidle`! --- ## 🆚 状态对比表 | 状态 | 触发条件 | 是否等资源 | 适用场景 | 风险 | |------|----------|------------|-----------|--------| | `domcontentloaded` | DOM 解析完成 | ❌ 不等资源 | 快速 DOM 操作 | 元素不可见/无样式 | | `load` | 所有资源加载完成 | ✅ 等资源 | 安全交互、截图 | 可能等待太久 | | `networkidle` | 500ms 无新请求 | ❌ 不保证资源加载 | SPA、AJAX 场景 | 心跳请求导致永不结束 | --- ## ✅ 实际使用建议 ### ✅ 推荐组合用法: ```python await page.goto("https://example.com") # 先确保 DOM 就绪 await page.wait_for_load_state("domcontentloaded") # 再根据业务需求决定是否等更多 if is_spa_page: await page.wait_for_load_state("networkidle") else: await page.wait_for_load_state("load") ``` ### ✅ 替代方案:监听具体请求(更精准) ```python async with page.expect_response("**/api/reports") as response_catcher: await page.click("#fetch-report-button") response = await response_catcher.value await response.finished() # 确保响应处理完成 ``` 这比盲目等 `networkidle` 更可靠。 --- ## ❗常见问题与陷阱 ### ❌ 陷阱 1:`networkidle` 永不返回 原因:页面有定时器、心跳请求、广告轮询等。 ✅ 解决方法: - 改用 `expect_response()` 监听关键请求 - 或设置合理超时并降级处理 ```python try: await page.wait_for_load_state("networkidle", timeout=10000) except TimeoutError: print("网络未完全空闲,但继续执行...") ``` --- ### ❌ 陷阱 2:认为 `load` 后就可以点击按钮 实际:按钮可能是 JS 动态启用的,或被遮挡。 ✅ 正确做法: ```python await page.wait_for_load_state("load") await page.locator("#submit-btn").wait_for(state="visible") await page.locator("#submit-btn").click() ``` --- ## ✅ 最佳实践总结 | 场景 | 推荐使用 | |------|---------| | 普通网页跳转 | `load`(默认) | | 快速 DOM 操作 | `domcontentloaded` | | SPA / 动态数据加载 | `networkidle` 或 `expect_response` | | 截图、PDF 导出 | `load` | | 表单提交后等待结果 | `expect_response` + `wait_for_selector` | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值