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

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

## テストするフォームを用意
今回はこんな感じのPHPでできたお問合せフォームの挙動を確認するとします。
![index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/c748b355-9cd7-8dd7-816e-9ec940570728.png)
![confirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/2c955d75-a92f-c9a8-46a2-f6a02fdb55bc.png)
![thanks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/06b6fce0-adc7-d496-76e1-d5b0b59f80b0.png)

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

## Seleniumのインストール
```shell
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にアクセスします。

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

## 入力したい要素を見つけ、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()`で入力する」を繰り返します。

```python
#姓を自動入力
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()`メソッドでクリックさせます。

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

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

今回のPythonコードの全体はこちら。
```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リポジトリは[こちら](https://github.com/outsider-kithy/formTestbyPython)