MSformsの自動回答スクリプトを通してselenium入門

###はじめに
私が住んでいる寮では毎朝点呼があり、コロナ渦のため3月ごろ点呼がMSformsへ変わりました。
毎朝起きる→スマホを開ける→teamsを開く→formsを開く→毎日同じ回答を送る　作業が億劫...と思ったためこのスクリプトを作ろうと思いました。
seleniumについて何も知らなくてもコードが書けるようになる記事を書ければいいなと思ってます。
**※注意　この記事で使用したのはMSformsですが同じようにコードを書けばGoogleフォームでも利用できます。**


###環境

+ Windows10
+ Python 3.7


###seleniumとは
seleniumとはwebブラウザを自動で動かすためのフレームワークです。
[seleniumクイックリファレンス](https://www.seleniumqref.com/)
この辺を参考にしていただけたらいいと思います。
####ライブラリのインストール
seleniumドライバを動かすためのライブラリをインストールします。

```
pip install selenium
```

####ドライバのインストール
こちらを参考にしていただければと思います。
[【selenium】Firefox/Chrome/SafariのWebDriverインストール - Python 編 -](https://qiita.com/hujuu/items/ef89c34fca955cc571ec)

<a id = "third"></a>
###コードを書いていく
####必要なライブラリのimport
```python
from selenium import webdriver
```
####ブラウザを開く
今回はChromeで動作させます。

```python
driver_path = 'ドライバのパス'
driver = webdriver.Chrome(executable_path=driver_path)
```
ドライバーをpipと同じ階層に置いてある場合パスの指定はいらないです。
ソースファイルの下に置いておく場合などは相対パスで指定しましょう。
これでブラウザが勝手に開きます。

####指定したurlに飛ぶ
```python
url = 'https://www.google.com'
driver.get(url)
```
これでGoogleの最初の画面に飛びます。
####seleniumでブラウザを操作する
さてここから本題に入ります。
seleniumはブラウザのHTML要素を探してインスタンスを生成してクリックしたり入力したりします。
#####要素を探す
+ ***Chromeで操作したいページ上で右クリックして、検証に進みます。***
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635201/244ef92c-156b-901b-8539-c64327039bf6.png)
+ ***左上のマークをクリック。***
![コメント 2020-09-04 114111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635201/0176078f-3487-f405-db4a-ea2cfa487626.png)
+ ***探したい要素のところにカーソルを移動し左クリックします。***
![コメント 2020-09-04 113613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635201/19843826-7daa-4c5e-6995-ef031eaaeca7.png)
+ ***画面右側に表示された要素のid,class,xpathを取得する***
![コメント 2020-09-04 114844.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635201/95d7e2b5-a81d-1f92-74b2-88e1ccd5c7a9.png)

これで要素を指定できます。




上で取得したid,class,xpathを以下の関数に渡します

```python
# xpathで探す
element = driver.find_element_by_xpath()
# idで探す
element = driver.find_element_by_id()
# classで探す
element = driver.find_element_by_class_name()
```

#####要素を探した後
```python

# クリックする
element.click()
# 入力する
text = 'qiita'
element.send_keys(text)
# 入力されてる文字列を削除
element.clear()
```
####これまでのまとめ
以下のコードでChromeでGoogleを開き検索をすることができますね！

```python
from selenium import webdriver
driver_path = 'ドライバのパス'
driver = webdriver.Chrome(executable_path=driver_path)
url = 'https://www.google.com'
driver.get(url)

element = driver.find_element_by_xpath('//*[@id="tsf"]/div[2]/div[1]/div[1]/div/div[2]/input')
element.send_keys('qiita')

element = driver.find_element_by_xpath('//*[@id="tsf"]/div[2]/div[1]/div[3]/center/input[1]')
element.click()
driver.close()
```
<a id = "forth"></a>
###MSformsに自動回答
やっとここまできました。
qiita記事用にMSformsを作りました。
[Test](https://forms.office.com/Pages/ResponsePage.aspx?id=XYP-cpVeEkWK4KezivJfyLNSaEPu2-FCsEMGpQQlAA9UMDVQSjgyWUoyOUQzQVhEQTc5QzJDSFJCSy4u)
![コメント 2020-09-04 214332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635201/e92d23e4-961d-c05c-f9e0-78a2990ab7b9.png)

これに自動回答していきましょう。

```python
from selenium import webdriver
import time

driver_path = 'E:\\qiita\\driver\\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
url = 'https://forms.office.com/Pages/ResponsePage.aspx?id=XYP-cpVeEkWK4KezivJfyLNSaEPu2-FCsEMGpQQlAA9UMDVQSjgyWUoyOUQzQVhEQTc5QzJDSFJCSy4u'
driver.get(url)
# ウィンドウを最大化する。
driver.maximize_window()
# ページが表示されるまつ
time.sleep(10)
# 好きなアーティストはいるかいないか(いる)
element = driver.find_element_by_xpath(
    '//*[@id="form-container"]/div/div/div/div/div[2]/div[2]/div[1]/div/div[2]/div/div[1]/div/label/input')
element.click()

# 好きな食べ物(パンティ)
favorite_food = 'パンティ'
element = driver.find_element_by_xpath(
    '//*[@id="form-container"]/div/div/div/div/div[2]/div[2]/div[2]/div/div[2]/div/div/input')
element.send_keys(favorite_food)

# 年齢(10才)
# まず逆三角形をクリックして選択肢を出す
element = driver.find_element_by_xpath('//*[@id="Select_0"]/div/i')
element.click()
# 10才を選択する
element = driver.find_element_by_xpath('//*[@id="Select_0"]/ul/li[1]')
element.click()

# 最後に送信ボタンを押す
element = driver.find_element_by_class_name('button-content')
element.click()
sleep(3)

# ウィンドウを閉じる
driver.close()

```
動作確認用
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/VXvb6CSGPh">pic.twitter.com/VXvb6CSGPh</a></p>&mdash; こっぷ (@butsuli_shine) <a href="https://twitter.com/butsuli_shine/status/1301892602493415431?ref_src=twsrc%5Etfw">September 4, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
これで完成ですね！
もしログインが必要なformsであったとしたらログイン処理も入れてみるといいでしょう。

<a id = "fifth"></a>
###寮の点呼で使用したプログラム
これはいろいろと特定されそうな要素があって怖いので概要だけにしときます。

**実装した機能**

+ 自動化したい人数分点呼を繰り返す
+ ログインから回答まで
+ 毎朝自動的にスクリプトが起動するようにしたいため、タスクスケジューラを利用して毎朝バッチファイルを実行させる
+ ちゃんと点呼が送られたかどうかLINEグループにLine notifyで報告する