【问题标题】:Puppeteer how to check if page is navigated and perform task if not navigatedPuppeteer 如何检查页面是否已导航并在未导航时执行任务
【发布时间】:2021-02-16 13:01:35
【问题描述】:

在登录页面上,我试图确定是否出现了 google recaptcha。如果是这样,我想运行一段代码,否则像往常一样导航。

await page.goto(
    url
  );
  await page.waitForSelector("#username");
  await page.type("#username", process.env.EMAIL);
  await page.type("#password", process.env.PSWD);
  await  page.$eval("#signIn > div > button", (el) => el.click()) //this line sometimes triggers recaptcha

  {//here wait for navigation and check if google captcha appears}

  //then run the following code:
  await page.solveRecaptchas();
  await Promise.all([
    page.waitForNavigation(),
    page.click("#signIn"),
  ]);

我尝试过使用 page.waitForNavigation,但如果出现 recaptcha,它会导致超时。仅当出现 google recaptcha 时,我该怎么做才能运行底部代码块?

如果recaptcha-token 存在,我也尝试有条件地运行代码块,但我检查了dom 和recaptcha 元素始终存在并且只提示随机选择图像。基本上我有时可以导航而无需执行任何验证码,有时会提示我选择图像。

谢谢!

【问题讨论】:

    标签: javascript html node.js puppeteer browser-automation


    【解决方案1】:

    也许是这样的?

    const [_, navigation] = await Promise.allSettled([
      element.click(),
      page.waitForNavigation(),
    ]);
    
    if (navigation.status === 'fulfilled') /* There was navigation. */;
    else /* There was timeout, no navigation. */;
    

    【讨论】:

    • 感谢您的回复。不过,我宁愿不让它等待超时,因为它是一个需要快速高效的机器人。是否可以降低超时时间?
    • 是的,有参数和默认属性:page.waitForNavigation()
    • 哦,好吧,介意分享一些关于如何将选项参数传递给 waitForNavigation 的技巧吗?
    • 我认为是page.waitForNavigation({ timeout: 5000 }) 5 秒。
    • @scythargon 这不是 puppeteer 功能,它是一个重新发送的语言功能:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    猜你喜欢
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多