Page Object这种模式来组织自动化测试脚本应该说是目前比较流行的方式,这种模式有助于提高脚本的可维护性和健壮性。简单地说把,就是把页面对象和操作步骤按照Page为单位组织。举个例子吧,之前我们的脚本都是这样写的:
?
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
?
?
当我们使用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
?这样代码很容易就能读懂,各个步骤都是干什么的,阅读起来比较清晰
?
具体的实现代码如下:
?
?
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 # UserPage
?
这个实现起来, 其实也很简单,但是程序结构会显得非常清晰。当然还有其他的更高级的实现方法,这里只做抛砖引玉的工作吧,下面怎么发展,可以再深入研究。