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'