在Puppeteer中获取选择器的值

时间:2018-10-19 20:34:56

标签: javascript node.js puppeteer

在特定情况下,我需要使用Puppeteer访问一系列复选框。每个复选框具有相同的idname,但value的值不同。我想获取每个选择器的值,然后使用它来单击与要扫描的文本选择器匹配的复选框。这是代码段:

await page.waitForSelector("input[type='checkbox']");
let boxArray = await page.$$eval("input[type='checkbox']", el => el.value);
const boxes = (await page.$$("input[type='checkbox']")).length;
for(var box=2;box<boxes+1;box++)
{
    await page.waitForSelector("this is inconsequential");
    const title = await page.$eval("this is inconsequential", el => el.innerText);
    if(title.includes("string I'm searching for"))
    {
        console.log('Clicking group check box: %s', title);
        console.log('Value: %s', boxArray[box]);
        await page.waitForSelector("input[value='"+boxArray[box]+"']");
        // the rest doesn't matter
     }
}

代码到达console.log('Value: %s', boxArray[box])后,就会出现此错误:

Value: undefined
TypeError: Cannot read property '5' of undefined

我不知道为什么boxArray未定义,因为page.$$eval()应该用页面上每个复选框的值填充数组。

1 个答案:

答案 0 :(得分:0)

boxArray未定义。

$$eval将运行Array.from(document.querySelectorAll("input"))并将其传递给pageFunction。它不会创建一个循环来获取每个函数的值。 https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevalselector-pagefunction-args

使用for ... of循环获取值,而不是$$ eval。考虑以下示例:

const inputsValues = [];
const inputElements = await page.$$('input');

for (const element of inputElements) {
        let inputValue;

        inputValue = await element.getProperty('checked');
        inputValue = await inputValue.jsonValue();

    inputsValues.push(inputValue);
}