javascript - Puppeteer 中复杂的 CSS 选择器

标签 javascript node.js css-selectors google-chrome-devtools puppeteer

是否有更短的方法来等待复杂选择器?

await page.evaluate(() => {
  return new Promise(resolve => {
     var aid = setInterval(function(){
        let block = $('div[class="asset"]:contains("Assets Folder")');

        if(block.length){
           clearInterval(aid);
           block.click();
           resolve();
        }

     }, 100);
  })
});

page.waitFor() 抛出错误:

Error: Evaluation failed: DOMException: Failed to execute 'querySelector' on 'Document': 'div[class="asset"]:contains("Assets Folder")' is not a valid selector.

最佳答案

page.waitForFunction()

您可以使用page.waitForFunction()等待给定函数返回真值。

请记住 :contains()选择器是 jQuery API 的一部分,而不是标准 CSS 选择器。

因此,您可以等到 some与选择器匹配的 Node 数组中的元素(至少一个)具有 textContent其中includes指定的文本并且存在于 DOM 中:

await page.waitForFunction(() =>
  [...document.querySelectorAll('div[class="asset"]')].some(e => e.textContent.includes('Assets Folder'))
);

page.waitForXPath()

或者,XPath 包含 contains()函数,所以你可以使用page.waitForXPath()使用相应的 XPath 表达式来等待您的元素被添加到 DOM:

await page.waitForXPath('//*[contains(text(), "Assets Folder")]/ancestor-or-self::div[@class="asset"]');

关于javascript - Puppeteer 中复杂的 CSS 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53063356/

相关文章:

javascript - 在矩形的边缘上获取两个点

javascript - NodeJS 中变量范围和 'require' 的奇怪行为

node.js - 如何启用对 AWS STS AssumeRole 的访问

css - 如何在CSS中的另一个规则中使用规则?

cocoa - 从 NSSecureTextField 获取 stringValue 时出现问题

javascript - NodeJS 获取流式文件下载的字节数

javascript - 重定向页面加载前未登录的用户

javascript - 如何检查 Firestore 查询是否为空或我尝试获取的文档不存在?

javascript - chrome 扩展中的 Puppeteer,没有 puppeteer-web

html - 纯CSS : Select elements that have n or more siblings