Watir Webdriver的Page Object应用(2)

上一篇 / 下一篇  2013-01-28 13:41:26 / 个人分类:测试

如何去创建一个Page Object,下面有一些建议:

尽量给每一个page页面创建一个Page Object
如果一个页面包含过多的业务逻辑,你可以考虑将它创建为多个Page Object
把element的详细处理都封装起来
对于测试代码里,永远不要直接去操作element对象,或者操作browser。
如果使用Rspec或者Cucumber,在define_step里,不要有直接操作的代码
Page Object的目标是当页面发生变化是,你不需要去修改测试代码,而是修改后面的object层
不要在Page Ojbect中包含Assertion,断言应该仍在在代码层实现

我们来讨论一个实例:


browser = Watir::Browser.new
browser.goto "http://example.com/login"

browser.text_field(:name => "user").set "Mom"
browser.text_field(:name => "pass").set "s3cr3t"
browser.button(:id => "login").click

Watir::Wait.until { browser.title == "Your Profile" }
browser.div(:id => "logged-in").should exist

这是一个简单的例子,完全按照workflow去操作一个个element对象

如果将其Page Object化,那么看其起来是这个样子的:

site = Site.new(Watir::Browser.new)

login_page = site.login_page.open
user_page = login_page.login_as "Mom", "s3cr3t"

user_page.should be_logged_in

请注意一下对应关系


为了实现Page Obejcts化,我们需要将详细的步骤,封装起来:

class BrowserContainer
  def initialize(browser)
    @browser = browser
  end
end

class Site < BrowserContainer
  def login_page
    @login_page = LoginPage.new(@browser)
  end

  def user_page
    @user_page = UserPage.new(@browser)
  end

  def close
    @browser.close
  end
end # Site

class LoginPage < BrowserContainer
  URL = "http://example.com/login"

  def open
    @browser.goto URL
    self
  end

  def login_as(user, pass)
    user_field.set user
    password_field.set pass

    login_button.click

    next_page = UserPage.new(@browser)
    Watir::Wait.until { next_page.loaded? }

    next_page
  end

  private

  def user_field
    @browser.text_field(:name => "user")
  end

  def password_field
    @browser.text_field(:name => "pass")
  end

  def login_button
    @browser.button(:id => "login")
  end
end # LoginPage

class UserPage < BrowserContainer
  def logged_in?
    logged_in_element.exists?
  end

  def loaded?
    @browser.title == "Your Profile"
  end

  private

  def logged_in_element
    @browser.div(:id => "logged-in")
  end
end 

从上面代码可以看出,Page Objects化之后,我们的测试代码都是按照封装好的去书写,例如,将手工测试用例map到自动化测试步骤(Cucumber),在代码更迭之后,我们只需要去修改后面封装的对应代码,从而避免如下的问题发生:

1. 漏掉一部分代码没有更新
2. 更新错误
3. 打乱了原有的代码结构
4. 重复代码过多
5. 定位错误困难

当完成Page Object化之后,跟其他的工具集成就很简单了,例如,在cucumber中我们可以在初始化测试环境中加入一段代码:

require "watir-webdriver"
require "/path/to/site"

module SiteHelper
  def site
    @site ||= (
      Site.new(Watir::Browser.new(:firefox))
    )
  end
end

World(SiteHelper)

这样,得到一个更加合理优化的代码结构。

而且匹配过程变更加清晰明了:

 Given /I have successfully logged in/ do
   login_page = site.login_page.open

   user_page = login_page.login_as "Mom", "s3cr3t"
   user_page.should be_logged_in
 end


TAG:

 

评分:0

我来说两句

日历

« 2024-05-02  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 151555
  • 日志数: 185
  • 文件数: 6
  • 建立时间: 2007-08-06
  • 更新时间: 2015-01-06

RSS订阅

Open Toolbar