【问题标题】:In puppeteer how to wait for DOM element lo load and then click在 puppeteer 中如何等待 DOM 元素加载然后单击
【发布时间】:2019-12-08 11:56:23
【问题描述】:

在 puppeteer 中如何等待 DOM 元素加载然后单击。我正在尝试访问一个简单的页面,点击 Start 按钮,然后应该会出现一个文本字段,我需要输入该文本字段。

代码如下。

const puppeteer = require('puppeteer');
const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));

(async () => {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.goto('https://janus.conf.meetecho.com/videocalltest.html');
  await page.click('#start', {waitUntil: 'domcontentloaded'});
  //await sleep(5000);
  await page.type('#username', 'austin');
  await sleep(5000);
  await browser.close();
})();

但是,如果我休眠 5 秒(在上面的代码中注释),那么我可以在文本字段中输入。

我想避免睡觉。请建议解决方法。

【问题讨论】:

    标签: google-chrome-devtools puppeteer


    【解决方案1】:

    您需要等待元素可见,因为该元素存在于 DOM 中,但不可见。

    这是有效的脚本:

    (async () => {
      const browser = await puppeteer.launch({headless: false});
      const page = await browser.newPage();
      await page.goto('https://janus.conf.meetecho.com/videocalltest.html');
      await page.click('#start');
      await page.waitForSelector('#username', { visible: true });
      await page.type('#username', 'austin');
      // await browser.close(); // commented it just to make sure that text is typed in the input before close browser.
    })();
    

    【讨论】:

    • 这很完美。如果我使用 {headless: true} 启动 chrome,带有 { visible: true } 选项的 waitForSelector 会起作用吗?
    • waitForSelector 如何处理错误?如果选择器没有加载会发生什么?
    • @MirzaPayam waitForSelector 函数将抛出如果选择器在超时后没有出现(默认为 30000(30 秒))毫秒的等待。
    【解决方案2】:

    你可以使用;page.waitForSelector(selector[, options]):

    await page.waitForSelector('#username', {visible: true})
    

    【讨论】:

    • 试过这个。还是同样的问题。它不输入文本字段。
    • 我只是在行首错过了等待。您的解决方案也有效。
    【解决方案3】:
    //Errors
    
    await page.waitForSelector('#username', {visible: true})
    .then(()=>{
        console.log('success');
    })
    .catch((err)=>{
        console.log(err);
    }
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常质量更高,更有可能吸引投票。
    猜你喜欢
    • 2019-06-20
    • 2020-03-28
    • 1970-01-01
    • 2015-11-30
    • 2019-07-03
    • 2020-08-29
    • 1970-01-01
    • 2018-02-20
    • 2020-03-09
    相关资源
    最近更新 更多