Получение значения селектора в Puppeteer

В конкретном случае мне нужно получить доступ к ряду флажков, используя Puppeteer. Каждый флажок имеет одинаковый id а также name, но разные значения для 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 ответ

Решение

boxArray не определен.

$$eval побежит Array.from(document.querySelectorAll("input")) и передать его на страницу Function. Он не создает цикл для получения значения каждой функции. https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pageevalselector-pagefunction-args

Используйте цикл for... для получения значения вместо $$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);
}
Другие вопросы по тегам