javascript - 如果存在则单击按钮,否则单击 puppeteer 中的不同按钮

标签 javascript node.js google-chrome-devtools ui-testing puppeteer

我正在尝试在 puppeteer 中设置一个 if/else 语句来点击一个按钮(如果它存在),否则点击另一个按钮。我正在做这样的事情:

if (document.querySelector('#buttonToClick') !== null) {
    await page.waitForSelector('#buttonToClick');
    await page.click('#buttonToClick');
  } 

else { 
// first click #otherButton and then click #buttonToClick
    await page.waitForSelector('#otherButton');
    await page.click('#otherButton');

    await page.waitForSelector('#buttonToClick');
    await page.click('#buttonToClick');
  }

出于某种原因,即使我转到 Chrome 控制台并执行 document.querySelector('#buttonToClick') !==null 时,我仍然陷入 else block > 在所需页面上显示为 true

更新:下面的代码似乎对我有用,但我不确定为什么

await page.waitFor(3000);

  if ((await page.$('#buttonToClick')) !== null) {
    await page.click('#buttonToClick');
  } else {
    await page.waitForSelector('#otherButton');
    await page.click('#otherButton');

    await page.waitForSelector('#buttonToClick');
    await page.click('#buttonToClick');
  }`

我想这可能与 DOM 的加载方式有关,所以我尝试了:

await page.waitForNavigation({waitUntil: 'domcontentloaded'})
// await page.waitFor(3000)

  if ((await page.$('#buttonToClick')) !== null) {
    await page.click('#buttonToClick');
  } else {
    await page.waitForSelector('#otherButton');
    await page.click('#otherButton');

    await page.waitForSelector('#buttonToClick');
    await page.click('#buttonToClick');
  }

但这没有用...它只适用于 if 语句之前的 await page.waitFor(30000)...有什么想法吗?

最佳答案

我不认为 document.querySelector 通常存在于 node.js 程序中。 Puppeteer 确实提供了 page.$ ,这是一个紧密的类比。它返回一个 Promise。

更新:根据问题中的新信息,听起来包含 #buttonToClick 的 DOM 树部分是在 DOMContentLoaded 事件之后构造的。我使用 page.waitForNavigation({ waitUntil: 'networkidle0' }) 取得了很好的效果,但如果您有延迟的网络连接,'networkidle2' 或其他一些选项可能会更好。在此处查看各种选项:https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagewaitfornavigationoptions

我怀疑这应该可行:

await page.waitForNavigation({ waitUntil: 'networkidle0' });
if (await page.$('#buttonToClick') !== null) {
    await page.click('#buttonToClick');
  } else {
    await page.waitForSelector('#otherButton');
    await page.click('#otherButton');
  }

关于javascript - 如果存在则单击按钮,否则单击 puppeteer 中的不同按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50536414/

相关文章:

javascript - CSS HTML : Text Wraps in Chome: Works fine in Firefox and IE

javascript - Es6 使用扩展合并两个对象不起作用

javascript - 如何继续实现混合移动应用理念?

javascript - 隐藏提取错误

javascript - 确定 GC 释放了哪些 JavaScript 对象

javascript - 如何使用 Vuex/Vue 处理异步数据检索

javascript - NodeJS : How to zip (local) files after done with JIMP

javascript - 如何有效地将源文件包装在将导出到规范文件的函数中?

javascript - 有什么方法可以让附近的 html Node 与 NodeJS 中当前 Node 的标签名称不同?

selenium-webdriver - 如何导入通用的 selenium devtool 网络版本