实现 Login
有了上面的两座“桥”,具体的实现就简单多了,对于每一个业务操作,我们需要做的是 :
(1) 在一个 Ruby 对象中 (BookshopDSLBuilder) 实现一个同名的方法
(2) 在方法实现中,利用 watir 来操作界面元素。当然前提是我们需要知道界面上有哪些元素。
先来看一看 Login 的实现:
清单 3. Login
class BookshopDSLBuilder include Test::Unit::Assertions #include ruby unit 的 Assertion def self.execute( dsl) builder=new builder.instance_eval(File.read(dsl), dsl) builder end def initialize @login_url = 'http://localhost:3000/bookshop/login' #51Book 的入口 #creat a ie instance @ie= Watir::IE.new # 创建一个 Watir 的实例 end def login(user=nil,pwd=nil) @ie.goto @login_url @ie.text_field(:id,"user_name").set(user) # 设置用户名 @ie.text_field(:id,"user_password").set(pwd) # 设置密码 @ie.button(:type,"submit").click # 点击提交按钮 end end
实现 add_to_shop_cart
把书籍添加的购物车中这个操作相对复杂,因为它接收的参数是一个书籍的标题,而在界面上"Add to Cart"却是一个只包含 book id, 不包含标题的链接,所以无法直接定位。
清单 4. Add to Cart
<table width='100%' class='book'>
<tr>
<td>title:</td>
<td>Agile development</td> # 标题在这里
</tr>
<tr>
<td>description:</td>
<td>The book of agile development</td>
</tr>
<tr>
<td>price:</td>
<td>30.0</td>
</tr>
<tr>
<td colspan="2"> #Add_To_Cart Link 却在这里
<a href='/bookshop/add_to_cart/1' >Add to Cart</a>
</td>
</tr>
</table>
这种情况下就可以利用 Watir 对 xpath 强大的支持,先找到标题,在从标题找到链接,最后点击链接即可。
清单 5. 使用 XPath
def add_to_cart(title)
table = @ie.table(:xpath,
"//table[@class='book']/tbody/tr/td[text()='"+title+"']/../../../")
if table[1][2].text == title
href = table[4][1].links[1].href
@ie.link(:href,href).click
end
end
对于其他的业务操作,具体的实现方式也是大同小异,这里不再一一介绍,有兴趣的读者可以参见 附件 中的代码,最后我们来看一个面向业务的 Web 页面测试例子:
清单 6. 一个完整的例子
login 'andy','pass4you' add_to_cart 'Agile development' add_to_cart 'Savor Blue' add_to_cart 'Programming Ruby' change_quantity 'Agile development',10 change_quantity 'Savor Blue',10 change_quantity 'Programming Ruby',10 recalculate_cart assert_total_price_is 900 search_book 'Ant cookbook' add_to_cart 'Ant cookbook' assert_total_price_is 910










