为什么我得到Promise {Pending}?

时间:2020-07-19 23:49:47

标签: javascript puppeteer

我正在使用puppeteer使用Javascript进行网络抓取,每当我尝试记录元素的文本内容时,它都会显示“ Promise {Pending}”。我看了其他答案,但都没有用

const element = await page.$("#ctl00_ContentPlaceHolder1_NameLinkButton");

const text = await page.evaluate(element => element.textContent, element);

console.log(text);

1 个答案:

答案 0 :(得分:0)

您的答案是正确的。但我认为您忘记在await之前添加page.evaluate()


有三种方法可以实现。

  • 第一种方式。就像你在做什么。但我不喜欢它,因为 您无需致电page.evaluate()即可获得.textContent
const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
    const elementId = 'container';

    const page = await browser.newPage();
    await page.goto('https://metwally.me');

    const element = await page.$(`#${elementId}`);

    if (element) {
        const text = await page.evaluate(element => element.textContent, element);
        console.log(text);
    } else {
        // handle not exists id
        console.log('Not Found');
    }
});



  • 第二种方式。您将调用page.evaluate()并使用JavaScript Dom获取textContent。像document.getElementById(elementId).textContent
const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
    const elementId = 'container';

    const page = await browser.newPage();
    await page.goto('https://metwally.me');

    const text = await page.evaluate(
        elementId => {
            const element = document.getElementById(elementId);
            return element ? element.textContent : null;
        }, elementId);

    if (text !== null) {
        console.log(text);
    } else {
        // handle not exists id
        console.log('Not Found');
    }
});


  • 第三种方式。您将通过操纵符选择器选择元素,然后使用textContent获取await element.getProperty('textContent')属性,然后从textContent._remoteObject.value获取值。
const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
    const elementId = 'container';

    const page = await browser.newPage();
    await page.goto('https://metwally.me');

    const element = await page.$(`#${elementId}`);

    if (element) {
        const textContent = await element.getProperty('textContent');
        const text = textContent._remoteObject.value;
        console.log(text);
    } else {
        // handle not exists id
        console.log('Not Found');
    }
});


注意:所有这些示例在我的机器上都能正常工作。

os ubuntu 20.04
nodejs v10.19.0
puppeteer v1.19.0

参考