SeleniumでPDFをダウンロードする際の保存ダイアログを非表示にさせる

今回はPython + Seleniumを活用した自動PDF保存プログラム作成中に悩んだので記事にしました。
(調べてもなかなか悩んでいた原因を解決できる記事が出てこなかった...だから需要があるはず!!!)

ちなみに、あるECサイトで買い物をした際の電子領収証を一括で自動保存するというプログラムを作成していました。

目次

PDF保存時のダイアログを非表示にさせたい

今回僕が躓いたポイントは、
PDFを保存する際に「印刷結果を名前を付けて保存」というダイアログが出てしまうことです。
(「邪魔!邪魔!消えろ!」)

印刷結果を名前を付けて保存ダイアログ

このダイアログが出てしまうことによって、プログラムが一時停止してしまうので、どうか非表示にさせたい。

--kiosk-printingオプションで自動PDF保存が可能

僕のこの記事にたどり着いているということは、PDF印刷画面を自動で閉じるというキオスクモードの実装はできているのだと思う。軽く説明しておくとseleniumのoptionに--kiosk-printingオプションを追加してあげるとPDF印刷画面を一瞬だけ開いて、自動で閉じることができる。

ソースで言うと、このような実装をする

from selenium import webdriver

ChromePath="ChromeドライバーのPath(各自環境に合わせて)"

#オプション追加のときにキオスクモードを追加する
options = Options()
options.add_argument('--kiosk-printing')

#ドライバーの立ち上げ
driver = webdriver.Chrome(executable_path=ChromePath, options=options)

options--kiosk-printingを設定している。

そして、PDF保存したい画面へSeleniumで遷移してwindow.print()というJavaScriptの実行でPDFをダウンロードする

#保存したいページへ遷移した後、以下を実行
driver.execute_script('window.print();')

どうだろうか。こんな説明で分かるのだろうか。説明が雑になってしまったが...
この説明は今回話したかった本題ではないので、サラッと説明をしておきました。

では、本題に戻ります。

保存パス指定のダイアログを非表示にする方法

「印刷結果を名前を付けて保存」というダイアログを非表示にするためには、追加でChromeの設定を行うオプションを設定しておく必要がある。

上記に加えて以下を追加する

appState = {
    "recentDestinations": [
        {
            "id": "Save as PDF",
            "origin": "local",
            "account":"",
        }
    ],
    "selectedDestinationId": "Save as PDF",
    "version": 2
}
prefs = {
'printing.print_preview_sticky_settings.appState': json.dumps(appState)
}

options.add_experimental_option("prefs", prefs)

printing.print_preview_sticky_settings.appStateappStateで設定したChromeのブラウザ設定を渡します。
そして、add_experimental_optionでドライバーに設定を追加します。

appStateで記述しているのがブラウザに対して行う設定なのですが、あまり深い内容を理解していません...。
ですが、これを設定してあげることで「印刷結果を名前を付けて保存」という鬱陶しいダイアログを非表示にすることができます。

最終的なコード

最終的にはこのようなコードになります。

from selenium import webdriver

ChromePath="ChromeドライバーのPath(各自環境に合わせて)"

options = Options()

appState = {
    "recentDestinations": [
        {
            "id": "Save as PDF",
            "origin": "local",
            "account":"",
        }
    ],
    "selectedDestinationId": "Save as PDF",
    "version": 2
}
prefs = {
'printing.print_preview_sticky_settings.appState': json.dumps(appState)
}

options.add_experimental_option("prefs", prefs)
options.add_argument('--kiosk-printing')

#ドライバーの立ち上げ
driver = webdriver.Chrome(executable_path=ChromePath, options=options)
:
: #なんやかんやの処理があって...
:
#保存したいページへ遷移した後、以下を実行
driver.execute_script('window.print();')

同じポイントで躓いている方に参考になればと思います。

ちなみに、余談ですが

Macで同じプログラムを動かした場合、add_experimental_optionを行わなくてもPDF保存時に「印刷結果を名前を付けて保存」のようなダイアログは表示されませんでした。OSによって挙動が異なるのでした。
Macの場合でもadd_experimental_optionを追加してもしっかり動作します。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

目次
閉じる