使用Ruby实现简单的事物驱动的web应用的教程

2019-09-25 09:44:39王振洲

实现 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