Как обработать синхронизацию браузерной эмуляции в node.js - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу сценарий, который предназначен для загрузки некоторых вещей из файлов .txt, а затем выполнения нескольких (в цикле) запросов на веб-сайт с кошмарным эмулятором браузера node.js.

У меня естьнет проблем с чтением из текстовых файлов и т. д. нет, но удается заставить его работать синхронно и без исключений.

function visitPage(url, code) {
new Promise((resolve, reject) => {
    Nightmare
      .goto(url)
      .click('.vote')
              .insert('input[name=username]', 'testadmin')
              .insert('.test-code-verify', code)
      .click('.button.vote.submit')
      .wait('.tag.vote.disabled,.validation-error')
      .evaluate(() => document.querySelector('.validation -error').innerHTML)
      .end()
      .then(text => {
          return text;
      })
});
}


async function myBackEndLogic() {
try {
    var br = 0, user, proxy, current, agent;


    while(br < loops){

        current = Math.floor(Math.random() * (maxLoops-br-1));

        /*...getting user and so on..*/




        const response = await visitPage('https://example.com/admin/login',"code")

        br++;
    }


} catch (error) {
    console.error('ERROR:');
    console.error(error);
}
}

myBackEndLogic();

Возникает ошибка: UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство 'webContents' из undefined

Итак, вопросов несколько:

1) Как исправить исключение

2) Как заставить его работать на самом деле, синхронизировать и эмулировать каждый раз адрес (как вВ предыдущей попытке, которую я не сохранил, я исправил исключение, но браузер фактически не открывался, и он был в основном пропущен

3) (Не так важно) Можно ли выбрать несколько объектов с помощью

.wait('.class1,.class2,.validation-error')

и сохранить каждое значение в разных переменных или просто получить текст из первого произошедшего?(если ничего из этого не произошло, например, вернуть 0)

1 Ответ

0 голосов
/ 01 февраля 2019

Я вижу несколько проблем с кодом выше.

  1. В функции visitPage вы возвращаете обещание.Это хорошо, за исключением того, что вам не нужно создавать обещание упаковки!Похоже, кошмар возвращает вам обещание.Сегодня вы отбрасываете ошибки, которые обещают возврат, оборачивая их.Вместо этого - просто используйте асинхронную функцию!
async function visitPage(url, code) {
  return Nightmare
      .goto(url)
      .click('.vote')
              .insert('input[name=username]', 'testadmin')
              .insert('.test-code-verify', code)
      .click('.button.vote.submit')
      .wait('.tag.vote.disabled,.validation-error')
      .evaluate(() => document.querySelector('.validation -error').innerHTML)
      .end();
}
Вы, вероятно, не хотите заключать содержимое этого метода в "try / catch".Просто позвольте обещаниям течь:)
async function myBackEndLogic() {
  var br = 0, user, proxy, current, agent;
  while(br < loops){
    current = Math.floor(Math.random() * (maxLoops-br-1));
    const response = await visitPage('https://example.com/admin/login',"code")
    br++;
  }
}
Когда вы запускаете свой метод - обязательно включите улов!Или тогда!В противном случае ваше приложение может выйти рано.
myBackEndLogic()
  .then(() => console.log('donesies!'))
  .catch(console.error);

Я не уверен, поможет ли что-нибудь из этого с вашей конкретной проблемой, но, надеюсь, он выведет вас на правильный путь :)

...