Puppeteer等待URL

9

我已经关闭了无头模式,并且希望等待用户重定向到某个页面。我可以使用 puppeteer API 的 waitForRequest,但我不知道确切的 URL,只需要通过一些条件即可。

因此,我使用 waitForFunction 并在那里检查条件,但当我重定向到正确的 URL 时,由于某些原因我需要刷新页面才能通过这些条件。

我的代码如下:

try {
    await page.waitForFunction(() => {
        if(window &&
           window.location &&
           window.location.hostname) {
            const host = window.location.hostname.split('.');
            if(!host.includes('www') &&
               !host.includes('new') &&
               host.includes('margonem') &&
               host.length === 3) {
                return true;
            }
        }
    }, {
        polling: 200,
        timeout: 0
    })
} catch (e) {
    console.log(e);
}

当我重定向到传递以上所有 if 语句的 URL 时,我需要重新加载页面才能实际看到它返回 true。为什么会出现这种情况呢?我不想让用户在输入正确信息后被强制刷新页面。
3个回答

7
我发现最简单的方法是使用waitForFunction,它易于修改以适合您的规格,并且紧凑。
  await page.waitForFunction("window.location.pathname == '/Welcome.aspx'")

7

我已经关闭了无头模式,我想等待用户重定向到某个页面。

只需使用waitForNavigation()

click结合使用时,请确保使用此模式

const [response] = await Promise.all([
  page.waitForNavigation(waitOptions),
  page.click(selector, clickOptions),
]);

waitForNavigation还返回一个响应对象,您可以对其进行检查。

我可以使用来自puppeteer API的waitForRequest,但我不知道确切的URL,它只需要通过几种情况。

在这种情况下,puppeteer将请求作为参数注入,您可以在lambda函数中测试此请求。例如:

page.waitForRequest(request => {
  return  request.url().includes('margonem') && request.method() === 'GET'
})

但是waitForNavigation只能接受load,domcontentloaded,networkidle0,networkidle2,我想等待URL通过我的函数中的每个if。你读懂我的问题了吗? - BT101
你写道:“我想要等待用户重定向到某个页面。” 在这种情况下,使用waitForNavigation。但为了澄清你的另一个问题,我更新了我的答案。希望这可以帮助到你。 - Felix K.
是的,但之后我指定了它必须是哪个URL。无论如何,我不知道你可以将函数传递给waitForRequest。我认为这会解决我的问题。请给我一点时间尝试一下。 - BT101

4
有时我们需要等待到达特定的URL。
处理这种情况的最佳方法是:
    let holdProgress = true;
        while (holdProgress) {
            await page.waitFor(300);
            if (page.url().includes('/env-selector')) {
                holdProgress = false;
            }
        }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接