Pythonを練習しようパート1
Pythonの入門書を読んでから数ヶ月...全くパイソンを書かない日々が続いたので、勉強がてらクレジットカード利用明細のダウンロードをやってみました
出典
ゼロからはじめるPython(49) Pythonでブラウザ自動操縦してカード明細を自動でダウンロードしよう(その1) | マイナビニュース
ゼロからはじめるPython(50) Pythonでブラウザ自動操縦してカード明細を自動でダウンロードしよう(その2) | マイナビニュース
上の記事を見ながらカタカタと実装していきます。
バージョン情報
PCはmacOS Mojave(10.14.6)
- selenium: 3.141.0
- chrome: 76.0
- ChromeDriver: 76.0
- Python 3.7.3
SeleniumとChromeDriverのインストール
ChromeブラウザをPythonから操作することによってクレジットカードの利用明細をダウンロードするので、 UIテスト自動化ツールのSeleniumとChromeDriverをインストールが必要になります。
まずpip install
コマンドでSeleniumをインストール。
$ pip install selenium
Chrome driverについては手動でPATHを通すのが面倒だったので、pip install
ではなくHomebrewでインストールをしました。
$ brew install chromedriver
brew install chromedriver
を実行した結果下記のエラーメッセージが出力されて失敗。
Error: No available formula with the name "chromedriver" Found a cask named "chromedriver" instead. Try brew cask install chromedriver
エラーメッセージに従って下記のコマンドでChrome driverのインストールを実行し、成功。
$ brew cask install chromedriver
テストプログラムの実行
環境構築(SeleniumとChromeDriverのインストール)ができていることを確認するために、下記のテストプログラムを実行します。
- hello.py
import time from selenium import webdriver # Chromeを起動する driver = webdriver.Chrome() # Googleのページを開く driver.get('https://www.google.com') # ページが開くまで待つ time.sleep(5) # 検索ボックスのオブジェクトを得る q = driver.find_element_by_name('q') # 検索ボックスにキーを送信する q.send_keys('まちカドまぞく') # フォームを投稿する q.submit() # 結果を30秒表示して終了する time.sleep(30) driver.quit()
テストプログラムの内容としては、Chromeブラウザを開いてまちカドまぞく
について検索するというもの。
下記のコマンドでテストプログラムを実行します。
$ python hello.py
実際にテストプログラムを実行した結果、下記のエラーが表示されて失敗しました。
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 76
Chrome driverとChromeのバージョンが一致していないことが原因のエラーとなります(ChromeDriverのバージョンが76なのに、Chromeブラウザのバージョンが72だった)。
Chromeのバージョンを76にアップグレードして、再度テストプログラムを実行したところ成功しました
クレジットカード利用明細のダウンロード
では環境構築が完了したので、実際にクレジットカード明細のダウンロードをやっていきます。
注意事項
明細取得に進む前に注意事項ですが…自動でログインするのを禁じているサイトなどもあるため、事前にサイトの利用規約を読んでおきましょう
実装
ドコモユーザーでもないのにDカードを使っているので、Dカードの利用明細を取得するコードを書いていきます。
ドコモのクレジットカード(Dカード)の利用明細をダウンロードするコード
上のコードでは、find_element_by_name
でエレメントのname
属性をキーに、ユーザID欄とパスワード欄を取得して、値を入力してログインしてから、
利用明細ページで利用明細のCSVをダウンロードするメソッドを呼び出す...といった処理をやっています。
ユーザIDとパスワードについては、Gitに間違えてアップしたら大変なので、.gitignore
に設定しているファイルに定義しています。
- d_credentials.py
ID = "XXXXXXXXX" PASS = "XXXXXXXXX"
上のプログラムを実行すると、Chromeブラウザが立ち上がって、ユーザIDとパスワードを自動で入力して明細のCSVをダウンロードしてくれます。
$ python download_d-card.py
遭遇したエラー
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <a href="javascript:void(0)" onclick="doSubmitForm(document.download_form);">...</a> is not clickable at point (891, 803). Other element would receive the click: <td scope="col" colspan="4"></td>
Pythonで利用明細のダウンロードリンクをクリックしようとする過程で上記のエラーに遭遇しました。
利用明細CSVのダウンロードリンク<a href="javascript:void(0)" onclick="doSubmitForm(document.download_form);">...</a>
が他のエレメントに邪魔されてクリックできないというエラーになります。
最終的にCSVダウンロードリンクをクリックするのを諦めて、execute_script
で直接DカードのWebサイト側で定義しているCSVのダウンロードメソッドdoSubmitForm(document.download_form)
を呼び出すことで解決しました。
参考サイト
Selenium利用時のトラブルシューティング方法[クリック編]
おわりに
自慢じゃないけどクレジットカードの明細みるの1年ぶりくらいです...(家で見たことないから実家に届いてるのかもしれない