Javascript 如何使用NighmareJs连续下载多个文件?

Javascript 如何使用NighmareJs连续下载多个文件?,javascript,node.js,nightmare,Javascript,Node.js,Nightmare,我对NodeJs和噩梦很陌生。我需要使用插件从同一页面下载几个文件。 到目前为止,我下面的代码可以下载第一个文件。但是我不知道如何下载链接到页面的所有文件,也就是说,如何以正确的方式循环单击(选择器).download()。此外,我将如何在循环下载时获得所有下载的文件名 注意我需要单击的HTML标记:下载。没有href属性;单击标记将触发启动下载的脚本 该网站允许一次只开始一次下载 以下是我目前的代码: var Nightmare = require('nightmare'); require(

我对NodeJs和噩梦很陌生。我需要使用插件从同一页面下载几个文件。 到目前为止,我下面的代码可以下载第一个文件。但是我不知道如何下载链接到页面的所有文件,也就是说,如何以正确的方式循环
单击(选择器).download()
。此外,我将如何在循环下载时获得所有下载的文件名

注意我需要单击的HTML
标记:
下载
。没有
href
属性;单击标记将触发启动下载的脚本

该网站允许一次只开始一次下载

以下是我目前的代码:

var Nightmare = require('nightmare');
require('nightmare-inline-download')(Nightmare);
var nightmare = Nightmare({ show: false });
nightmare
  .goto(pageUrl)
  .evaluate({
    var links = document.querySelectorAll('.download-link');
    for(var i = 0, i < links.length; i++) {
      links[i].setAttribute('download-this', 'true');
    }
  })
  .click('[download-this="true"]') // will select just the first element
  .download()
  .end()
  .then(() => {
    console.log('done');
  });
var噩梦=require(“噩梦”);
要求(‘梦魇在线下载’)(梦魇);
var monamine=monamine({show:false});
噩梦
.goto(页面URL)
.评估({
var links=document.querySelectorAll('.download link');
对于(var i=0,i{
console.log('done');
});

回答我自己的问题。读后 , 及 好几次,, 我想到了如何组合选择器和循环单击()的承诺。下载()。 关键是为evaluate()中的每个下载链接提供其唯一的id,然后返回一个id数组。在那之后,
。然后
可以将数组减少为承诺列表,每个承诺在其中单击 并下载由唯一id选择的元素。最后一个
。然后开始下载。代码变为:

var Nightmare = require('nightmare');
require('nightmare-inline-download')(Nightmare);
var nightmare = Nightmare({ show: false });
nightmare
  .goto(pageUrl)
  .evaluate({
    var links = document.querySelectorAll('.download-link');
    var ids = [];
    for(var i = 0, i < links.length; i++) {
      links[i].setAttribute('download-this', i);
      ids.push(i);
    }
    return ids
  })
  .then(function (ids) {
    return ids.reduce(function (accumulator, id) {
      return accumulator.then(function (results) {
        nightmare
          .click('[download-this=["' + id + '"]')
          .download();
        results.push(id);
        return results; // ids of downloaded files
      })
    }, Promise.resolve([]))
  })
  .then(function (results) {
    console.log('results', results);
    return nightmare.end()
  })
  .catch(function (error) {
    console.error('Error:', error);
    return nightmare.end()
  });


回答我自己的问题。读后 , 及 好几次,, 我想到了如何组合选择器和循环单击()的承诺。下载()。 关键是为evaluate()中的每个下载链接提供其唯一的id,然后返回一个id数组。在那之后,
。然后
可以将数组减少为承诺列表,每个承诺在其中单击 并下载由唯一id选择的元素。最后一个
。然后开始下载。代码变为:

var Nightmare = require('nightmare');
require('nightmare-inline-download')(Nightmare);
var nightmare = Nightmare({ show: false });
nightmare
  .goto(pageUrl)
  .evaluate({
    var links = document.querySelectorAll('.download-link');
    var ids = [];
    for(var i = 0, i < links.length; i++) {
      links[i].setAttribute('download-this', i);
      ids.push(i);
    }
    return ids
  })
  .then(function (ids) {
    return ids.reduce(function (accumulator, id) {
      return accumulator.then(function (results) {
        nightmare
          .click('[download-this=["' + id + '"]')
          .download();
        results.push(id);
        return results; // ids of downloaded files
      })
    }, Promise.resolve([]))
  })
  .then(function (results) {
    console.log('results', results);
    return nightmare.end()
  })
  .catch(function (error) {
    console.error('Error:', error);
    return nightmare.end()
  });


    return nightmare
      .click('[download-this=["' + id + '"]')
      .download()
      .then(info => {
        results.push(info);
        return results; // info about downloaded files
      });