Я использую кукловод, чтобы создать небольшое приложение для автоматического заполнения онлайн-форм. Я использую 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, и я очень благодарен за любую помощь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Прежде всего, верните обещание, а не присваивайте его переменной.
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
});