puppeteer js中的多个for循环可动态下拉

时间:2018-09-25 18:22:22

标签: javascript puppeteer

当前,我正在抓取具有多个下拉菜单的网页,每个下拉菜单均取决于父下拉菜单。

我有三个变量,每个变量的长度都给我。

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的新手。任何建议,将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

await运算符用于等待Promise,并且它只能在 async function内部使用。

Puppeteer函数page.evaluate()返回一个诺言,因此您必须等待对resolvereject的诺言,然后才能继续循环的下一个迭代。

因此,必须将代码包装在异步函数中,代码才能正常工作。

另外,在编写循环时,由于计数器没有传递给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' );
    }
})();