Nightmare.jsでpdfリンクをクリックした場合に保存ダイアログが表示されるのを回避する方法

Nightmare.jsでサイト上の動作を自動化を構築しているときに、PDFリンクを開く動作をさせたいシーンってありませんか?

私はこれでハマりました。

例えば、サイトによってはPDFを開いたことをチェックして次の動作が可能となる仕組みになっていることがあります。

なので、期待動作はPDFリンクをクリックしたらPDFビューワーが立ち上がる。なのですが、Nightmare.jsでPDFリンクをクリックすると保存ダイアログが表示されてしまうのです。

例えば、こんなの。

NightmareでPDFリンクをクリックした時の挙動 - 保存ダイアログの表示

この保存ダイアログの「キャンセル」なり「保存」ボタンをNightmare.jsでクリックしようとしてもできなくてハマりました。

同じようにハマっている人のために、回避策を紹介します。

はじめに

Nightmare.jsにはダイアログ(alert/prompt/confirm)などの挙動をオーバーライドする仕組み(preload.js)が準備されています。

カスタマイズしたpreload.jsをNightmareに読み込ませることで保存ダイアログの表示を回避させることが可能です。

説明上、階層構造は以下とします。

   project
      |
      +---- custom-preload.js  /* カスタマイズしたpreload.js  */
      |
      +---- sample.js          /* Nightmareを操作するファイル */

preload.jsのカスタマイズ

custom-preload.jsの内容はこんな感じ。新規Windowオープンのイベントでは何もしないようにしています。

window.__nightmare = {};
__nightmare.ipc = require('electron').ipcRenderer;

window.open = function() {
    // do nothing
}

カスタムpreload.jsの読み込み

sample.jsはこんな感じ。Nightmareのインスタンス生成時にcustom-preload.jsを読み込むように設定します。

var path = require('path'),
    Nightmare = require('nightmare');

var nightmare = Nightmare({
    webPreferences: {
    preload: path.resolve(__dirname, 'custom-preload.js'),
});

以上の設定で、PDFリンクをクリックしたときの保存ダイアログ表示を回避できます。

冒頭で触れた、PDFをクリックしないと先に進めない仕組みのサイトでもPDFクリックは認識されるため先に進めるようになると思います。

ただ、この方法だとPDFリンクに関わらず新規Windowオープンのイベント全般をキャッチしてしまうので小手先のTipsとなりますが、参考になれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください