导航
简介
Playwright 可以导航到 URL,并处理由页面交互引起的导航。
基本导航
最简单的导航形式是打开一个 URL
// Navigate the page
page.navigate("https://example.com");
以上代码加载页面并等待网页触发 load 事件。当整个页面(包括所有依赖资源,如样式表、脚本、iframe 和图像)都加载完毕时,将触发 load 事件。
如果页面在 load
之前执行客户端重定向,Page.navigate() 将等待重定向后的页面触发 load
事件。
页面何时加载完成?
现代页面在 load
事件触发后会执行大量活动。它们延迟获取数据、填充 UI,并在 load
事件触发后加载昂贵的资源、脚本和样式。没有办法判断页面是否“已加载”,这取决于页面、框架等。那么何时可以开始与之交互呢?
在 Playwright 中,您可以随时与页面交互。它将自动等待目标元素变为 可操作。
// Navigate and click element
// Click will auto-wait for the element
page.navigate("https://example.com");
page.getByText("Example Domain").click();
对于上面的场景,Playwright 将等待文本变得可见,将等待该元素的其余可操作性检查通过,然后单击它。
Playwright 的操作速度非常快,就像一个快速用户一样 - 一旦看到按钮,它就会点击它。在一般情况下,您无需担心所有资源是否都已加载等等。
水合 (Hydration)
在某个时候,您会偶然发现一个用例,其中 Playwright 执行了一个操作,但似乎什么都没有发生。或者您在输入字段中输入了一些文本,但它会消失。这背后最可能的原因是页面水合不良。
当页面水合时,首先,页面的静态版本被发送到浏览器。然后动态部分被发送,页面变为“活动”状态。作为一个非常快速的用户,Playwright 将在看到页面后立即开始与之交互。如果页面上的按钮已启用,但尚未添加监听器,Playwright 将完成其工作,但单击不会有任何效果。
验证您的页面是否遭受水合不良问题的一种简单方法是打开 Chrome DevTools,在 Network 面板中选择“Slow 3G”网络模拟并重新加载页面。一旦看到感兴趣的元素,请与之交互。您将看到按钮点击将被忽略,并且输入的文本将被后续页面加载代码重置。解决此问题的正确方法是确保在水合之后,当页面完全正常运行时,禁用所有交互式控件。
等待导航
单击元素可能会触发多次导航。在这些情况下,建议显式使用 Page.waitForURL() 等待特定 URL。
page.getByText("Click me").click();
page.waitForURL("**/login");
导航事件
Playwright 将在页面中显示新文档的过程分为导航和加载。
导航开始于更改页面 URL 或与页面交互(例如,单击链接)。导航意图可能会被取消,例如,在遇到未解析的 DNS 地址时或转换为文件下载。
当响应头已解析且会话历史记录已更新时,导航被提交。只有在导航成功(被提交)后,页面才开始加载文档。
加载包括通过网络获取剩余的响应主体、解析、执行脚本和触发加载事件
- Page.url() 设置为新的 URL
- 文档内容通过网络加载和解析
- Page.onDOMContentLoaded(handler) 事件被触发
- 页面执行一些脚本并加载资源,如样式表和图像
- Page.onLoad(handler) 事件被触发
- 页面执行动态加载的脚本