page = LoginPage.new $selenium
page.login_as :name => 'xxx', :password => 'xxx'
不过既然用了Ruby,总要用一些ruby sugar吧,我们定义一个on方法来表达页面操作的环境:
def on page_type, &block
page = page_type.new $selenium
page.instance_eval &block if block_given?
end
之后我们就可以使用page object的类名常量和block描述在某个特定页面上操作了:
on LoginPage do
login_as :name => 'xxx', :password => 'xxx'
end
除了行为方法之外,我们还需要在page object上定义一些获取页面信息的方法,比如获取登录页面的欢迎词的方法:
def welcome_message
@driver.get_text 'xpath='
end
这样测试也可表达得更生动一些:
on LoginPage do
assert_equal 'Welcome!', welcome_message
login_as :name => 'xxx', :password => 'xxx'
end
当你把所有的页面都用Page Object封装了之后,就有效地分离了测试和页面结构的耦合。在测试中,只需使用诸如login_as和add_product_to_cart这样的业务行为,而不必依靠像id、name等这些具体且易变的页面元素了。当这些页面元素发生变化时,只需修改相应的page object就可以了,而原有测试基本不需要太大或太多的改动。
文章来源于领测软件测试网 https://www.ltesting.net/