1

我正在使用 Watir Splash 框架来测试一个 Web 应用程序,并且我已经设置了两个页面类。第一个是“登录”页面,详细信息如下:

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

另一个页面类是“车辆选择”页面。我使用了此处文档中所示的修改方法,以确保成功登录后车辆选择页面对象可用于 RSpec。

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

任何帮助表示赞赏。此外,我对测试框架的其他建议持开放态度,特别是如果有更多示例代码可供我参考。

4

2 回答 2

2

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

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

我个人的偏好是不让页面对象返回页面对象。相反,我发现更容易阅读/使用测试中每个页面对象的显式初始化。Alister Scott 在他的博客中讨论了这个问题。

您的测试将如下所示:

#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:创建多种登录方法

另一种解决方案是创建两种登录方法 - 一种用于成功登录,一种用于不成功登录。

页面对象可以是:

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
于 2012-11-29T18:10:22.197 回答
1

感谢您试用我的宝石 WatirSplash。我会在解决方案#2 的行中写一些东西——例如,为成功登录和失败登录创建两个单独的方法。#modify两种方法都不需要使用,就像贾斯汀一样。

另外,我建议您使用我的其他宝石测试页面,它或多或少与 WatirSplash 中的页面对象相同,但它被提取到单独的 gem 中 - WatirSplash 将在长期内被弃用,因为所有它的部分被提取到单独的 gem 中,以便更好地控制每个项目中需要哪些功能。

于 2012-11-29T19:43:55.080 回答