Как получить имя класса ElementHandle при использовании Puppeteer? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь получить имя класса ElementHandle, используя Puppeteer ... это возможно?Я использую неправильный подход?В этом 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

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Оставим это здесь, так как эта страница в настоящее время является первым результатом поиска "имени класса elementhandle"

Из документов , вы просто сможетеследующие

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

// alternatively,
// page.$('.myElement')
//    .then(el => el.getProperty('className'))
//    .then(className => ... )
0 голосов
/ 09 января 2019

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)

, который будет регистрировать массив классов

Примечание: когда я пытался сделать .split в концеjsonValue () это не сработало, так как я считаю, что обещание не было решено в этот момент, поэтому cn.jsonValue().split(" ") не будет работать


Ссылки

Список свойств наelements

Документы кукловода для ElementHandle

0 голосов
/ 18 мая 2018

Я нашел решение, которое помогает по частям, но оно было достаточно хорошим для меня.У меня есть имя класса, доступное ElementHandle._remoteObject.description.Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...