从 puppeteer page.evaluate() 返回值

sin*_*015 1 javascript node.js puppeteer

所以,我有一个返回page下一个函数所需的函数:

async function browser(){
        const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox'], headless: false, devtools : true});
        const incog = await browser.createIncognitoBrowserContext();
        const page = await incog.newPage();

            await page.goto('web')
            .then(function(){
       page.evaluate(function(){
            $(document).ready(function(){
                $('input[name ="username"]').val("a");
                $('input[name ="password"]').val("b");
                $(document).ready(function(){
                    $('#loginbtn').click();
                });
            });
        });
      });

      await page.waitForNavigation({waitUntil : 'load'});
      return page;
Run Code Online (Sandbox Code Playgroud)

因此,我browser()通过 browser().then(result => nextFunction(result) 最终将页面传递到nextFunction()


async function nextFunction(page){
    await page.goto('web')
       .then(function(){
        var msg = "Test : \n\n";
        page.evaluate(function(){
            var num = 1;
            $('.card').each(function(i, e){
                msg += "======= Activity "+num+" ========\n";
                msg += "Subject : " + $(this).find('.name').text() + "\n";
                msg += "Due : " + $(this).find('.date').text() + "\n";
                msg += "===== End Activity "+num+" ======\n\n";
                num++;
            });
        });
        console.log(msg);
       });
}

Run Code Online (Sandbox Code Playgroud)

我尝试msg从打印nextFunction(),但它只打印Test:

我想要实现的是:msg从返回值获取结果或分配变量nextFunction()

有没有解决方案或更好的方法来做到这一点?

mbi*_*bit 7

  1. 为了获得更清晰的代码和更轻松的故障排除,请选择一个通道,async/await 或使用then. 两者同时使用会使代码难以阅读。async/await 更具可读性,错误处理也更简单。在这里阅读更多内容
  2. 要查看console.logevaluate请监听 'console' 事件:
const page = await browser.newPage();
page.on('console', msg => console.log(msg.text()));
Run Code Online (Sandbox Code Playgroud)
  1. page.evaluatecontext 与 Puppeteer 是分开的,因此评估msg将是undefined. 移动 进行msg评估,然后将结果返回给 puppeteer。
let msg = await page.evaluate(function(){
   let msg = "Test : \n\n";
   let num = 1;
   $('.card').each(function(i, e){
      msg += "======= Activity "+num+" ========\n";
      msg += "Subject : " + $(this).find('.name').text() + "\n";
      msg += "Due : " + $(this).find('.date').text() + "\n";
      msg += "===== End Activity "+num+" ======\n\n";
      num++;
   });
   return msg;
});
Run Code Online (Sandbox Code Playgroud)