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