見出し画像

Le Selenium avec P03:フォームへの入力とクリック(ログイン操作)

【0】はじめに

今回はSeleniumを使った入力フォームとクリック操作の練習をする。例としてDVWAのログイン画面で「username」と「password」を入力してLoginボタンを押下するまでを実施する。

■サンプル画面

画像1

【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

【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

【3】ここまでのまとめコード

ここまでのまとめとして、
・テキストボックスにキー入力
・Loginボタンをクリック
・遷移後の画面でログアウトボタンを押下
・再びログイン画面に戻る
という操作をしてみる。

画像4

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()メソッドを作る
・テストコードを書く

■テストする内容
「ログイン失敗時のエラーメッセージの表示有無」と「テキストボックスの入力内容のリセット」が動作しているかテストしてみる。

画像5

例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

もっと応援したいなと思っていただけた場合、よろしければサポートをおねがいします。いただいたサポートは活動費に使わせていただきます。