Я использую 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