それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Seleniumで印刷(print preview)を経てPDFを保存する方法

Selenium + chromedriverで 印刷プレビューにアクセスするのが面倒くさい

Chromeを webdriverでアクセスすると iframe で作られた、印刷プレビューにアクセスするのがとてもめんどくさい。(セキュリティ関連のアレコレの制限をdisableオプションで取っ払えば出来るんだろうけど)

HTMLを印刷したい。

たとえば、某銀行の印刷プレビューページなどをそのまま取りたいとか。印刷用のCSSが正しく動くかどうかとか、テストしたい箇所も山ほどある。

キオスクオプションが最強

1週間ほど毎日のように、あれこれ調べまくった結果、Chromeの起動オプションに –print-to-pdf がありました。しかしコレでは、「いま表示しているページ」を印刷するのが不便です。

Cookieを引き継ぐためにProfileを設定してChromeの再起動が必要です。

さらに探していたら、 --kiosk-printing とう「最高」なオプションを見つけたので歓喜しました。

--kiosk-printing とは?

印刷ダイアログが開くと、印刷ボタンを無条件に押してくれます。これはキオスクモードで、ユーザーにプリンタの選択をさせない為に作られているようです。

この印刷ボタンを無条件に押してくれるオプションを使うとHTMLをPDFで保存してくれます。

selenium で使うとき

Capabilitiesを活用します、そして該当ページへ移動したら、window.print() を実行します。

caps = Selenium::WebDriver::Remote::Capabilities.chrome(
      "chromeOptions" => {
          "args" => [
              '--kiosk-printing',
          ],
          "prefs" => {
              download: {
                  default_directory: '/path/to/download'
                  directory_upgrade: true,
                  prompt_for_download: false,
              }
          }
      })
driver = Selenium::WebDriver.for :chrome , :desired_capabilities => caps

driver.get 'chrome://version'
driver.execute_script(' return window.print();')

window.print で表示された、印刷ダイアログで、ボタンを押すことは kioskオプションがやってるくれるのでSelenium側では処理をする必要がありません。

保存先のディレクト

基本的には、保存先のディレクトリで指定したフォルダになりますが、設定が曖昧だと ~/Downloads に保存されます。

もし、設定がうまくいかないときは 、Seleniumで次のページへアクセスして、設定を変更したら間違いなくうまくいく。

driver.get 'chrome://settings'

参考資料

http://peter.sh/experiments/chromium-command-line-switches/