目前,我有一个网站,有这个在其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?');
})();
有人能告诉我我做错了什么吗?
2条答案
按热度按时间km0tfn4u1#
每次更新页面内容时都需要添加
page.waitForNavigation()
。ux6nzvsh2#
自从这个问题提出以来,网站在4年内发生了变化,但这是一个常见的故事:一个元素被手动验证存在于开发工具中,选择器被复制到Puppeteer中,但是在等待它的时候有一个超时。
这至少有几个常见的原因:
一种调试策略是有意识地运行(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
可能是合适的)。