Я хочу получить tagName элемента. В следующем примере это должно быть button.
const puppeteer = require('puppeteer')
async function run () {
const browser = await puppeteer.launch({headless: false})
const page = await browser.newPage()
const html = `
<div>
<button type = "button">click me</button>
<span>Some words.</span>
</div>
`
await page.setContent(html)
const elements = await page.$$('button')
const tagName = await elements[0].$eval('*', node => node.tagName)
console.info(tagName) // expect to be 'button'
await browser.close()
}
run()
В сообщении об ошибке указано Error: failed to find element matching selector "*"
Я могу сказать, что elements соответствует одному элементу, поскольку elements.length - это 1
Где не так?
========== Редактировать ==========
Допустим, у меня уже был elements заранее, как вытащить из него tagName.
Спасибо!
О, я вижу. Но как получить tagName? Пробовал elements[0].tagName, это undefined





Попробуйте использовать page.$eval для выбора кнопки, а затем получите tagName с помощью кнопки:
const tagName = await page.$eval('button', button => button.tagName);
Если у вас уже есть elementHandle, например elements[0], вы можете получить атрибут из этого элемента, передав его через page.evaluate:
const tagName = await page.evaluate(
element => element.tagName,
elements[0]
);
Спасибо! Но не знаю, станет ли это для меня решением. В своих кодах я использовал const elements = await page.$x(`//*[contains(text(), "${text}")]`), чтобы найти ближайший элемент, чей text() соответствует text. Затем я хотел бы получить tagName элементов для ведения журнала. Так что этот elements у меня уже был.
Похоже, ваш elements представляет собой набор ElementHandle.
В этом случае может быть немного более простой синтаксис:
const tag_name = await (await elements[0].getProperty('tagName')).jsonValue()
Это не связано с обращением к объекту страницы.
Спасибо!
.$eval('*',пытается найти ребенокelements[0], который являетсяbutton, верно? Ноelements[0]- это тот же<button>, у него нет детей.