跳到主要内容

导航

介绍

Playwright 可以导航到 URL 并处理页面交互引起的导航。

基本导航

最简单的导航形式是打开一个 URL

# Navigate the page
page.goto("https://example.com")

上述代码加载页面并等待网页触发 load 事件。load 事件在整个页面加载完毕时触发,包括所有依赖资源,例如样式表、脚本、iframe 和图像。

注意

如果页面在 load 事件之前进行了客户端重定向,则 page.goto() 将等待重定向后的页面触发 load 事件。

页面何时加载完成?

现代页面在 load 事件触发后会执行大量活动。它们会延迟加载数据、填充 UI,并在 load 事件触发后加载耗费资源的脚本和样式。无法判断页面何时“加载完毕”,这取决于页面、框架等因素。那么,何时可以开始与页面进行交互?

在 Playwright 中,你可以随时与页面进行交互。它会自动等待目标元素变得 可操作

# Navigate and click element
# Click will auto-wait for the element
page.goto("https://example.com")
page.get_by_text("example domain").click()

对于上述场景,Playwright 将等待文本变得可见,等待该元素的其他可操作性检查通过,然后点击它。

Playwright 的操作速度非常快,就像一个用户一样 - 它看到按钮的那一刻就会点击它。通常情况下,你无需担心所有资源是否加载完成等问题。

水合

有时,你可能会遇到 Playwright 执行了操作但似乎什么也没发生的情况。或者你输入一些文本到输入字段,但文本会消失。最可能的原因是页面 水合 不佳。

当页面进行水合时,首先会将页面的静态版本发送到浏览器。然后发送动态部分,页面变为“活动”状态。作为速度非常快的用户,Playwright 会在看到页面的那一刻开始与之交互。如果页面上的按钮已启用,但监听器尚未添加,Playwright 会执行其操作,但点击不会产生任何效果。

一个简单的方法来验证你的页面是否存在水合不佳的问题是打开 Chrome DevTools,在 Network 面板中选择“Slow 3G”网络仿真并重新加载页面。一旦你看到感兴趣的元素,就与之交互。你会看到按钮点击会被忽略,并且输入文本会被后续的页面加载代码重置。解决此问题的正确方法是确保所有交互式控件在水合完成后(页面完全可用时)才启用。

等待导航

点击元素可能会触发多次导航。在这种情况下,建议显式地 page.wait_for_url() 到指定的 URL。

page.get_by_text("Click me").click()
page.wait_for_url("**/login")

Playwright 将在页面中显示新文档的过程分为 导航加载

导航开始 通过更改页面 URL 或通过与页面交互(例如,点击链接)开始。导航意图可能会被取消,例如,遇到无法解析的 DNS 地址或转换为文件下载。

当响应头被解析且会话历史记录更新时,导航就被 提交。只有在导航成功(已提交)后,页面才开始 加载 文档。

加载 包括通过网络获取剩余的响应体、解析、执行脚本和触发 load 事件