【问题标题】:puppeteer wait for network idle after clickpuppeteer 点击后等待网络空闲
【发布时间】:2020-01-20 22:45:58
【问题描述】:

现有的 Q&A 都没有针对此问题的干净解决方案,例如,

所以这里有一个简单的工作示例供人们查看/尝试/修复:

const puppeteer = require('puppeteer');

(async() => {
  const browser = await puppeteer.launch({headless: true});
  try {
    const page = await browser.newPage();

    await page.setViewport({width: 800,height: 800});
    const response = await page.goto(`https://stock.finance.sina.com.cn/usstock/quotes/TSLA.html`, {
        waitUntil: 'networkidle0'
      });
    //console.log(await page.content());

    let selector = `div.kke_menus_tab_edage > div:nth-child(6) > a`
    await page.waitForSelector(selector)
    await page.click(selector)

    const inputElement = await page.$('div.sec.clearfix div.block.block_hq')
    await inputElement.screenshot({path: 'sina-finance.png'})

  } catch (err) {console.log(err.message);}
  finally {
    await browser.close();
  }
})()

总之,

  • click 不会触发任何导航
  • inputElement 已经存在,甚至在单击之前就已经存在,所以等不及了。

任何简单的解决方案,例如page.waitForNavigation,例如page.waitForNetwork({waitUntil: 'networkidle0'})
否则,我将向 puppeteer 项目提出一个错误以提供一个。谢谢。

【问题讨论】:

    标签: javascript wait puppeteer


    【解决方案1】:

    如果您知道单击按钮时发出的具体请求,则可以轻松使用page.waitForResponse() 方法。

    例如

    const pageClick = page.click(selector);
    const response = page.waitForResponse(response => response.url() === 'https://example.com' && response.status() === 200);
    
    await Promise.all([
        pageClick,
        response
    ]);
    

    【讨论】:

    • response.url() 必须非常具体,对吧?不幸的是,如果是这种情况,它不适用于我的情况,因为子请求正在触发到/e.gif?UATrack||170.1xx.1xx.6_1579617169.47||170.1xx.1xx.6_1579617169.48||||chart_detail||k_re0||||||||&gUid_1579617220029,它一直在变化。即,我需要一个通用的解决方案,而不是一个特定的解决方案。
    • 如果你能在某处看到一个模式,这可以工作,因为response.url() 返回一个字符串。您可以轻松地使用include 方法或正则表达式来匹配您要查找的内容。不幸的是,我看不出有任何方法可以实现您的愿望。
    猜你喜欢
    • 2023-02-03
    • 2019-06-20
    • 2019-07-07
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多