Puppeteer:获取 innerHTML
Puppeteer: Get innerHTML
有人知道如何获取元素的 innerHTML
或文本吗?甚至更好;如何单击具有特定 innerHTML
的元素?这就是正常 JavaScript:
的工作方式
var found = false
$(selector).each(function() {
if (found) return;
else if ($(this).text().replace(/[^0-9]/g, '') === '5' {
$(this).trigger('click');
found = true
}
});
在此先感谢您的帮助!
这就是我获取 innerHTML 的方式:
page.$eval(selector, (element) => {
return element.innerHTML
})
<div id="innerHTML">Hello</div>
var myInnerHtml = document.getElementById("innerHTML").innerHTML;
console.log(myInnerHtml);
您可以利用 page.$$(selector)
to get all your target elments and then use page.evaluate()
获取内容 (innerHTML
),然后应用您的条件。它应该看起来像:
const targetEls = await page.$$('yourFancySelector');
for(let target of targetEls){
const iHtml = await page.evaluate(el => el.innerHTML, target);
if (iHtml.replace(/[^0-9]/g, '') === '5') {
await target.click();
break;
}
}
这应该与木偶操纵者一起工作:)
const page = await browser.newPage();
const title = await page.evaluate(el => el.innerHTML, await page.$('h1'));
关于你这部分问题...
"Or even better; how to click an element with a specific innerHTML."
还有一些particulars around innerHTML, innerText, and textContent that might give you grief. Which you can work-around using a sufficiently loose XPath query with Puppeteer v1.1.1。
像这样:
const el = await page.$x('//*[text()[contains(., "search-text-here")]]');
await el[0].click({
button: 'left',
clickCount: 1,
delay: 50
});
请记住,您将从该查询返回一个 ElementHandles 数组。所以...如果您的文本不是唯一的,您正在寻找的特定项目可能不在 [0]。
Options 如果您只需要一个 left-click.
,则不需要传递给 .click()
你可以简单地写成下面这样。 (不需要最后一句await)
const center = await page.$eval('h2.font-34.uppercase > strong', e => e.innerHTML);
我永远无法让 .innerHtml 可靠地工作。我总是这样做:
let els = page.$$('selector');
for (let el of els) {
let content = await (await el.getProperty('textContent')).jsonValue();
}
那么您的文本就在 'content' 变量中。
返回元素的 innerHTML
您可以使用以下方法来return一个元素的innerHTML
:
page.$eval()
const inner_html = await page.$eval('#example', element => element.innerHTML);
page.evaluate()
const inner_html = await page.evaluate(() => document.querySelector('#example').innerHTML);
page.$() / elementHandle.getProperty() / jsHandle.jsonValue()
const element = await page.$('#example');
const element_property = await element.getProperty('innerHTML');
const inner_html = await element_property.jsonValue();
单击具有特定 innerHTML 的元素
您可以使用以下方法根据元素中包含的 innerHTML
单击元素:
page.$$eval()
await page.$$eval('.example', elements => {
const element = elements.find(element => element.innerHTML === '<h1>Hello, world!</h1>');
element.click();
});
page.evaluate()
await page.evaluate(() => {
const elements = [...document.querySelectorAll('.example')];
const element = elements.find(element => element.innerHTML === '<h1>Hello, world!</h1>');
element.click();
});
page.evaluateHandle() / elementHandle.click()
const element = await page.evaluateHandle(() => {
const elements = [...document.querySelectorAll('.example')];
const element = elements.find(element => element.innerHTML === '<h1>Hello, world!</h1>');
return element;
});
await element.click();
有人知道如何获取元素的 innerHTML
或文本吗?甚至更好;如何单击具有特定 innerHTML
的元素?这就是正常 JavaScript:
var found = false
$(selector).each(function() {
if (found) return;
else if ($(this).text().replace(/[^0-9]/g, '') === '5' {
$(this).trigger('click');
found = true
}
});
在此先感谢您的帮助!
这就是我获取 innerHTML 的方式:
page.$eval(selector, (element) => {
return element.innerHTML
})
<div id="innerHTML">Hello</div>
var myInnerHtml = document.getElementById("innerHTML").innerHTML;
console.log(myInnerHtml);
您可以利用 page.$$(selector)
to get all your target elments and then use page.evaluate()
获取内容 (innerHTML
),然后应用您的条件。它应该看起来像:
const targetEls = await page.$$('yourFancySelector');
for(let target of targetEls){
const iHtml = await page.evaluate(el => el.innerHTML, target);
if (iHtml.replace(/[^0-9]/g, '') === '5') {
await target.click();
break;
}
}
这应该与木偶操纵者一起工作:)
const page = await browser.newPage();
const title = await page.evaluate(el => el.innerHTML, await page.$('h1'));
关于你这部分问题...
"Or even better; how to click an element with a specific innerHTML."
还有一些particulars around innerHTML, innerText, and textContent that might give you grief. Which you can work-around using a sufficiently loose XPath query with Puppeteer v1.1.1。
像这样:
const el = await page.$x('//*[text()[contains(., "search-text-here")]]');
await el[0].click({
button: 'left',
clickCount: 1,
delay: 50
});
请记住,您将从该查询返回一个 ElementHandles 数组。所以...如果您的文本不是唯一的,您正在寻找的特定项目可能不在 [0]。
Options 如果您只需要一个 left-click.
,则不需要传递给 .click()你可以简单地写成下面这样。 (不需要最后一句await)
const center = await page.$eval('h2.font-34.uppercase > strong', e => e.innerHTML);
我永远无法让 .innerHtml 可靠地工作。我总是这样做:
let els = page.$$('selector');
for (let el of els) {
let content = await (await el.getProperty('textContent')).jsonValue();
}
那么您的文本就在 'content' 变量中。
返回元素的 innerHTML
您可以使用以下方法来return一个元素的innerHTML
:
page.$eval()
const inner_html = await page.$eval('#example', element => element.innerHTML);
page.evaluate()
const inner_html = await page.evaluate(() => document.querySelector('#example').innerHTML);
page.$() / elementHandle.getProperty() / jsHandle.jsonValue()
const element = await page.$('#example');
const element_property = await element.getProperty('innerHTML');
const inner_html = await element_property.jsonValue();
单击具有特定 innerHTML 的元素
您可以使用以下方法根据元素中包含的 innerHTML
单击元素:
page.$$eval()
await page.$$eval('.example', elements => {
const element = elements.find(element => element.innerHTML === '<h1>Hello, world!</h1>');
element.click();
});
page.evaluate()
await page.evaluate(() => {
const elements = [...document.querySelectorAll('.example')];
const element = elements.find(element => element.innerHTML === '<h1>Hello, world!</h1>');
element.click();
});
page.evaluateHandle() / elementHandle.click()
const element = await page.evaluateHandle(() => {
const elements = [...document.querySelectorAll('.example')];
const element = elements.find(element => element.innerHTML === '<h1>Hello, world!</h1>');
return element;
});
await element.click();