Puppeteer `waitForNavigation` 总是 return 超时

Puppeteer `waitForNavigation` always return timeout

之前可能有人问过这个问题,但 Whosebug 中的所有现有解决方案都无法帮助我。我有以下片段:

const puppeteer = require('puppeteer');

const loginFn = async () => {
  const browser = await puppeteer.launch();

  const deviceWidth = 1920;
  const deviceHeight = 1080;

  const page = await browser.newPage();

  await page.setCacheEnabled(false);
  await page.setViewport({ width: deviceWidth, height: deviceHeight });
  await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'
  );
  await page.goto('https://testwebsite.com/');

  await page.click('.qrNYy');
  await page.waitForSelector('input[type="email"]');
  await page.waitForSelector('input[type="password"]');

  await page.type('input[type="email"]', 'test@gmail.com');
  await page.type('input[type="password"]', 'test123');

  await Promise.all([
    page.click('.ffwHVz'),
    page.waitForNavigation({
      waitUntil: 'networkidle0',
    }),
  ]);

  await page.screenshot({ path: 'example.png' });
  await browser.close();
}

(async () => {
  await loginFn();
})();

我总是得到 TimeoutError: Navigation timeout of 30000 ms exceeded 错误,我尝试了 waitUntil 的所有选项,包括 networkidle0networkidle2loaddomcontentloaded无济于事(这些来自谷歌搜索和计算器)。我还按照上述许多解决方案的建议在 clickwaitForNavigation 上使用了 Promise.all,但我似乎无法绕过这个问题。

是网站本身的问题吗?这是根据网站本身的具体情况还是我的代码?注意:testwebsite.com 只是一个示例,但这正是我正在测试的网站上发生的事情,无论我多么努力,我似乎​​都无法通过。有人可以帮我吗?

waitForNavigation 的 Puppeteer 文档指出:

This resolves when the page navigates to a new URL or reloads

作为 SPA,Coinmarketcap 在登录或注册时不会重新加载页面或导航到另一个页面,因此 waitForNavigation 在这里不起作用。

相反,我建议您等待一个仅在用户登录时出现的元素。这可能会起作用(未经测试):

  await Promise.all([
    page.click('.ffwHVz'),
    page.waitForSelector('.icon-User-Filled'),
  ]);