【发布时间】:2021-11-12 17:30:48
【问题描述】:
我是 js 新手,一直在尝试获取 bio__name__display 标记的内部文本(请参阅附加的 DOM),但我失败了。
这可能是什么问题?
我从 index.js 调用 page.js 中定义的异步函数,当我 console.log 第一个函数的返回值时,它工作正常。但是第二个函数不起作用(输出为undefined)。
对于 CSS 选择器,我尝试了以下但无济于事。
div.bio__name > span.bio__name__display"div.bio__name>span.bio__name__display"div.bio__name span.bio__name__display
index.js
const splinterlandsPage= require('./page');
.
.
.
await page.waitForTimeout(10000);
let [mana, displayName] = await Promise.all([
splinterlandsPage.checkMatchMana(page).then((mana) => mana).catch(() => 'no mana'),
splinterlandsPage.getText(page).then((displayName) => displayName).catch(() => 'displayName name not caught')
]);
console.log("mana : ", mana) //works
console.log("displayName: ", displayName); //does not work
.
.
.
page.js
.
.
.
// first function
async function checkMatchMana(page) {
const mana = await page.$$eval("div.col-md-12 > div.mana-cap__icon", el => el.map(x => x.getAttribute("data-original-title")));
const manaValue = parseInt(mana[0].split(':')[1], 10);
return manaValue;
}
// second function
async function getText(page) {
const displayName= await page.$$eval("div.bio__name > span.bio__name__display", el => el.innerText);
return displayName
}
.
.
.
exports.checkMatchMana = checkMatchMana;
exports.getText= getText;
DOM
【问题讨论】:
-
请链接到实际站点。在制作
$$eval之前,您是否在使用waitForSelector?实际站点动态地操纵元素,因此如果手头没有实际的、可重现的行为,就无法提供帮助。控制台屏幕截图显示选择器可以工作,但是当 Puppeteer 运行时页面可能不会处于相同的状态。有可能元素不存在或隐藏在框架或阴影 DOM 中——这是任何人的猜测。
标签: javascript html css-selectors puppeteer