node.js - 如何在Node.js中处理同步浏览器仿真

标签 node.js browser emulation nightmare

我正在编写一个脚本,该脚本旨在从.txt文件中加载某些内容,然后执行多个(循环)对具有node.js浏览器模拟器 Nightmare 的网站的请求。

我没有从txt文件中读取文件的问题,因此没有问题,但是设法使它运行同步并且没有异常(exception)。

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”

所以有几个问题:

1)如何解决异常

2)如何使它实际上每次在地址下都保持同步并仿真(如上次尝试(我没有保存),我修复了该异常,但实际上并未打开浏览器并且基本上已跳过了该浏览器

3)(不是很重要)是否可以选择一些对象
.wait('.class1,.class2,.validation-error')

并将每个值保存在不同的变量中,或者只是从出现的第一个变量中获取文本? (如果这些都没有发生,那么例如返回0)

最佳答案

我发现上面的代码有一些问题。

  • visitPage函数中,您将返回一个Promise。很好,除非您不必创建包装 promise ! Nightmare 似乎为您带来了希望。今天,您正在丢弃一个错误,该错误会通过包装来保证返回。相反-只需使用异步功能!
  • 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”中。只要兑现 promise :)
  • 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);
    

    我不确定这是否对您的特定问题有所帮助,但希望它能使您走上正确的道路:)

    关于node.js - 如何在Node.js中处理同步浏览器仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54472918/

    相关文章:

    Webview 中的 Android 2.3 希伯来语字体

    jquery - 如何在浏览器的任意页面上直接运行jQuery?

    javascript - 多线程的 node.js 版本?

    javascript - 如何让nock.js回复发布的数据?

    javascript - 使用 sinon 进行 Node 、单元测试和模拟

    javascript - 您可以使用 JavaScript 检测用户是否关闭了浏览器选项卡吗?关闭浏览器?或者离开了浏览器?

    ruby-on-rails - rails : Prevent duplicate inserts due to pressing back button and save again

    linux - 我想在没有硬件的情况下运行基于 Linux 的设备应用程序

    c - 将 Linux 设备驱动程序与虚拟 PCI 设备连接

    node.js - npm package.json 和 docker(安装它...)