index for array javascript loops for-loop nightmare

javascript - for - list js



Error de Nightmare.js: Error de búsqueda: nada responde a "goto" (1)

Me aparece un error al incluir vanilla JS en nightmare.js. Quiero asegurarme de que cada correo electrónico de mi matriz se ingrese en el sistema. Un bucle for sería ideal, pero continuamente me encontré con un error como:

Search failed: Nothing responds to "goto"

Aquí está mi código:

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

Lo ideal sería que recorra el OutboundEmailArray, ejecute la función para ingresar los correos electrónicos en el sistema, repita hasta que haya llegado al final de la matriz.


La clave es evitar llamadas múltiples al método then mismo tiempo

Aquí encontrará una explicación muy detallada sobre ese concepto.

Básicamente, lo que tienes que hacer es asegurarte de que cada llamada consecutiva se realice dentro de la llamada anterior y then método

Esto es muy sencillo cuando sabemos de antemano con cuántos pasos estamos tratando. Por ejemplo, si queremos hacer dos llamadas consecutivas, el código sería así:

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

Observe cómo el goto a google.com está dentro de la devolución de llamada.

Como se trata de un bucle, su código sería un poco más sofisticado.

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

Creo que el enlace de origen explica este código mejor que yo :-)

Lo anterior ejecuta cada cola de Pesadilla en serie, agregando los resultados a una matriz. La matriz acumulada resultante se resuelve en la llamada final .then () donde se imprimen los resultados.