履修履歴データベースの入力作業を一部自動化してみた

# 経緯
就職活動の最中、履修履歴データベースから履修した授業の成績等の記録を送ることになりました。
そしていざ履修履歴データベースを使ってみると、csvファイルの読み取りなどに対応しておらず、科目の成績、単位数を一つ一つ手入力しないといけないものでした。
~~今時こんなのありえる？！（宇宙猫）~~
流石に手入力は非効率的だと思ったので、一括で入力できる科目名は自分で入力して成績評価と単位数をcsvファイルから自動入力してくれるプログラムを書くことにしました。

完成した今、振り返ると、一つ一つ手入力したほうが早かったと感じています。
作るのに半日かかりました。

# プログラムの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950626/4612bf9c-213f-e13a-5425-5d3d01b2ca70.png)
雑ですけど、プログラムの構成図はこんな感じです。
大まかな流れとしては、
1\. まず、履修履歴データベースに入力するデータのcsvファイル（科目名、成績評価、単位数を含む）を大学のマイページからとってくる　または、自分で作る
2\. 次に、そのcsvファイルをPythonで読み込む
3\. 最後に、Seleniumを使って、履修履歴データベースにデータを自動入力する

また、先ほど述べましたが、「成績評価」と「単位数」の入力のみ、自動化を図りました。科目名が一括で入力できたので、そこの自動入力は妥協しました。そのため、起動済みのブラウザに対してSeleniumを使用する方法をとっています。参考記事↓

https://qiita.com/mimuro_syunya/items/2464cd2404b67ea5da56

:::note warn
記事を参考に`openChrome.bat`を作成し、IPアドレスをあらかじめ調べておいてください
また、csvファイルのパスと文字コードも控えておくとよいです
:::


# プログラムの例
私の場合、成績評価がS～Cの四段階評価のため、プログラムも四段階評価のものになってます。
また、csvファイルの構成は、0列目:科目名、1列目:単位数、2列目:成績評価の順になっていると想定しています。
```python:selenium_data_input.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select
import pandas as pd

'''
このプログラムを利用するためにあらかじめ行っておくこと
1.openChrome.batからChromeを起動して履修履歴データベースにログインする
2.「データ登録」タブをクリックし、「卒業過程登録」タブの「1.学校名入力（必須）」の入力作業を完了させる
3.「2.講義入力 （必須）」の「講義名一括入力はこちら＞」から、csvファイルの順番の通りに科目名を一括入力する
  ※成績評価と単位数の自動入力もcsvファイルの順番通りに行うため
'''

'''
メモ
・成績評価選択プルダウンメニューのid
0番目 id="schoolFormMap0.lectureFormMap0.recordCd"
1番目 id="schoolFormMap0.lectureFormMap1.recordCd"
Mapの後ろの数字が変化している
S:1
A:2
B:3
C:4

・単位数入力テキストボックスのid
0番目 id="schoolFormMap0.lectureFormMap0.credit"
1番目 id="schoolFormMap0.lectureFormMap1.credit
Mapの後ろの数字が変化している

・csvファイルの中身
0列目:科目名
1列目:単位数
2列目:成績評価
'''
# openChrome.batから起動したChromeを認識
options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", "[IPアドレス]:9222")

driver = webdriver.Chrome(options=options)

# openChrome.batから起動したChromeが現在開いているページタイトルを表示
print(driver.title)

# csvデータ入力
csv_input = pd.read_csv(filepath_or_buffer="[csvファイルのパス]", encoding="[csvファイルの文字コード]", sep=",")

cnt = 1 # 講義の番号を識別するための変数

for row in csv_input.values:
    
    #成績評価
    recordCd = driver.find_element(By.ID, 'schoolFormMap0.lectureFormMap'+ str(cnt) +'.recordCd')
    select = Select(recordCd)
    value = -99
    if row[2] == 'S':
        value = 1
    elif row[2] == 'A':
        value = 2
    elif row[2] == 'B':
        value = 3
    elif row[2] == 'C':
        value = 4
    select.select_by_index(value)
    
    #単位数
    credit = driver.find_element(By.ID, 'schoolFormMap0.lectureFormMap' + str(cnt) + '.credit')
    credit.clear()
    credit.send_keys(str(row[1]) + '.0')
    
    # 講義番号と入力したcsvファイルの情報を一行ずつ表示
    print(cnt, row)
    
    cnt = cnt + 1
```
:::note warn
環境によって違うかもしれないので、履修履歴データベースの「成績評価プルダウンメニュー」と「単位数テキストボックス」の`html`の`id`は確認したほうがいいかもしれないです。
また、所々にプログラムが動いているかどうか確認するための`print`文を配置してあるので、万が一エラーを吐いた場合のデバッグ等に活用してください。
:::

# おわりに
この自己満足記事が「履修履歴データベース」の入力作業という苦行を抱えている就活生の力になれば幸いです。

# 参考記事
https://qiita.com/mimuro_syunya/items/2464cd2404b67ea5da56

https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a

https://www.seleniumqref.com/api/webdriver_gyaku.html

https://note.nkmk.me/python-list-len/

https://qiita.com/motoki1990/items/0274d8bcf1a97fe4a869