2017-01-07 4 views
0

私はNodeJsとNightmareJsの新機能です。 nightmare-inline-downloadプラグインを使用して、同じページから複数のファイルをダウンロードする必要があります。 これまでのところ私のコードは、最初のファイルをダウンロードできます。しかし、ページにリンクされたすべてのファイルをダウンロードする方法、つまりclick(selector).download()を適切な方法でループする方法を知ることはできません。さらに、ダウンロードしたすべてのファイル名を取得するには、ループしたダウンロードをどのようにして収穫しますか?NighmareJで複数のファイルを連続してダウンロードするにはどうすればよいですか?

クリックする必要があるタグ<a>に注意してください:<a target="_blank" class="download-link">Download</a>href属性はありません。タグをクリックすると、ダウンロードを開始するスクリプトがトリガーされます。

このウェブサイトでは、一度に1回のダウンロードだけを開始できます。ここで

は、これまでの私のコードです:

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'); 
    }); 

答えて

2

は自分の質問に答えます。 thisthisthis 数回、 を読んだ後、私はクリック()をループにセレクタと約束を組み合わせる方法を考え出した。ダウンロードしてください()。 重要なのは、evaluate()内の各ダウンロードリンクに独自の一意のIDを与え、そのIDの配列を返すことです。その後、.then は配列を約束のリストに減らすことができ、各約束が をクリックし、一意のIDで選択された要素をダウンロードする。最終的に.thenがダウンロードを開始します。コードは次のようになります。

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() 
    }); 

を今、私は、私が完了し、ダウンロードに関する情報を返すためにdownload().thenを追加する代わりに、ダウンロードしたファイルIDを返すので、各ダウンロードについての情報を印刷する必要がある場合。私がこのtest scriptから取ったコードのこのビットは、振り返ってみるとこの回答で提示しているスクリプトと似ています! ので、関連するコードは

nightmare 
     .click('[download-this=["' + id + '"]') 
     .download(); 
    results.push(id); 
    return results; // ids of downloaded files 

から

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

に、この方法を変更
関連する問題