Nodejs噩梦迭代

时间:2018-10-09 20:24:21

标签: javascript node.js nightmare

我有这个代码块,

java.sql.*

我想迭代部分代码,

var click_data = ['.click-fgdfc', '.click-f55gc', '.click-dfgc', '.click-fg45c', '.click-fg34c'];

nightmare

  .goto(site)
  .click('#cookieUsagePopIn .closeBtn')
  .wait(1000)
  .click('[for=acceptContract]')
  .click('#submitButton')
  .wait('.myAccount')
  .goto(site)
  .wait(1000)
  .click(click_data[0])
  .wait(1000)
  .click('.logoutBtn')
  .wait('.btnSignUp')

  .end()
  .catch(error => {
    console.error('error: ', error)
  });

因为我应该使用诸如 .goto(site) .click('#cookieUsagePopIn .closeBtn') .wait(1000) .click('[for=acceptContract]') .click('#submitButton') .wait('.myAccount') .goto(site) .wait(1000) .click(click_data[0]) .wait(1000) .click('.logoutBtn') .wait('.btnSignUp') 之类的click_data数组(也许可以像click_data[0], click_data[1]这样使用计数器)。

而且,当存在click_data [20]时,它应该停止。

4 个答案:

答案 0 :(得分:1)

那些是可链接的。它是一个调用的返回值,用作后续调用的对象。因此,您可以将a.b().c().d()重构为p=a.b(); p=p.c(); p=p.d();,因此,如果您想循环c() 5次以模拟a.b().c().c().c().c().c().d()

执行此操作:

var p = a.b();
for (let i = 0; i < 5; ++i) {
  p = p.c();
}
p = p.d();

答案 1 :(得分:0)

您可以执行以下操作:

var click_data = ['.click-fgdfc', '.click-f55gc', '.click-dfgc', '.click-fg45c', '.click-fg34c'];

const x = nightmare
  .goto(site)
  .click('#cookieUsagePopIn .closeBtn')
  .wait(1000)
  .click('[for=acceptContract]')
  .click('#submitButton')
  .wait('.myAccount')

for (let i=0; i<click_data.length; i++) { 
  x = x
    .goto(site)
    .wait(1000)
    .click(click_data[0])
    .wait(1000)
    .click('.logoutBtn')
    .wait('.btnSignUp');
}

x.end()

并根据需要附加.catch()。

答案 2 :(得分:0)

我相信您正在尝试做这样的事情。

var click_data = ['.click-fgdfc', '.click-f55gc', '.click-dfgc', '.click-fg45c', '.click-fg34c'];
click_data.map(data => {

nightmare

  .goto(site)
  .click('#cookieUsagePopIn .closeBtn')
  .wait(1000)
  .click('[for=acceptContract]')
  .click('#submitButton')
  .wait('.myAccount')
  .goto(site)
  .wait(1000)
  .click(data)
  .wait(1000)
  .click('.logoutBtn')
  .wait('.btnSignUp')

  .end()
  .catch(error => {
    console.error('error: ', error)
  });
});

答案 3 :(得分:0)

类似的事情应该起作用。您需要对代码进行一些调整。

// index.js

const Nightmare = require('nightmare');

const nightmare = Nightmare({ show: true });
const clickData = ['#doc-info', '#cst'];

clickData.reduce((accumulator, selector) => {
    return accumulator.then((results) => {
        return nightmare.goto('https://google.com')
            .wait('body')
            .click(selector)
            .title()
            .then((result) => {
                results.push(result);
                return results;
            });
    });
}, Promise.resolve([]))
    .then((results) => {
        console.dir(results);
    })
    .then(nightmare.end)
    .catch(nightmare.end);