質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

2回答

4399閲覧

「Selenium × Firefox × Python」の環境で自動スクリプト実行時、クライアント証明書が反映されていない

MT-333

総合スコア22

Firefox

Mozilla Foundationによって作られた無料、オープンソース、クロスプラットフォームなウェブブラウザ

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

2クリップ

投稿2020/07/17 08:07

前提・実現したいこと

「Selenium × Firefox」の環境でブラウザ操作の自動化を行っています。

スクリプトを実行した時、事前にFirefoxブラウザにインポートしていた
クライアント証明書が反映されません。

ドライバー起動時の設定を変えればよいと考えてはいるのですが、
調べてもどのように設定してよいか分からず...
ご回答をよろしくお願いいたします。

少々抽象的な質問になってしまっているので、
必要な情報等あればご指摘ください。

該当のソースコード

from selenium import webdriver # ----------------------------------------------------------------------- driver = webdriver.Firefox(executable_path = "ドライバーパス") driver.maximize_window() driver.get("サイトURL") # クライアント証明書を使用する処理 driver.quit() # ------------------------------------------------------------------------

補足情報(FW/ツールのバージョンなど)

OS:Windows10 1909
言語:Python 3.7.3
ブラウザ:Firefox 78.0.2(64bit)
WEBドライバー:geckodriver.exe 0.26.0(64bit)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

浅い知識しかなくて申し訳ないです。
PythonのWebdriverでFirefoxを起動した場合、Firefoxのプロファイルは起動のたびに新規にtemp領域に作成されます。
そのため、事前にインストールした証明書が適用されていないのではないでしょうか?

事前にインストールしたFirefoxのプロファイルのPathを控えていただき、下記のように証明書がインストールされているプロファイルを指定していただいたらどうなりますでしょうか。

python3

1profile = FirefoxProfile(r'C:\Users\teratail\AppData\Roaming\Mozilla\Firefox\Profiles\313qm97h.default') 2browser = webdriver.Firefox(firefox_profile=profile)

投稿2020/08/05 02:21

al_aya_yuka

総合スコア98

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MT-333

2020/08/05 09:01 編集

ご回答いただきありがとうございます。 ご教示いただいたコードをドライバー起動のモジュールに組み込んでプロファイルを指定したところ、 証明書が反映され処理が実行されるようになりました! 普段Firefoxをあまり使っていなかったので、このような仕様があるとはしらず... 大変助かりました。ありがとうございました! しかしながら、問題点も残っており、やはり「driver.implicitly_wait(xx)」で エラーを吐いて止まってしまいます。 AttributeError: 'NoneType' object has no attribute 'implicitly_wait' 一応ここを外せば動くのですが、全体でwaitが聞かなくなってしまうので解決したいです。 ・Firefoxのプロファイル設定とimplicitly_wait()の相性が悪いなど、何か情報を持っていたりしませんでしょうか? ・プロファイルの設定で、個別に設定を行う方法(例えば証明書の情報だけ保持するなど)はご存じだったりしますでしょうか? よろしくお願いします。
al_aya_yuka

2020/08/13 01:47

追加質問気づかす申し訳ございません。 driverがNoneだと言っているように聞こえます。 print(driver) としたらNoneと出ませんか? そうなると私が掲示したサンプルが browser = webdriver.Firefox(firefox_profile=profile) と、browser変数で指定してしまったため、コピペミスなど起きている気がします。 そうでなければimport文から、事象が再現する最低限のソースコードをもう一度頂戴することは可能でしょうか。 何卒宜しくお願い致します。
MT-333

2020/08/27 06:55 編集

こちらこそ回答が大変遅くなってしまい申し訳ございません。 こちらのエラーですが、確認のため久々に元のスクリプトを回したら エラーが出ずに最後まで問題なく実行されるようになっていました。 コードに修正は加えておらず、ドライバーやブラウザのアップデートも特に 記憶にないので、なぜ動くようになったのか不明ですが... (あるいは、やはり私がどこかでミスをしていたのかもしれません。。) 参考までに、今までエラーが出ていた(であろう)最低限のコードを下に載せておきます。 # ========================================================= from selenium import webdriver import pyautogui as pg profile = webdriver.FirefoxProfile("Profileのパス") driver = webdriver.Firefox(executable_path = "geckodriver.exeのパス", firefox_profile = profile) driver.get("サイトURL") driver.implicitly_wait(30) # この行で該当のエラー # PKI証明書の選択 pg.press('enter') # 何かしらの処理 driver.quit() # ========================================================= どちらにせよ、al_aya_yukaさんのご回答のおかげで Firefoxでのクライアント証明書関連の処理を実行させることができるようになりました。 この度は本当にありがとうございました。
guest

0

これでどうでしょうか。
事前に用意したものを利用するのではなく証明書周りのエラーを無視するというやり方のようです。

python

1from selenium import webdriver 2 3profile = webdriver.FirefoxProfile() 4profile.accept_untrusted_certs = True 5 6driver = webdriver.Firefox(executable_path = "ドライバーパス", firefox_profile=profile)

投稿2020/07/19 03:27

shirai

総合スコア1290

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MT-333

2020/07/22 05:26

ご回答ありがとうございます。 実現したいこととしてはPKI証明書での認証操作でして、自己証明書などを使った際の 警告をパスしたいというよりかは、証明書がなくて認証ができないという状況を 解決したいので、ご回答いただいた内容は少し違うかもしれません。。 分かりづらい質問内容で申し訳ありません。 ですが、こちらの情報(Firefoxでの個人証明書パス処理)についてもちょうど並行して 調べていたので助かりました。ありがとうございます。 引き続きよろしくお願いいたします。
MT-333

2020/07/28 09:13

ありがとうございます。 caps = DesiredCapabilities.FIREFOX.copy() caps['acceptInsecureCerts'] = True ff_binary = FirefoxBinary("path to the Nightly binary") この辺の処理をドライバーを起動しているモジュールのFirefoxの処理を行っている コード部分に追加して動かしてみましたが、 AttributeError: 'NoneType' object has no attribute 'implicitly_wait' 上記アトリビュートエラーでドライバー自体起動できなくなってしまいました。。。
shirai

2020/07/29 12:26

別のところに影響が出たみたいですね。。。 ●●.implicitly_wait(20) みたいなプログラムどこかに書いていないでしょうか。 ●●の評価がNoneになっているようです。 何か思い当たる節があればいいのですが。。
MT-333

2020/07/31 07:20 編集

先にも記載しましたが、ドライバーを起動する処理は別モジュールでクラスとして書き出しており、 メインコードの最初の部分でそのクラス内のメソッド(仮にstart_driver()とする)を呼んでdriverという 変数に格納しています。 その変数を使ってdriver.implicitly_wait(xx)としているので、やはりドライバーの起動時の設定部分で 影響が出ているのかと思われます。
shirai

2020/07/31 13:25

この証明書処理をなしにして、証明書のいらない適当なサイト(yahooとか)にはアクセスできますか? print(driver.page_source)などと打ってソースは表示されるでしょうか。
MT-333

2020/08/03 02:15 編集

はい、今回追加した部分を除いて元々のソースのみで実行すれば、任意のサイトに遷移することは出来ています。 例えば以下のコード(かなり省略していますが)であれば、Googleのページのソースを問題なく表示できています。 (すみません、コメント時のマークダウン記法がいまいち分からなかったのでべた書きです。。) # ======================================= # ライブラリ/モジュールのインポート # クラスインスタンスの生成 # その他の初期設定 etc. # ======================================= from selenium import webdriver from XXXX.YYYY import Startdriver # Startdriverクラスを定義しているモジュールのインポート startdriver = Startdriver() driver = startdriver.start_driver() # ドライバーの起動を実行するメソッド # ドライバーの初期設定等 driver.implicitly_wait(xxx) driver.maximize_window() # ======================================= # 実行処理 # ======================================= driver.get("https://google.com/") # ページのソースを表示 print(driver.page_source) driver.quit() # =======================================
shirai

2020/08/03 15:59

うーんお手上げですすみません。
MT-333

2020/08/05 01:22

承知しました。 長々とご対応いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問