首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Puppeteer:在异步函数中使用await调用的javascript函数内抛出自定义错误消息

Puppeteer:在异步函数中使用await调用的javascript函数内抛出自定义错误消息
EN

Stack Overflow用户
提问于 2018-09-16 00:29:07
回答 1查看 5.9K关注 0票数 2

我正在使用木偶建立一个小应用程序,以自动填写表格在线。我以Gmail为例,在不单击submit按钮的情况下测试其功能。

我打开Gmail URL并使用一个名为findInputFieldByName的函数找到用户名输入字段。代码运行良好,网页打开,我可以看到木偶师在用户名字段中打印test@gmail.com

代码是:

代码语言:javascript
复制
const puppeteer = require('puppeteer');

const gmailUrl='https://accounts.google.com/signin/v2/identifier?continue=https%3A%2F%2Fmail.google.com%2Fmail%2F&service=mail&sacu=1&rip=1&flowName=GlifWebSignIn&flowEntry=ServiceLogin';
const userName='test@gmail.com';
const findInputFieldByName = (page,inputName) => {
    return page.$('input[name="'+inputName+'"]');
}

(async () => {
    try {
    const Browser = await puppeteer.launch({headless:false,
                                        defaultViewport:{width:600,height:800}
                                        });
    const page=await Browser.newPage();

    page.on('load', () => console.log('Page loaded ' + page.url()));
    await page.goto(gmailUrl);

    const userNameElement = await findInputFieldByName(page,'identifier').catch(error => {
       console.log('The following error occurred: ' + error);
       });
    await userNameElement.type(userName,{delay:50});
    } catch(e) {console.log('main program error:' + e);
    }

})();

如您所见,代码在返回的超文本标记语言中查找名称为identifier的输入字段。但是,如果我使用一个不同的名称,比如 identifier1 ,它不在Gmail登录页面上,我希望代码抛出一条自定义的错误消息"Input field name identifier1 not found“,并且代码应该停止。

如果我改变了

代码语言:javascript
复制
const userNameElement = await findInputFieldByName(page,'identifier').catch(error => {
           console.log('The following error occurred: ' + error);
           });

代码语言:javascript
复制
const userNameElement = await findInputFieldByName(page,'identifier1').catch(error => {
           console.log('The following error occurred: ' + error);
           });

我得到以下错误:

主程序错误:类型错误:无法读取null的属性'type‘

我理解这是因为函数findInputFieldByName没有失败。它只是返回了一个空对象,因为没有名为identifier1.的输入字段当尝试键入电子邮件地址时,代码实际上失败了。

然而,我的问题是,如何从findInputFieldByName函数中抛出错误,以便它在const userNameElement = await findInputFieldByName..执行时停止?

我尝试在findInputFiledByName函数中使用promises,如下所示:

代码语言:javascript
复制
const findInputFieldByName = (page,inputName) => {
    let promise=new Promise(function (resolve,reject){
    var elm= page.$('input[name="'+inputName+'"]');
    if (elm.length>0) {
        resolve(elm);
    } else {
        reject(Error('Could not find input name ' + inputName));
    }
});
}

但我得到了以下信息:

主程序错误:类型错误:无法读取未定义(节点:12332)的属性'catch‘UnhandledPromiseRejectionWarning:错误:找不到输入名称identifier1

在C:\Users\test1.js:11:10

在新的Promise (<匿名>)

在findInputFieldByName (C:\Users\test1.js:6:14)

位于C:\Users\test1.js:26:32

在<匿名者>

在process._tickCallback (internal/process/next_tick.js:188:7) (节点:12332) UnhandledPromiseRejectionWarning:未处理的promise rejection。此错误是由于在没有catch块的异步函数内部引发,或拒绝未使用.catch()处理的promise造成的。(拒绝id: 1) (节点:12332) DEP0018 DeprecationWarning:未处理的promise拒绝已弃用。将来,未处理的promise拒绝将使用非零退出代码终止Node.js进程。

我应该如何处理自定义错误?我是Javascript的新手,对任何帮助我都非常感激。enter code here

EN

回答 1

Stack Overflow用户

发布于 2018-09-16 00:39:56

首先,返回promise,而不是将其赋值给变量。

代码语言:javascript
复制
const findInputFieldByName = (page, inputName) => {
  return new Promise(((resolve, reject) => { // <-- Return it

在此之后,如果需要,您可以throw error。

代码语言:javascript
复制
await findInputFieldByName(page,'identifier').catch(error => {
    throw ('The following error occurred: ' + error) // <-- pass the error to main program
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52346651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档