Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
4
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

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

はじめに

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

環境

  • Windows10
  • Python 3.7

seleniumとは

seleniumとはwebブラウザを自動で動かすためのフレームワークです。
seleniumクイックリファレンス
この辺を参考にしていただけたらいいと思います。

ライブラリのインストール

seleniumドライバを動かすためのライブラリをインストールします。

pip install selenium

ドライバのインストール

こちらを参考にしていただければと思います。
【selenium】Firefox/Chrome/SafariのWebDriverインストール - Python 編 -

コードを書いていく

必要なライブラリのimport

from selenium import webdriver

ブラウザを開く

今回はChromeで動作させます。

driver_path = 'ドライバのパス'
driver = webdriver.Chrome(executable_path=driver_path)

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

指定したurlに飛ぶ

url = 'https://www.google.com'
driver.get(url)

これでGoogleの最初の画面に飛びます。

seleniumでブラウザを操作する

さてここから本題に入ります。
seleniumはブラウザのHTML要素を探してインスタンスを生成してクリックしたり入力したりします。

要素を探す
  • Chromeで操作したいページ上で右クリックして、検証に進みます。 1.png
  • 左上のマークをクリック。 コメント 2020-09-04 114111.png
  • 探したい要素のところにカーソルを移動し左クリックします。 コメント 2020-09-04 113613.png
  • 画面右側に表示された要素のid,class,xpathを取得する コメント 2020-09-04 114844.png

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

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

# xpathで探す
element = driver.find_element_by_xpath()
# idで探す
element = driver.find_element_by_id()
# classで探す
element = driver.find_element_by_class_name()
要素を探した後

# クリックする
element.click()
# 入力する
text = 'qiita'
element.send_keys(text)
# 入力されてる文字列を削除
element.clear()

これまでのまとめ

以下のコードでChromeでGoogleを開き検索をすることができますね!

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()

MSformsに自動回答

やっとここまできました。
qiita記事用にMSformsを作りました。
Test
コメント 2020-09-04 214332.png

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

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()

動作確認用


これで完成ですね!
もしログインが必要なformsであったとしたらログイン処理も入れてみるといいでしょう。

寮の点呼で使用したプログラム

これはいろいろと特定されそうな要素があって怖いので概要だけにしときます。

実装した機能

  • 自動化したい人数分点呼を繰り返す
  • ログインから回答まで
  • 毎朝自動的にスクリプトが起動するようにしたいため、タスクスケジューラを利用して毎朝バッチファイルを実行させる
  • ちゃんと点呼が送られたかどうかLINEグループにLine notifyで報告する
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
4
Help us understand the problem. What are the problem?