首页 > 解决方案 > 如何将变量传递给 page.on('dialog')?

问题描述

如何将其他变量传递给page.on('dialog')函数?

如何从函数中获得回报?

page.on('dialog', async (dialog) => {
  console('get additional variables:', param) // get additional variables
  if (dialog.message() === param) {
    res.isSuccess = true;
    await dialog.accept();
  }
  else {
    res.isSuccess = false;
    await dialog.accept();
  }
}, p);

console('get return:', res) // Need to get res.isSuccess

标签: node.jspuppeteer

解决方案


我假设您需要拦截第一个dialog事件。否则isSuccess失去任何逻辑意义。拦截需要以同步方式执行以允许测试逻辑。

在您的情况下,Promise 是一个很好的解决方案。

选项 1 - 包装承诺和测试

function dialog(inputValue) {
    return new Promise((resolve, reject) => {
        page.once('dialog', async dialog => {
            console.log('additional', inputValue);
            if (dialog.message() === inputValue) {
                await dialog.accept();
                resolve();
            } else {
                await dialog.accept();
                reject();
            }
        });
    })
}

然后在您的代码中,您可以像这样使用它:

try {
    await dialog('Some message');
    console.log('OK');
} catch (e) {
    console.log('ERROR');
}

选项 2 - 创建承诺

创建一个拦截第一个对话框并返回它的承诺包装器:

function firstDialog() {
    return new Promise(resolve => {
        page.once('dialog', async dialog => {
            await dialog.accept();
            resolve(dialog);
        });
    })
}

然后在您的代码中简单地测试您需要的任何内容:

const dialog = await firstDialog();
if (dialog.message() === 'Some message') {
    console.log('OK');
} else {
    console.log('ERROR');
}

代码尚未经过测试,可能需要进行细微更改


推荐阅读