2012-11-28 40 views
1

我正在使用Watir Splash框架来测试Web应用程序,并且我已经设置了两个页面类。第一个是这里详细说明的“登录”页面:watir splash页面对象 - 如何确保正确的页面对象实例化

module App 
module Page 
class Login < WatirSplash::Page::Base 
    url "http://[removed].com" 

    def login_btn 
     modify button(:id => 'btnLogin'), :click => lambda {redirect_to VehicleSelection} 
    end 

其他页面类是“Vehicle Selection”页面。我已经使用文档here中显示的修改方法来确保成功登录后,RSpec可以使用车辆选择页面对象。

但是如果登录失败会发生什么?我有一些测试用例故意将不正确的信息输入到登录表单中,以确保身份验证正常工作。 RSpec需要在“Login”类中定义的方法来访问正确的元素来完成测试用例。在这种情况下,无论如何,我已指定方法“VehicleSeleciton”对象的方式将被返回。 (或如此看来)

任何帮助表示赞赏。另外,我愿意接受其他关于测试框架的建议,特别是如果有更多示例代码供我参考。

回答

2

下面是我尝试过的几种方法。我没有使用WatirSplash框架,但应用了相同的概念(尽管尝试WatirSplash示例代码可能不是100%准确)。

解决方案1:请返回页面对象

我个人的偏好是没有返回页面对象的页面对象。相反,我发现阅读/处理测试中每个页面对象的显式初始化更容易。 Alister Scott在他的blog中讨论过这个问题。然后

你的测试看起来像:

#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:创建登录

另一种解决方案多种方法,将创建两个登录方法 - 一个成功登录,一个用于登录失败。

页面对象可以是:

随着测试是:

#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 
+0

感谢您的详细回复。这很有帮助。你提到你没有使用watirsplash框架;哪些是你用过的,你能说一些关于你为什么选择这种方式的话吗? –

+1

对于一个页面对象框架,我一直在使用一个定制的框架。它从[Cheezy的页面对象gem](https://github.com/cheezy/page-object)和[Alister Scott](http://watirmelon.com/2012/06/04/roll-your -own页对象/)。 –

1

感谢您试用我的宝石WatirSplash。我会写一些解决方案#2的内容 - 例如为成功登录和登录失败创建两个单独的方法。在任何一种方法中都不需要使用#modify,就像Justin一样。

此外,我建议你使用我的其他宝石test-page代替,它几乎与WatirSplash中的页面对象相同,但它被提取到单独的宝石中 - WatirSplash将在长期期限内弃用将其所有部分都转换成独立的宝石,从而更好地控制每个项目需要哪些功能。

+0

感谢您的建议。我会看看测试页。任何其他宝石,我应该考虑使用?你使用factory_girl吗? –

+0

您也可以使用factory_girl,但这不是必需的。然而,我会推荐它在Rails Fixtures上。 –