Seleniumで行っていたテストをPageObjectデザインパターンに書き換えてみる

 あるWebアプリのログインの成功と失敗を、Seleniumでテストしていた。HTML要素をIDから選択し、キーボード入力のエミュレートでログインIDとパスワードを入れて、と生々しいコードを書いていた。
 このたびはSeleniumでのテストにはPageObjectデザインパターンが推奨されているというのを知って、おもしろそうなので適用してみた。

 ログインの成功をテストしていた元のコード。若干生々しいDOMの操作をしている。
def test_login_success(self):

"""login success"""
self.driver.get(HOST + "/Auth/Login")

el1 = self.driver.find_element_by_name("_id")
el1.send_keys("testuser")

el2 = self.driver.find_element_by_name("password")
el2.send_keys("password")

el3 = self.driver.find_element_by_name("enter")
el3.click()

self.assertIn("Admin Page", self.driver.title)


 PageObjectデザインパターンの適用として、ログインフォームの入力からPOSTまでを行うクラスを用意する。
class LoginFormStory:

def __init__(self, driver):
driver.get(HOST + "/Auth/Login")
self._driver = driver

def enter_id(self, id_):
el = self._driver.find_element_by_name("_id")
el.send_keys(id_)
return self

def enter_password(self, password):
el = self._driver.find_element_by_name("password")
el.send_keys(password)
return self

def post_form(self):
el = self._driver.find_element_by_name("enter")
el.click()
return self

def is_authenticated(self):
if "Admin Page" in self._driver.title:
return True
else:
return False


 上記のクラスの用意によって、テストの進行をメッセージングで表現できる。
def test_login_success(self):

"""login success"""
is_authenticated = (
LoginFormStory(self.driver)
.enter_id("testuser")
.enter_password("password")
.post_form()
.is_authenticated()
)
self.assertTrue(is_authenticated)


可読性がめっちゃいい感じ。気に入った。
comment: 0