4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Python】Seleniumでフォームの送信テストを自動化

Posted at

PHPでお問合せフォームなどを作っていて、挙動を確認するために
手動で何度もinput要素に入力して、select要素を選択して、submitボタンを押して…とやるのが面倒くさいな…と思ったので、Pythonの「Selenium」ライブラリを使って自動化してみました。

テストするフォームを用意

今回はこんな感じのPHPでできたお問合せフォームの挙動を確認するとします。
index.png
confirm.png
thanks.png

index.phpのformがPOSTメソッドでconfirm.phpに入力された値を送信し、confirm.phpで入力内容を確認してsubmitボタンを押すと、指定したメールアドレスに問い合わせ内容が送信され、ユーザーをサンクスページへ遷移させる、という流れのフォームになっています。
(バリデーションについては割愛します)

Seleniumのインストール

pip install selenium==3.141.0
# Anaconda環境の場合は
conda install selenium=3.141.0

Chrome Driverのダウンロード

https://chromedriver.chromium.org/downloads
からご自身のOSとChromeのバージョンにあったドライバーをインストールしておいてください。

webdriverオブジェクトでフォームのURLにアクセス

ここからが本題のPythonプログラムになります。
seleniumライブラリをインポートして、自動でブラウザを操作する主体となるwebdriverオブジェクトをインスタンス化します。
変数urlには、先ほどのお問合せフォームのURLを文字列で指定します。
ローカル開発環境(http://localhost/ とか http://127.0.0.1/)
でも大丈夫です。
urlを引数に、get(url)メソッドで指定したURLにアクセスします。

from selenium import webdriver
from selenium.webdriver.support.select import Select

url = "フォームのURL/index.php"
browser = webdriver.Chrome("Chrome Driverへのパス")
browser.set_page_load_timeout(60)
browser.get(url)

入力したい要素を見つけ、send_keysメソッドで値を入力する

フォームにアクセスできたら、次はinput要素やselect要素など、値を入力する要素をhtml要素の中から探して指定します。

inputやselectにname属性を指定している場合は、find_element_by_name('name属性の値')で要素を取得できます。

inputやselectにidを付与している場合は、find_element_by_id('id')でも同様に取得できます。

そして、取得した要素に対して、send_keys('value属性の値')メソッドで入力したい値を指定します。

基本的には、テストしたい要素の数だけこの「要素を取得して、send_keys()で入力する」を繰り返します。

#姓を自動入力
first_name = browser.find_element_by_name("first_name")
first_name.send_keys("山田")

#名を自動入力
last_name = browser.find_element_by_name("last_name")
last_name.send_keys("太郎")

####以下同様に

最後に、submitボタンを取得して、click()メソッドでクリックさせます。

#index.phpの送信ボタンを自動で押す
submit = browser.find_element_by_name("submit")
submit.click()

今回のフォームの場合だと、これで全ての要素に自動で値が入力され、確認画面(confirm.php)に遷移します。
確認画面の送信ボタン(name属性はsend)も一緒に押して、メールの送信まで自動でテストしたい場合は、次のコードもまとめて実行してください。

今回のPythonコードの全体はこちら。

from selenium import webdriver
from selenium.webdriver.support.select import Select

url = "フォームのURL/index.php"
browser = webdriver.Chrome("Chrome Driverへのパス")
browser.set_page_load_timeout(60)
browser.get(url)

#姓を自動入力
first_name = browser.find_element_by_name("first_name")
first_name.send_keys("山田")

#名を自動入力
last_name = browser.find_element_by_name("last_name")
last_name.send_keys("太郎")

#郵便番号を自動入力
postal_code = browser.find_element_by_name("postal_code")
postal_code.send_keys("123-4567")

#都道府県を自動入力
pref = browser.find_element_by_name("pref")
pref.send_keys("東京都")

#市区町村を自動入力
city = browser.find_element_by_name("city")
city.send_keys("港区芝公園")

#丁目・番地を自動入力
address = browser.find_element_by_name("address")
address.send_keys("4丁目2-8")

#建物名・部屋番号を自動入力
building = browser.find_element_by_name("building")
building.send_keys("〇〇コーポ202号室")

#電話番号を自動入力
tel = browser.find_element_by_name("tel")
tel.send_keys("09000000000")

#メールアドレスを自動入力
email = browser.find_element_by_name("email")
email.send_keys("example@mail.com")

#誕生年を自動入力
birthyear = browser.find_element_by_name("birthyear")
birthyear.send_keys("1990年")

#誕生月を自動入力
birthmonth = browser.find_element_by_name("birthmonth")
birthmonth.send_keys("1")

#誕生日を自動入力
birthday = browser.find_element_by_name("birthday")
birthday.send_keys("1")

#ご意見を自動入力
opinion = browser.find_element_by_name("opinion")
opinion.send_keys("テスト送信です。")

#index.phpの送信ボタンを自動で押す
submit = browser.find_element_by_name("submit")
submit.click()

#confirm.phpの送信ボタンも自動で押す場合は下記を追加
# send = browser.find_element_by_name("send")
# send.click()

今回のサンプルコードのGitHubリポジトリはこちら

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?