Нодейс кошмарная итерация - PullRequest
0 голосов
/ 09 октября 2018

у меня есть этот блок кода,

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[count]).

И он должен остановиться, когда click_data [20] присутствует.

Ответы [ 4 ]

0 голосов
/ 10 октября 2018

Нечто подобное должно работать.Вам придется немного адаптировать его для своего кода.

// 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);
0 голосов
/ 09 октября 2018

Вы можете сделать следующее:

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 () при необходимости.

0 голосов
/ 09 октября 2018

Полагаю, вы пытаетесь сделать что-то подобное.

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)
  });
});
0 голосов
/ 09 октября 2018

Это цепочки.Это возвращаемое значение одного вызова, который служит объектом для последующего вызова.Таким образом, вы можете выполнить рефакторинг 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();
...