【问题标题】:Nightmare.js error: Search failed: Nothing responds to "goto"Nightmare.js 错误:搜索失败:没有响应“goto”
【发布时间】:2016-10-25 22:23:41
【问题描述】:

在 nightmare.js 中包含 vanilla JS 时遇到错误。我想确保我阵列中的每封电子邮件都输入到系统中。 for 循环是理想的,但我不断遇到错误,例如:

Search failed: Nothing responds to "goto"

这是我的代码:

var jquery = require('jquery');
var Nightmare = require('nightmare');
var nightmare = Nightmare({
    show: true,
    dock: true
});

var siteName = "*********";
var username = "*********";
var password = "*********";

var outboundEmailArray = [
  {
    "from_name": "TestOutbound",
    "email_username": "array1",
    "email_domain": "salesforce.com",
    "email_domain": "salesforce.com",
    "reply_to": "testOutbound@salesforce.com"
  },
  {
    "from_name": "Tester",
    "email_username": "array2.0",
    "email_domain": "salesforce.com",
    "email_domain": "salesforce.com",
    "reply_to": "testOutbound@salesforce.com"
  }
];
//
// var outboundEmailSetup = function(outboundEmail){
//     nightmare
//     .goto("https://" + siteName + ".desk.com/login/new")
//     .type("input[id='user_session_email']", username)
//     .type("input[id='user_session_password']", password)
//     .click("#user_session_submit").wait(2000)
//     .goto("https://" + siteName + ".desk.com/admin/settings/mail-servers")
//     .click("#a-add-modal").wait(2000)
//     .type("input[id='postmark_outbound_mailbox_fromname']", outboundEmail.from_name).wait(2000)
//     .type("input[id='email_username']", outboundEmail.email_username).wait(2000)
//     .click("#from_select_4999").wait(2000)
//     .type("input[id='postmark_outbound_mailbox_reply_to']", outboundEmail.reply_to).wait(2000)
//     .click("#postmark_commit").wait(2000)
//     .click(".a-modal-bottom .a-button").wait(2000)
//     .evaluate(function() {})
//     .end()
//     .then(function(result) {
//         console.log(result)
//     })
//     .catch(function(error) {
//         console.error('Search failed:', error);
//     });
//   }

var outboundEmailSetup = function(i){
  if(i < outboundEmailArray.length) {
    nightmare
    .goto("https://" + siteName + ".desk.com/login/new")
    .type("input[id='user_session_email']", username)
    .type("input[id='user_session_password']", password)
    .click("#user_session_submit").wait(2000)
    .goto("https://" + siteName + ".desk.com/admin/settings/mail-servers")
    .click("#a-add-modal").wait(2000)
    .type("input[id='postmark_outbound_mailbox_fromname']", outboundEmailArray[i].from_name).wait(2000)
    .type("input[id='email_username']", outboundEmailArray[i].email_username).wait(2000)
    .click("#from_select_4999").wait(2000)
    .type("input[id='postmark_outbound_mailbox_reply_to']", outboundEmailArray[i].reply_to).wait(2000)
    .click("#postmark_commit").wait(2000)
    .click(".a-modal-bottom .a-button").wait(2000)
    .evaluate(function() {})
    .end()
    .then(function(result) {
        console.log(result)
    })
    .catch(function(error) {
        console.error('Search failed:', error);
    });
    outboundEmailSetup(i+1);
  }
}

outboundEmailSetup(0);

理想情况下,它将遍历 outboundEmailArray,运行函数将电子邮件输入系统,重复直到到达数组的末尾。

【问题讨论】:

  • 当我尝试在同一个噩梦对象上多次调用 evalute/then 方法时,我遇到了类似的错误

标签: javascript loops for-loop nightmare


【解决方案1】:

关键是避免同时多次调用then方法

你会发现关于这个概念的非常详细的解释here

基本上你要做的是确保每次连续调用都发生在上一次调用then方法中

当我们事先知道我们正在处理多少个步骤时,这真的很简单。例如,如果我们要连续调用两次,代码是这样的:

nightmare.goto('http://example.com')
  .title()
  .then(function(title) {
    console.log(title);
    nightmare.goto('http://google.com')
      .title()
      .then(function(title) {
        console.log(title);
      });
  });

注意goto 到 google.com 是如何在 then 回调中的。

由于您正在处理循环,因此您的代码会更复杂一些。

var urls = ['http://example1.com', 'http://example2.com', 'http://example3.com'];
urls.reduce(function(accumulator, url) {
  return accumulator.then(function(results) {
    return nightmare.goto(url)
      .wait('body')
      .title()
      .then(function(result){
        results.push(result);
        return results;
      });
  });
}, Promise.resolve([])).then(function(results){
    console.dir(results);
});

我认为源链接比我能更好地解释这段代码:-)

上面依次执行每个 Nightmare 队列,将结果相加 到一个数组。得到的累加数组被解析为最终的 .then() 调用打印结果的位置。

【讨论】:

  • 拯救了我的一天!!!。谢谢
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2018-04-06
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多