javascript - Puppeteer 转到不同的页面
问题描述
我试图让我的脚本在成功登录后转到一个新页面,但是,它会在登录完成之前尝试转到下一页。
const page = await browser.newPage();
page.goto('https://website/login');
page.once('load', async () => {
console.log('Page loaded!');
// Login script here
});
不过,我不知道登录后如何转到新链接,我最初的解决方案是这样做;
// go to stats
await page.goto('https://www.website/stats');
但是,由于页面已经定义,这并没有真正等待任何事情。
之后是否可以在 .click() 函数中进行回调以转到新页面?
解决方案
通过单击导航并等待页面加载的正确方法是使用Promise.all()和page.waitForNavigation(),如下所示:
await Promise.all([
page.waitForNavigation(),
page.click('#some-link')
]);
但是,当您通过page.goto()导航时,上述内容不是必需的,因为page.goto()
会自动等待页面加载。
waitUntil
在这两种情况下,您都可以使用默认为事件的选项自定义它等待的load
事件。
page.goto(url[, 选项])
url
页面导航到的 URL。url 应包括方案,例如https://
.options
可能具有以下属性的导航参数:
timeout
最大导航时间,以毫秒为单位,默认为 30 秒,通过0
禁用超时。可以使用 page.setDefaultNavigationTimeout(timeout) 方法更改默认值。waitUntil
何时认为导航成功,默认为load
. 给定一个事件字符串数组,在所有事件都被触发后,导航被认为是成功的。...
综上所述,登录示例如下:
const page = await browser.newPage();
await page.goto('https://website/login');
await page.type('input[type="email"]', 'foo@example.com');
await page.type('input[type="password"]', 'pass1234');
await Promise.all([
page.waitForNavigation(),
page.click('button')
]);
// Now we are on the home page (or wherever we end up after logging in)
其他一些注意事项:
- 如果页面事件在字段准备好之前触发,您可能需要使用page.waitForSelector()或其他形式的等待。
load
input
- Enter您也可以通过使用键盘按键来提交登录表单。这仍然需要该
Promise.all()
模式,但意味着您不需要提交按钮的选择器。根据页面的实现方式(例如,如果页面不使用) ,您可能需要.click()
其中一个字段。input
autofocus
推荐阅读
- swiftui - 具有 ObservableObject 属性的 ObservableObject 未触发 SwiftUI 更新
- sql - 如果前一列值不为空,则更新表中的下一列
- environment-variables - 如何在 Gatsby 应用程序的 .env 文件中指定 URL?
- import - 在 Python3 中导入相邻模块
- html - 如何使用 CSS 在不同设备中计算我的 margin-top?
- angular - 无法为 WOFF、WOFF2 和 TTF 解码下载的字体
- apache-kafka - 给定时间段的批量消费者不适用于 Spring Cloud Stream(StreamListener)中的多个分区?
- r - 在 R 上安装“xml2”时遇到问题(来自 Redhat)
- spring - Spring 与 CDI 范围
- python - 如何在 Python 中分割每 2 行?