【问题标题】:Puppeteer: stop waiting for a slow page once a special element has already appearedPuppeteer:一旦特殊元素已经出现,就停止等待缓慢的页面
【发布时间】:2020-06-16 17:00:30
【问题描述】:

我需要访问一些独立的 URL,其中页面元素的加载速度非常慢。通常需要几分钟才能使整个页面完全加载。但是,此页面只有一小部分有用。有用的部分可以通过页面上的某个选择器来指示。因此,我想知道是否可以告诉 puppeteer 在键选择器已经出现后停止等待页面,以加快 .有广泛的答案告诉我们使用 await page.waitForSelector('.class_sample');

所以我这样使用它:

page = await browser.newgpae();
await page.goto('example.com/xxx.html');
await page.waitForSelector('.class_sample');`

但是,它仍然停留在page.goto()的舞台上。有时pyppeteer会在30s后报超时错误,因为目标页面太慢了。

我发现大多数关于waitForSelector() 方法的示例都放在.click() 方法后面。我的麻烦情况是页面相互独立(example.com/xxxxx.html),不能通过点击链接访问,所以waitForSelector()方法还没有解决我的问题。

任何建议将不胜感激。

【问题讨论】:

  • 您的第一行中有一些拼写错误和缺少awaitbrowser.newgpae(); 应该是await browser.newPage();。是您提问的错误,还是您的真实脚本中也存在这些错误?
  • 对不起。在我的问题中,这只是一个粗心的打字错误。我修改了我的问题,试图让它更容易理解。期待您的进一步帮助,并在此先感谢您。
  • 我明白了。如果它有助于使脚本更稳定,请参阅我的解决方案 { waitUntil: 'domcontentloaded' }
  • 其实我的要求是在puppeteer发现出现特殊元素的情况下提前停止导航来加速导航。 'domcontentloaded' 事件将使 chrome 等到整个页面加载完毕,包括一些缓慢的 javascript。那么是否可以在 goto() 方法中使用 waitForSelector 事件?
  • 不,waitForSelector 不是page.goto 中的选项。你用过page.setRequestInterception吗?也许您可以通过跳过某些请求类型来加快加载速度。

标签: javascript puppeteer pyppeteer


【解决方案1】:

我建议将page.gotodomcontentloaded 选项一起使用。为什么?因为默认选项是load,它会等待更长的时间等待那些你说不需要的元素,而当 DOMContentLoaded 事件触发时,你的选择器很可能已经可用。

我建议也留下waitForSelector,它会让你的脚本更可靠。

await page.goto('example.com', { waitUntil: 'domcontentloaded' });
await page.waitForSelector('.class_sample');

DOMContentLoaded

当初始 HTML 文档完全加载和解析时触发 DOMContentLoaded 事件,无需等待样式表、图像和子框架完成加载。 [source]

load

加载整个页面时会触发 load 事件,包括所有相关资源,例如样式表和图像。这与 DOMContentLoaded 不同,后者在页面 DOM 加载后立即触发,无需等待资源完成加载。 [source]

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 2022-11-05
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    相关资源
    最近更新 更多