puppeteer js 中的多个 for 循环用于动态下拉抓取

Multiple for loops in puppeteer js for a dynamic drop down scrape

目前我正在抓取一个有多个下拉菜单的网页,每个下拉菜单都依赖于一个父下拉菜单。

我有三个变量,它们给出了每个下拉菜单的长度。

sizeLength, turnaroundLength, quantityLength

sizeLength = 32,turanroundlength = 2,quantityLength = 30

我首先需要将 sizeLength 设置为 1,然后将周转长度设置为 1,然后我需要遍历每个数量长度,总共 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');
    }

}

使用这个方法我得到一个错误:await is only valid in async function。 我不确定如何解决这个问题,因为我是木偶操纵者的新手。任何建议将不胜感激,谢谢!

await operator is used to wait for a Promise, and it can only be used inside an async function.

Puppeteer 函数 page.evaluate() returns a promise, so you must wait for the promise to resolve or 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' );
    }
})();