はじめに
Nightmare(v2)でファイルをダウンロードする方法をようやく一つ確立したので、投稿しておきます。
Nightmare(v2)って何?という方はこちらを参照ください。
動作環境
-
node v4.4.5
-
npm v2.15.5
-
主要なパッケージは下記のとおり
{ "devDependencies": { "mocha": "^2.5.3", "mocha-generators": "^1.2.0", "nightmare": "^2.5.2" } }
試してみた方法
☓ ダウンロードリンクをclick()
する
READMEを詳しくみても、downloadに関する記載は一切ありません。
それっぽいPRは見つかりましたが、長い議論の末、そっとcloseされています。
handle will-download by rosshinkley · Pull Request #382 · segmentio/nightmare
☓ nightmare-inline-download
を使ってみる
前述のPRのrosshinkleyさんが、nightmare-inline-downloadというパッケージを出していたので、使ってみましたが、結果、ダウンロードできませんでした。
○ evaluate
して、ブラウザ側でXMLHttpRequest
してresponse
を返却、バイト配列に変換して保存
最終的に、辿り着いた方法が、これです。
ブラウザ側でダウンロードリンクをXMLHttpRequest
してresponse
をテストケース側に返して、バイト配列に変換するなどして保存します。
以下、サンプルコードです。
require('mocha-generators').install();
var Nightmare = require('nightmare');
var fs = require('fs');
describe('example', function() {
var nightmare;
beforeEach (function*() {
nightmare = Nightmare();
});
it('downloads example', function*() {
var text = yield nightmare
.goto('http://www.nightmarejs.org/')
.evaluate(function (){
var imageUrl = 'http://www.nightmarejs.org/nightmarejs.org/images/ground.jpg';
var xhr = new XMLHttpRequest();
xhr.open("GET", imageUrl, false);
xhr.overrideMimeType("text/plain; charset=x-user-defined");
xhr.send();
return xhr.responseText;
})
.end()
;
var buffer = new ArrayBuffer(text.length);
var bytes = new Uint8Array(buffer);
for (var i = 0; i < text.length; i++) {
bytes[i] = text.charCodeAt(i);
}
fs.writeFileSync('/path/to/save/image.jpg', new Buffer(bytes), 'binary');
});
});
参考URL
- javascript - Download a file using Nightmare - Stack Overflow
- https://gist.github.com/artjomb/a84e915f05b03cf19bdc
おわりに
何でこんな苦労しないとダウンロード一つできないんだろうという疲労感ありますが、同じことで悩んでいる人のお役に立てれば幸いです。