Puppeteer: Создание пользовательского сообщения об ошибке в функции JavaScript, вызываемой с использованием await в асинхронной функции - PullRequest
0 голосов
/ 15 сентября 2018

Я использую puppeteer для создания небольшого приложения для автоматического заполнения форм онлайн.Я использую Gmail в качестве примера для проверки функциональности, не нажимая кнопку отправки.

Я открываю URL-адрес Gmail и нахожу поле ввода имени пользователя с помощью функции findInputFieldByName.Код работает нормально, веб-страница открывается, и я вижу, как кукловод печатает test@gmail.com в поле имени пользователя.

Код:

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 в возвращенном HTML.Однако, если бы я использовал другое имя, такое как identifier1 , которого нет на странице входа в Gmail, я хочу, чтобы код выдавал пользовательское сообщение об ошибке « Имя поля вводаидентификатор1 не найден "и код должен остановиться.

Если я изменю

const userNameElement = await findInputFieldByName(page,'identifier').catch(error => {
           console.log('The following error occurred: ' + error);
           });

на

const userNameElement = await findInputFieldByName(page,'identifier1').catch(error => {
           console.log('The following error occurred: ' + error);
           });

, я получаю следующую ошибку:

ошибка основной программы: Ошибка типа: Не удается прочитать свойство 'type' со значением NULL

Я понимаю, что это потому, что функция findInputFieldByName не завершилась сбоем.Он просто возвратил нулевой объект, потому что нет поля ввода с именем identifier1 .Код фактически не выполнялся, когда он пытался ввести адрес электронной почты.

Однако мой вопрос заключается в том, как я могу выдать ошибку из функции findInputFieldByName, чтобы она остановила выполнение const userNameElement = await findInputFieldByName..?

Я пытался использовать обещания в функции findInputFiledByName как:

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));
    }
});
}

, но получаю следующее сообщение:

ошибка основной программы: TypeError: Не удается прочитать свойство 'catch' из неопределенного (узел: 12332). UnhandledPromiseRejectionWarning: Ошибка: Не удалось найти идентификатор входного имени1

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

вновое обещание (<аноним>)

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

в C: \ Users \ test1.js: 26: 32

в <анонимный>

в process._tickCallback (внутренний / process / next_tick.js: 188: 7) (узел: 12332) UnhandledPromiseRejectionWarning: необработанное отклонение обещания.Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch ().(id отклонения: 1) (узел: 12332) [DEP0018] DeprecationWarning: Отклонения необработанного обещания устарели.В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

Как мне обрабатывать пользовательские ошибки?Я новичок в Javascript, любая помощь очень ценится. enter code here

1 Ответ

0 голосов
/ 15 сентября 2018

Прежде всего, верните обещание вместо присвоения его переменной.

const findInputFieldByName = (page, inputName) => {
  return new Promise(((resolve, reject) => { // <-- Return it

После этого вы можете throw выдать ошибку при необходимости.

await findInputFieldByName(page,'identifier').catch(error => {
    throw ('The following error occurred: ' + error) // <-- pass the error to main program
});
...