前提条件
フォームのバリデーションチェックのテストって面倒ですよね。
いちいちフォームの入力窓に入力して、送信ボタンを押してエラーメッセージを読んでバグをなおして、またフォームに入力して
...なんて、入力項目がものすごく多いフォームだともう気が狂いそうです。
そこで、フォームの入力だけでも一発で実行する方法をまとめました。
- macOS 12.4 Monterey
- jupyter lab 3.1.4
- Python 3.9.5
jupyter labとpython3はインストールされている状態からスタートします。入っていない人は、インストールしましょう。
jupyter labはjupyter notebookでも大丈夫です。
またローカル開発環境でもテストできる方が便利なので、Google Colaboratoryではやらない方が良いと思います。
jupyter labにプロジェクトファイルを作る
ターミナルで以下のコマンドを叩く。
通常、グローバルでインストールしていると思うのでディレクトリはどこでもOKだと思います。
$ jupyter lab
ブラウザでjupyter labが開くので、ウインドウ左上のjupyter labのロゴの下あたりにある+マークのボタンを押す。
NotebookのPython 3 (ipykernel)
ボタンを押して新しいプロジェクトファイルを追加する。
色々インストールする
!pip install selenium
# 現在使用しているchromeと同じバージョンのChrome Driverを自動でインストールしてくれるwebdriver_managerをインストール
!pip install webdriver_manager
インストール先を確認する
先ほどpipでインストールした先を調べて、環境変数を設定します。
# pipでwebdriver_managerをインストールした場所を調べる
import sys
print(sys.executable)
これで出力されたパスを次のappendメソッドの引数に渡します。
# pipでwebdriver_managerをインストールしているディレクトリの環境変数を渡す
import sys
sys.path.append('パス')
ブラウザを開く
from selenium import webdriver
from time import sleep
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
URLにアクセスする
driver.get('テスト環境のURL')
sleep(1)
入力窓に値を入力
入力窓のセレクタを調べて引数に入れないといけませんが、ここが結構面倒なので、デベロッパーツールでinputタグを右クリックして、コピー > xpathをコピーを選択してコピーします。
以下のfind_element_by_xpath()の引数にペーストすれば確実にそこへ入力させることができます。
あとは、入力窓に入力したい値をsend_keysに入れましょう。
# 入力窓を取得と入力(入力窓のHTML上で右クリックしてCopy XPathをして取得した値を入れる)
elem_username = driver.find_element_by_xpath('取ってきたxpath')
elem_username.clear()
elem_username.send_keys('入力したい値')
これを繰り返して、フォームに入れたい値をどんどん書いていきます。
ちなみに、新しいselenium4以降は、このセレクタの書き方が変わったようです。
新しいバージョンを使用している方は、公式ドキュメントに書き方が書いてあるので、そちらを参考に書き換えてみてください。
参考:【Python】find_element(By.XPATH, "xxx")・・・xpathから要素を取得する
送信ボタンを押させる
送信ボタンのxpathもデベロッパーツールから調べてきて、引数に入れてください。
実行させると送信ボタンが押されます。
elem_submit_btn = driver.find_element_by_xpath('取ってきたxpath')
elem_submit_btn.click()
あとはひたすらデバッグです。
では、良いテストライフを〜!
おまけ:basic認証を抜ける方法
basic認証をかけているサイトだと、サイトにアクセスした時に認証に引っかかって、フォームに直接入れない場合があります。
その場合は、一度サイトのTopへ遷移するURLを、以下のように工夫をする必要があります。
driver.get('http://basic認証のユーザ名:パスワード@テスト環境のTopページURL')
driver.get(' フォームページのURL')