使用Puppeteer时如何获取ElementHandle的类名?

时间:2018-05-18 13:55:47

标签: puppeteer

我正在尝试使用Puppeteer获取ElementHandle的类名...这可能吗?我使用了错误的方法吗?在这个jsBin是我的代码的一部分,所以你可以理解我想要实现的目标。

CriticalCssPlugin.prototype.load = function( page, src ) {
  return page.goto( src, { waitUntil: 'networkidle2' } )
    .then( () => {
      return page
        .$$( '*' )
        .then( elements => {
          return Promise.all( elements.map( element => {
            return element.boundingBox()
          } ) )
            .then( positions => {
              let visible = positions.filter( ( rect, index ) => {
                if ( !rect ) {
                  return rect
                }

                rect.element = elements[ index ]

                return this.isAnyPartOfElementInViewport( rect, page.viewport() )
              } )

              this.getClasses( visible )
            } )
        } )
    } )
}

CriticalCssPlugin.prototype.getClasses = function( visibles ) {
  Promise.all( visibles.map( visible => {
    return visible.element.getProperty( '' )
  } ) )
    .then( classes => {
      console.log(classes);
    } )
}

CriticalCssPlugin.prototype.isAnyPartOfElementInViewport = function( rect, viewport ) {
  const windowHeight = viewport.height
  const windowWidth = viewport.width
  const vertInView = ( rect.y <= windowHeight ) && ( ( rect.y + rect.height ) >= 0 )
  const horInView = ( rect.x <= windowWidth ) && ( ( rect.x + rect.width ) >= 0 )

  return ( vertInView && horInView )
}

https://jsbin.com/kuzejoluji/edit?js,output

谢谢:D

5 个答案:

答案 0 :(得分:4)

由于当前是搜索“ elementhandle类名称”的第一个结果,因此将其放在此处

docs中,您应该能够执行以下操作

const el = await page.$('.myElement')
const className = await el.getProperty('className')

// alternatively,
// page.$('.myElement')
//    .then(el => el.getProperty('className'))
//    .then(className => ... )

答案 1 :(得分:3)

jimmyjoy的答案是正确的,但这可能有助于其他人使用elementHandle

  page.$(el) // This grabs the element (returns a elementHandle)
    .then((el) => el.getProperty("className")) // Returns a jsHandle of that property
    .then((cn) => cn.jsonValue()) // This converts the className jsHandle to a space delimitedstring       
    .then((classNameString) => classNameString.split(" ") // Splits into array
    .then((x) => console.log(x)

哪个会记录一组类

注意:当我尝试在jsonValue()的末尾执行.split时,此操作不起作用,因为我认为当时诺言尚未解决,所以cn.jsonValue().split(" ")无法正常工作


参考

List of properties on elements

Puppeteer docs for ElementHandle

答案 2 :(得分:1)

我找到了一个有用的解决方案,但这对我来说已经足够了。我的班级名称有ElementHandle._remoteObject.description。 希望这有助于某人。

答案 3 :(得分:1)

您可以获取元素变量并使用评估函数,如下所示:

const element = await page.$(".some-class"); // for ids you can write "#some-id"
const className = await page.evaluate(el => el.className, element);
console.log('className', className) // here you can get the class name

答案 4 :(得分:0)

这就是我所做的:

let posts = await page.$$(".postContainer .upvote");

for (let i = 0; i < posts.length; i++) {
// log class name
        console.log(await (await posts[i].getProperty('className')).jsonValue());

// click upvotes on posts
        await codes[i].click();
    }