Кукловод: создание пользовательского сообщения об ошибке в функции javascript, вызываемой с использованием ожидания в асинхронной функции

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

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

Код такой:

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='[email protected]';
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.info('Page loaded ' + page.url()));
    await page.goto(gmailUrl);

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

})();

Как видите, код ищет поле ввода с именем identifier в возвращенном HTML. Однако, если бы я использовал другое имя, например идентификатор1, которого нет на странице входа в Gmail, я хочу, чтобы код выдавал настраиваемое сообщение об ошибке «Идентификатор имени поля ввода1 не найден», и код должен был остановиться.

Если я изменю

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

к

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

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

main program error:TypeError: Cannot read property 'type' of null

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

Однако у меня вопрос: как я могу выдать ошибку из функции 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));
    }
});
}

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

main program error:TypeError: Cannot read property 'catch' of undefined (node:12332) UnhandledPromiseRejectionWarning: Error: Could not find input name identifier1

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

at new Promise (< anonymous >)

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

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

at < anonymous >

at process._tickCallback (internal/process/next_tick.js:188:7) (node:12332) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:12332) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
5 355
1

Ответы 1

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

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

Другие вопросы по теме