我正在尝试使脚本成功登录后进入新页面,但是,它尝试在登录完成之前进入下一页。
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()函数中进行回调以在之后转到新页面?
答案 0 :(得分:1)
通过点击导航并等待页面加载的正确方法是使用Promise.all()和page.waitForNavigation(),如下所示:
await Promise.all([
page.waitForNavigation(),
page.click('#some-link')
]);
但是,当您通过page.goto()进行导航时,由于page.goto()
会自动等待页面加载,因此上述操作不是必需的。
在两种情况下,您都可以使用waitUntil
选项来自定义它等待的事件,该选项默认为load
事件。
page.goto(url [,options])
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)
其他一些注意事项:
load
事件在input
字段就绪之前触发,则可能需要使用page.waitForSelector()或其他形式的等待。Promise.all()
模式,但是这意味着您不需要提交按钮的选择器。您可能需要.click()
个字段input
中的一个,具体取决于页面的实现方式(例如,如果页面不使用autofocus
)。答案 1 :(得分:0)
与下面的解决方案相同,但是如果我理解正确,您应该先有点击事件,然后等待导航。
await Promise.all([
page.click('button'),
page.waitForNavigation(),
]);