PythonとSeleniumで自動ログインを行う

#はじめに
[某クレジットカード](https://www.rakuten-card.co.jp/)の明細書の確認に毎回ログインが必要なため、自動でログインできるようなシステムを作成する。

ブラウザ上に直接情報を入力するために今回は[Selenium](https://selenium-python.readthedocs.io/)というスクレイピングやWEB操作のフレームワークを利用します。
[クイックリファレンス]()が分かりやすくて便利かなと思います。
#環境
>
・Windows 10
・Chrome 90.0.4430.93
・Python 3.9.1
・ChromeDriver 90.0.4430.24.0
・Selenium 3.141.0

#初期設定
##seleniumu
Pythonが入っていればpipでインストールできます。
`$ pip install selenium
`

##ChromeDriver
Pythonが入っていればselenium同様にpipできます。
`$ pip install chromedriver-binary
`
本来ならバイナリを直接ダウンロードして環境変数でPathを通す必要があるみたいですが、pipでインストールした場合には自動的にPathが通っているみたいです。

#Seleniumの動作
動作を確認するため、[公式サイト](https://chromedriver.chromium.org/getting-started)にあるコードを実行してみます。(少し編集してます)

```python:sele-tu.py
import time
import chromedriver_binary
from selenium import webdriver

driver = webdriver.Chrome()  #WEBブラウザの起動

driver.get('http://www.google.com/') #特定のURLへ移動

time.sleep(2)

search_box = driver.find_element_by_name('q') #ページ上の要素の取得

search_box.send_keys('ChromeDriver')

search_box.submit()
```
簡単に説明

```
driver = webdriver.Chrome()  
```
ブラウザを開きます。本来なら`webdriver.Chrome()`の部分でChromedriverのバイナリファイルのパスを引数に設定する必要があるのですが、今回はpipでchromedriver_binaryをインストールしているため不要

```
driver.get('http://www.google.com/')
```
任意のURLのページに移動する

```
search_box = driver.find_element_by_name('q') #ページ上の要素の取得
search_box.send_keys('ChromeDriver')
search_box.submit()
```
ページ上の要素を取得して、その要素に対してアクションを行っています。
この流れでWEBページの情報を取得して、ページを切り替えていくのがSeleniumの強みらしいです。

結果（エラー）

```
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 91
Current browser version is 90.0.4430.93 with binary path C:\Program Files\Google\Chrome\Application\
```
ChromedriverとChromeのバージョンが合ってないとの事なので、Chromedriverの方を調整します
`$ pip pip install chromedriver_binary==90.0.4430.24.0
`
Chromedriver_binaryのバージョンは[コチラ](https://pypi.org/project/chromedriver-binary/#history)

再度実行
![スクリーンショット (127).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1074988/e28a1fa9-f56d-afa6-9a77-9bd3939b88be.png)

無事Chromeが開いて検索まで行うことが出来ました。

#実装
某クレジットカードページに対して、ページを開きログインまでを実装してみます。

```Python
import time
import chromedriver_binary
from selenium import webdriver

driver = webdriver.Chrome()  #WEBブラウザの起動

driver.get('https://www.rakuten-card.co.jp/e-navi/index.xhtml') 

time.sleep(1)

mail = driver.find_element_by_name('u') 
password=driver.find_element_by_name('p') 

mail.clear()
password.clear()

mail.send_keys("my email")
password.send_keys("my password")

mail.submit()
```

簡単に解説

```Python
driver.get('https://www.rakuten-card.co.jp/e-navi/index.xhtml')
```
楽天カードのログインページを開きます
![スクリーンショット (129).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1074988/48940d00-529b-3aa2-d57a-4ea49e59c40a.png)


```Python
mail = driver.find_element_by_name('u') 
password=driver.find_element_by_name('p') 
```

ChromeのデベロッパーツールなどでHTMLの要素を確認します。基本的に特定のページに関してはname,class,idタグからなどから要素を特定する方が楽なのかなと思います。
![スクリーンショット (133)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1074988/988a2f5b-a943-2fb9-74b6-549e8008304f.jpeg)

上の図だと、ユーザIDのテキストボックスのnameタグは`u`、パスワードのnameタグは`p`と分かったのでそれに対する要素を取得します。

```python
mail.clear()
password.clear()
```
要素の初期値を消します。

```python
mail.send_keys("my email")
password.send_keys("my password")
```

IDとPASSの要素に値を入れます。

```python
mail.submit()
```
要素に入れた情報を送信します。

今回は`sumbit()`にしていますがログインボタンの要素を取得して`click()`でもいけるみたいです。

#結果
無事ログイン後の明細書の画面まで行くことが出来ました。
![スクリーンショット (133).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1074988/9da3a804-d3fc-2f65-a0c5-b5d42f51018e.png)

使いこなせればデータの収集や自動操作など、幅広い用途に関して使えそうだと思いました。

次回はこれをワンクリックできるようなWindowsアプリを実装する予定です。