NodeJS 错误提示:等待选择器超时

ar5n3qh5  于 2023-02-08  发布在  Node.js
关注(0)|答案(2)|浏览(178)

目前,我有一个网站,有这个在其HTML。我确认它从检查的元素在 chrome 开发工具。

<div class="hdp-photo-carousel" style="transform: translateX(0px);">
  <div class="photo-tile photo-tile-large">

我直观地看到页面打开,我可以看到项目在那里。然后我在30秒后得到这个错误:

UnhandledPromiseRejectionWarning: TimeoutError: waiting for selector ".photo-tile" failed: timeout 30000ms exceeded

我在puppeteer js中的代码是:

const pptrFirefox = require('puppeteer-firefox');

(async () => {
  const browser = await pptrFirefox.launch({headless: false});
  const page = await browser.newPage();
  await page.goto('https://zillow.com');
  await page.type('.react-autosuggest__input', '8002 Blandwood Rd. Downey, CA 90240');
  await page.click('.zsg-search-button_primary');
  await page.waitForSelector('.photo-tile');
  console.log('did I get this far?');
})();

有人能告诉我我做错了什么吗?

km0tfn4u

km0tfn4u1#

每次更新页面内容时都需要添加page.waitForNavigation()

(async () => {
  const browser = await pptrFirefox.launch({headless: false});
  const page = await browser.newPage();
  const navigationPromise = page.waitForNavigation({waitUntil: "domcontentloaded"});
  await page.goto('https://zillow.com');
  await navigationPromise;
  await page.type('.react-autosuggest__input', '8002 Blandwood Rd. Downey, CA 0240');
  await page.click('.zsg-search-button_primary');
  await navigationPromise;
  await page.waitForSelector('.photo-tile');

  console.log('did I get this far?');

})();
ux6nzvsh

ux6nzvsh2#

自从这个问题提出以来,网站在4年内发生了变化,但这是一个常见的故事:一个元素被手动验证存在于开发工具中,选择器被复制到Puppeteer中,但是在等待它的时候有一个超时。
这至少有几个常见的原因:

  • 元素位于影子根中
  • 元素位于iframe中
  • 需要将元素滚动到视图中,否则该元素将超出视区
  • 服务器将您的脚本检测为僵尸程序并阻止您,或显示验证码

一种调试策略是有意识地运行(OP已经在这样做了,但未来的访问者可能不会)。如果代码工作正常,那么网站只会在你无意识时将你检测为机器人。请参阅规范的Why does headless need to be false for Puppeteer to work?了解下一步。console.log(await page.content())可以帮助确定你是否被无意识地阻止。
如果头脑发热仍然不行,看看页面看看为什么。在某些情况下,页面可能显示验证码,导致Bypassing CAPTCHAs with Headless Chrome using puppeteer。这似乎是目前的问题在写的时候的情况。
通常,添加更多的waitForNavigation并将超时设置为0没有什么帮助(除非您正在通过单击或表单提交在页面之间导航,否则waitForNavigation可能是合适的)。

相关问题