当前,我正在抓取具有多个下拉菜单的网页,每个下拉菜单均取决于父下拉菜单。
我有三个变量,每个变量的长度都给我。
sizeLength, turnaroundLength, quantityLength
sizeLength = 32,turanroundlength = 2,quantityLength = 30
我首先需要将sizeLength设置为1,然后在将周转长度设置为1之后,然后我需要遍历每个数量Length(总共为30)。
为此,我做了一些嵌套的for循环:
for (let i = 1; i <= sizeLength; i++) {
await page.evaluate( () => {
document.querySelector( '#size > option:nth-child('+i+')' ).selected = true} );
for (let x = 1; x <= turnaroundLength; x++) {
await page.evaluate( () => {
document.querySelector( '#turnaround > option:nth-child('+x+')' ).selected = true} );
}
for (let y = 1; y <= quantityLength; y++) {
await page.evaluate( () => {
document.querySelector( '#quantity > option:nth-child('+y+')' ).selected = true} );
}
console.log('this is in quantity');
}
}
使用此方法,我收到一个错误:等待仅在异步函数中有效。 我不知道如何解决这个问题,因为我是puppeteer的新手。任何建议,将不胜感激,谢谢!
答案 0 :(得分:0)
await
运算符用于等待Promise
,并且它只能在 async function
内部使用。
Puppeteer函数page.evaluate()
返回一个诺言,因此您必须等待对resolve
或reject
的诺言,然后才能继续循环的下一个迭代。
因此,必须将代码包装在异步函数中,代码才能正常工作。
另外,在编写循环时,由于计数器没有传递给page.evaluate()
,因此您将无法实现预期的行为。
您的代码应该看起来像这样:
( async () =>
{
const sizeLength = 32;
const turanroundlength = 2;
const quantityLength = 30;
for ( let i = 1; i <= sizeLength; i++ )
{
await page.evaluate( i =>
{
document.querySelector( '#size > option:nth-child(' + i + ')' ).selected = true;
}, i );
for ( let x = 1; x <= turnaroundLength; x++ )
{
await page.evaluate( x =>
{
document.querySelector( '#turnaround > option:nth-child(' + x + ')' ).selected = true;
}, x );
}
for ( let y = 1; y <= quantityLength; y++ )
{
await page.evaluate( y =>
{
document.querySelector( '#quantity > option:nth-child(' + y + ')' ).selected = true;
}, y );
}
console.log( 'this is in quantity' );
}
})();