跳转到主要内容

导航

简介

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,在“网络”面板中选择“Slow 3G”网络模拟并重新加载页面。一旦看到感兴趣的元素,就与之交互。您会看到按钮单击将被忽略,并且输入的文本将被后续页面加载代码重置。解决此问题的正确方法是确保在水合之后、页面完全正常运行之前,禁用所有交互式控件。

等待导航

单击元素可能会触发多次导航。在这些情况下,建议显式使用 page.wait_for_url() 等待特定 URL。

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

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

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

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

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