8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Nightmare(v2)でファイルをダウンロードする

Posted at

はじめに

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

});

上記のコードで、ダウンロードした画像がこちらです。
example.jpg

参考URL

おわりに

何でこんな苦労しないとダウンロード一つできないんだろうという疲労感ありますが、同じことで悩んでいる人のお役に立てれば幸いです。

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?