在 Puppeteer 中获取选择器的值
Getting a Selector's value in 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()
应该用页面上每个复选框的值填充一个数组。
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);
}
在特定情况下,我需要使用 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()
应该用页面上每个复选框的值填充一个数组。
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);
}