【问题标题】:How to pass variable into page.on('dialog')?如何将变量传递给 page.on('dialog')?
【发布时间】:2021-10-28 06:38:59
【问题描述】:

如何将其他变量传递给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.js puppeteer


【解决方案1】:

我假设您需要拦截第一个 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');
}

代码尚未经过测试,可能需要稍作改动

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2018-12-28
    • 2011-04-12
    相关资源
    最近更新 更多