![見出し画像](https://assets.st-note.com/production/uploads/images/45681811/rectangle_large_type_2_a318fb63bb157394ce7b59bd2ee402df.png?width=1200)
Le Selenium avec P03:フォームへの入力とクリック(ログイン操作)
【0】はじめに
今回はSeleniumを使った入力フォームとクリック操作の練習をする。例としてDVWAのログイン画面で「username」と「password」を入力してLoginボタンを押下するまでを実施する。
■サンプル画面
【1】send_keys()メソッド:キー入力
テキストボックスやテキストエリアなどに入力フォームへのキー入力をシミュレートするには「WebElement.send_keys()」メソッドを使う
■例1:「username」と「password」欄にキー入力操作をいれる
※elementはname属性で取得した
from selenium import webdriver
import chromedriver_binary # pipでいれたのでこれが必要
... ...
driver = webdriver.Chrome()
... ...
# username欄
username_field = driver.find_element_by_name("username")
username_field.send_keys("admin")
# password欄
password_field = driver.find_element_by_name("password")
password_field.send_keys("password")
【2】click()メソッド:elementをクリックする
入力した内容を使ってLoginボタンをクリックし、ログインしてみる。クリックには「WebElement.click()」を使う。
■例2:ログインボタンをクリックする
from selenium import webdriver
import chromedriver_binary # pipでいれたのでこれが必要
... ...
driver = webdriver.Chrome()
... ...
# Loginボタン
login_button = driver.find_element_by_name("Login")
login_button.click()
実行結果:ログインに成功し、次画面に遷移成功
【3】ここまでのまとめコード
ここまでのまとめとして、
・テキストボックスにキー入力
・Loginボタンをクリック
・遷移後の画面でログアウトボタンを押下
・再びログイン画面に戻る
という操作をしてみる。
from selenium import webdriver
import chromedriver_binary # pipでいれたのでこれが必要
# import time
#chrome起動時のオプション設定
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ["enable-logging"]) # bluetoothデバイス系の警告OFF
driver = webdriver.Chrome(options=options)
# 10秒の暗黙ウェイト設定
driver.implicitly_wait(10)
driver.get('http://localhost:8080/login.php')
# username欄
username_field = driver.find_element_by_name("username")
username_field.send_keys("admin")
# password欄
password_field = driver.find_element_by_name("password")
password_field.send_keys("password")
# time.sleep(5)
# loginボタン
login_button = driver.find_element_by_name("Login")
login_button.click()
# time.sleep(5)
# logout XPathで取得
logout_field = driver.find_element_by_xpath('//*[@id="main_menu_padded"]/ul[4]/li/a')
logout_field.click()
# time.sleep(5)
# 戻ってきたらエレメントへの再アタッチが必要
username_field = driver.find_element_by_name("username")
username_field.send_keys("test is over")
# time.sleep(5)
driver.quit()
【おまけ】unittestを使って、ログイン失敗時のメッセージテスト
もともとSeleniumはWebアプリケーションをテストするためのもの。おまけとして「unittest」を使ったちょっとしたユニットテストをしてみる。
※この他、テスト用のフレームワークとして他にも例えば「nose」や「pytest」もあるが、今回はunittestを使う。
■unittestの使い方
ざっくりいうと以下のような準備をする
・unittest.TestCaseオブジェクトを継承したクラスを作る
・setUp()/setUpClass()、tearDown()/tearDownClass()メソッドを作る
・テストコードを書く
■テストする内容
「ログイン失敗時のエラーメッセージの表示有無」と「テキストボックスの入力内容のリセット」が動作しているかテストしてみる。
例3:
from selenium import webdriver
import chromedriver_binary # pipでいれたのでこれが必要
from selenium.common.exceptions import NoSuchElementException
import unittest
class LoginTests(unittest.TestCase):
# def setUp(self):
# # create a new Chrome session
# self.options = webdriver.ChromeOptions()
# self.options.add_experimental_option("excludeSwitches", ["enable-logging"]) # bluetoothデバイス系の警告OFF
# self.driver = webdriver.Chrome(options=self.options)
# self.driver.implicitly_wait(10)
# self.driver.get('http://localhost:8080/login.php')
# インスタンスを共有する場合はデコレータ付きでsetUpClassを使う
@classmethod
def setUpClass(cls):
# create a new Chrome session
cls.options = webdriver.ChromeOptions()
cls.options.add_experimental_option("excludeSwitches", ["enable-logging"]) # bluetoothデバイス系の警告OFF
cls.driver = webdriver.Chrome(options=cls.options)
# 暗黙ウェイト5秒(最初のエラーメッセージ検出部分で5秒待ち)
cls.driver.implicitly_wait(5)
cls.driver.get('http://localhost:8080/login.php')
def test_loginErr(self):
# 最初はエラーメッセージが表示されていないことをテスト
with self.assertRaises(NoSuchElementException) as e:
# 例外を投げる処理を記述
self.errMsg = self.driver.find_element_by_class_name("message")
# username欄
self.username_field = self.driver.find_element_by_name("username")
self.username_field.send_keys("test")
# password欄
self.password_field = self.driver.find_element_by_name("password")
self.password_field.send_keys("test")
# Loginボタンを押下
self.login_button = self.driver.find_element_by_name("Login")
self.login_button.click()
# ログイン失敗時エラーメッセージが適切かをテスト
self.errMsg = self.driver.find_element_by_class_name("message")
self.assertEqual("Login failed",self.errMsg.text)
# テキストボックスがリセット(長さ0)になっているかをテスト
self.assertEqual(0, len(self.driver.find_element_by_name("username").text))
self.assertEqual(0, len(self.driver.find_element_by_name("password").text))
# def tearDown(self):
# # close browser
# self.driver.quit()
# インスタンスを共有する場合はデコレータ付きでtearDownClassを使う
@classmethod
def tearDownClass(cls):
cls.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
#unittest.main()
実行結果例:
test_loginErr (__main__.LoginTests) ... ok
----------------------------------------------------------------------
Ran 1 test in 9.370s
OK
いいなと思ったら応援しよう!
![fz5050](https://assets.st-note.com/production/uploads/images/33869673/profile_56684e35407d563dbeb38e0a193976a0.png?width=600&crop=1:1,smart)