以下は私が試したいくつかのアプローチです。私はWatirSplashフレームワークを使用していませんでしたが、同じ概念が適用されました(ただし、試行されたWatirSplashサンプルコードは100%正確ではない可能性があります)。
解決策1:ページオブジェクトを返す
私の個人的な好みは、ページオブジェクトがページオブジェクトを返さないようにすることです。代わりに、テスト内の各ページオブジェクトの明示的な初期化を読んだり操作したりする方が簡単だと思います。アリスタースコットは彼のブログでこれについて議論しました。
テストは次のようになります。
#For login successful tests
page = App::Page::Login.new
page.login_btn.click
page = App::Page::VehicleSelection.new #The VehicleSelection page is explicitly initialized
page.validate_page #or whatever you want to do with the page
#For login failed tests
page = App::Page::Login.new
page.login_btn.click
page.validate_page #or whatever you want to do with the page
解決策2:ログイン用の複数のメソッドを作成する
もう1つの解決策は、2つのログイン方法を作成することです。1つは成功したログイン用で、もう1つは失敗したログイン用です。
ページオブジェクトは次のようになります。
module App
module Page
class Login < WatirSplash::Page::Base
url "http://[removed].com"
def login(user, password)
#Do whatever code to input name and password and then click the button
#Then redirect to the VehicleSelection page since that is where you will want to go most often
redirect_to VehicleSelection
end
def login_failed(user, password)
login(user, password)
#Return the Login page (instead of the VehicleSelection page).
redirect_to Login
end
end
end
end
テストは次のとおりです。
#For login successful tests
login_page = App::Page::Login.new
vehicle_page = login_page.login(user, password)
vehicle_page.validate_page #or whatever you want to do with the Vehicle Selection page
#For login failed tests
login_page = App::Page::Login.new
login_page.login_failed(user, password)
login_page.validate_page #or whatever you want to do with the Login page
解決策3:ボタンがどこに向かっているのかを知らせる
別の解決策は、ログインボタンにリダイレクト先のページを認識させることです。
ページオブジェクトは次のようになります。
module App
module Page
class Login < WatirSplash::Page::Base
url "http://[removed].com"
def login_btn(login_successful=true)
if login_successful
modify button(:id => 'btnLogin'), :click => lambda {redirect_to VehicleSelection}
else
modify button(:id => 'btnLogin'), :click => lambda {redirect_to Login}
end
end
end
end
end
テストは次のとおりです。
#For login successful tests
login_page= App::Page::Login.new
vehicle_page = login_page.login_btn.click
vehicle_page.validate_page #or whatever you want to do with the Vehicle Selection page
#For login failed tests
login_page= App::Page::Login.new
login_page.login_btn(false).click
login_page.validate_page #or whatever you want to do with the Login page