javascript - Puppeteer 按他的班级名称选择一个段落
问题描述
我想选择 ap 这是唯一一个有类名的。但是为什么javascript代码不起作用?
注意:我不能做elements[i].className =="test",因为每次我重新打开网站时类名都会改变。
当我在控制台中运行它时,我得到:
undefined
undefined
undefined
const puppeteer = require('puppeteer');
async function test() {
const browser = await puppeteer.launch({ headless: false, timeout: 0};
const page2 = await browser.newPage();
await page2.goto("localhost");
await page2.waitFor(2530);
const elements = await page2.evaluate(() => [...document.querySelectorAll('p')]);
for (var i = 0; i < elements.length; i++) {
if(elements[i].className){
console.log(elements[i].innerText);
}
}
}
test();
<p>text1</p>
<p class="test">text2</p>
<p>text3</p>
解决方案
const puppeteer = require('puppeteer');
async function test() {
const browser = await puppeteer.launch({ headless: false, timeout: 0};
const page2 = await browser.newPage();
await page2.goto("localhost");
await page2.waitFor(2530);
const elements = await page2.evaluate(() => [...document.querySelectorAll('p')]);
for (var i = 0; i < elements.length; i++) {
if(elements[i].className){
console.log(elements[i].innerText[]);
}
}
}
test();
更改此行
console.log(elements[i].innerText[]);
至
console.log(elements[i].innerText);
并使用它从评估中返回一个段落数组
const textsArray = await page2.evaluate(
() => [...document.querySelectorAll('p')].map(elem => elem.innerText)
);
这将返回段落标签中所有文本的数组,否则您可以操作 map 以返回数组内的对象及其类名,如果您想要两者
像这样
const textsArray = await page2.evaluate(() =>
[...document.querySelectorAll('p')].map(elem =>
{ return {class: elem.className, text:elem.innerText}
)
);
推荐阅读
- scala - 使用 Source.fromUrl 的有效 url 出错
- ios - 应用程序执行屏幕旋转过渡时如何避免黑色背景区域?
- cmake - 如何让 CMake 将我的测试程序链接到 netCDF 库?
- nuxt.js - 如何使用 vee-validate 本地化 Nuxt 的表单验证错误消息
- android - angular js 2.17 版的所有 mobiscroll 组件在 Android 10 上停止工作
- python - 如何使用 tensorflow 进行文本分类?
- php - 使用水印 codeigniter 加载字体时出错
- java - PostgreSQL 上的 FlywaySqlException:无法创建 PoolableConnectionFactory(错误:由于用户请求而取消语句
- javascript - Javascript addEventListener 在 Laravel 中无法与 querySelector 一起使用
- tsql - 获取正在运行的工作站客户端应用程序的 FQDN