2016-10-25 2 views
1

Je cours une erreur, en incluant vanilla JS dans nightmare.js. Je veux m'assurer que chaque email de mon tableau est entré dans le système. Une boucle serait idéal, mais je l'ai courir sans cesse en erreur telles que:Erreur Nightmare.js: La recherche a échoué: Rien ne répond à "goto"

Search failed: Nothing responds to "goto" 

Voici mon code:

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": "[email protected]" 
    }, 
    { 
    "from_name": "Tester", 
    "email_username": "array2.0", 
    "email_domain": "salesforce.com", 
    "email_domain": "salesforce.com", 
    "reply_to": "[email protected]" 
    } 
]; 
// 
// 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); 

Idéalement, il serait boucle à travers le outboundEmailArray, exécutez la fonction à l'entrée les e-mails dans le système, répétez jusqu'à ce qu'il ait atteint la fin du tableau.

+0

Je reçois une erreur semblable quand je tente d'appeler evalute/puis des méthodes plus d'une fois sur le même cauchemar objet –

Répondre

3

La clé est d'éviter de multiples appels à la méthode then simultanément

Vous trouverez une explication très détaillée sur ce concept here.

Fondamentalement, ce que vous avez à faire est de vous assurer que chaque lieu de prendre des appels consécutifs à l'intérieur de l'appel précédent then méthode

Ceci est vraiment simple quand on sait à l'avance combien de mesures que nous traitons. Par exemple, si nous voulons faire deux appels consécutifs, le code serait comme ceci:

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

Remarquez que la goto à google.com est à l'intérieur du rappel then.

Puisque vous avez affaire à une boucle, votre code serait un peu plus sophistiqué.

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); 
}); 

Je pense que le lien source explique ce code mieux que moi :-)

The above executes each Nightmare queue in series, adding the results to an array. The resulting accumulated array is resolved to the final .then() call where the results are printed.