2017-02-09 78 views
0

我使用Nightmarejs来取消网站。我想链接多个操作(承诺?)取决于一些输入。看看下面的代码:如何链接节点js上的可变数量的方法?

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

nightmare 
    .goto('https://www.servipag.com/') 
    .select('select#servicios.txt_formulario', '29') 
    .wait(200) 
    .select('select#billers', '700') 
    .insert('input#identificador','60957924') 
    .click('#formPagoCuentas a[href^="javascript:AgregarCuentasaPagar"]') 
    .wait(10) 
    .click('#formPagoCuentas a[href^="javascript:enviar"]') 
    .wait('fieldset') 
    .evaluate(function() { 
    return document.querySelector('.txt_detalle_boleta').innerHTML; 
    }) 
    .end() 
    .then(function (result) { 
    console.log(result); 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 

我希望能够附加的时间(从1到15)如下的变量数量:

.select('select#servicios.txt_formulario', '29') 
    .wait(200) 
    .select('select#billers', '700') 
    .insert('input#identificador','60957924') 
    .click('#formPagoCuentas a[href^="javascript:AgregarCuentasaPagar"]') 
    .wait(10) 

所以四倍整体代码将是:

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

nightmare 
    .goto('https://www.servipag.com/') 
    // -- repeat this 4 times 
    .select('select#servicios.txt_formulario', '29') 
    .wait(200) 
    .select('select#billers', '700') 
    .insert('input#identificador','60957924') 
    .click('#formPagoCuentas a[href^="javascript:AgregarCuentasaPagar"]') 
    .wait(10) 
    // --- 
    .select('select#servicios.txt_formulario', '29') 
    .wait(200) 
    .select('select#billers', '700') 
    .insert('input#identificador','60957924') 
    .click('#formPagoCuentas a[href^="javascript:AgregarCuentasaPagar"]') 
    .wait(10) 
    // --- 
    .select('select#servicios.txt_formulario', '29') 
    .wait(200) 
    .select('select#billers', '700') 
    .insert('input#identificador','60957924') 
    .click('#formPagoCuentas a[href^="javascript:AgregarCuentasaPagar"]') 
    .wait(10) 
    // --- 
    .select('select#servicios.txt_formulario', '29') 
    .wait(200) 
    .select('select#billers', '700') 
    .insert('input#identificador','60957924') 
    .click('#formPagoCuentas a[href^="javascript:AgregarCuentasaPagar"]') 
    .wait(10) 
    // -- end 
    .click('#formPagoCuentas a[href^="javascript:enviar"]') 
    .wait('fieldset') 
    .evaluate(function() { 
    return document.querySelector('.txt_detalle_boleta').innerHTML; 
    }) 
    .end() 
    .then(function (result) { 
    console.log(result); 
    }) 
    .catch(function (error) { 
    console.error('Search failed:', error); 
    }); 

我该怎么办?

回答

1

我对噩梦一无所知,但它看起来像所有东西都排队,直到 你叫尽头,它只是为了链接返回自己。所以这应该工作

var operations = nightmare.goto('https://www.servipag.com/'); 

    for(var i = 0; i < 4; i++) { 
    operations = operations 
     .select('select#servicios.txt_formulario', '29') 
     .wait(200) 
     .select('select#billers', '700') 
     .insert('input#identificador','60957924') 
     .click('#formPagoCuentas a[href^="javascript:AgregarCuentasaPagar"]') 
     .wait(10); 
    } 

    operations 
    .click('#formPagoCuentas a[href^="javascript:enviar"]') 
    .wait('fieldset') 
    .evaluate(function() { 
     return document.querySelector('.txt_detalle_boleta').innerHTML; 
    }) 
    .end() 
    .then(function (result) { 
     console.log(result); 
    }) 
    .catch(function (error) { 
     console.error('Search failed:', error); 
    }); 
0

你可以使用reduce保持环比持续:

Array(4).fill().reduce(acc => 
    acc.select('select#servicios.txt_formulario', '29') 
     .wait(200) 
     .select('select#billers', '700') 
     .insert('input#identificador','60957924') 
     .click('#formPagoCuentas a[href^="javascript:AgregarCuentasaPagar"]') 
     .wait(10), 
    nightmare.goto('https://www.servipag.com/')) 
    .click('#formPagoCuentas a[href^="javascript:enviar"]') 
    .wait('fieldset') 
    .evaluate(_ => document.querySelector('.txt_detalle_boleta').innerHTML) 
    .end() 
    .then(result => console.log(result)) 
    .catch(error => console.error('Search failed:', error)); 

注意,第二个参数reduce提供初始值的“循环”之前,所以这就是nightmare.goto ...去。