I code it

Code and Life

神奇的capybara

capybara是一个ruby的gem,简言之,它是一个用来测试web应用的工具包,使用它可以模拟用户对web应用的操作。它可以通过CSS选择器选中页面上的元素,然后对这些元素应用一些操作,从而实现模拟用户操作。另外一个常见的场景是检测页面上某些元素是否存在,如我们经常会为页面添加一些动态的效果,在某个动作发生后,才会添加某些元素,这些都可以通过capybara来完成。

下面是一个rails的测试示例:

   1: require 'spec_helper'
   2:  
   3: describe "Static pages" do
   4:     subject { page }
   5:  
   6:     describe "Home page" do
   7:         before { visit root_path }
   8:         it { should have_selector('h1', :text => 'Sample App') }
   9:         it { should have_selector('title', :text => "Ruby on Rails") }
  10:         it { should_not have_selector('title', :text => '| Home') }
  11:     end
  12:  
  13:     describe "Help page" do
  14:         before { visit help_path }
  15:         it { should have_content('Help') }
  16:         it { should have_selector('title', :text => "Ruby on Rails | Help") }
  17:     end
  18:  
  19:     describe "About page" do
  20:         before { visit about_path }
  21:         it { should have_content('About us') }
  22:         it { should have_selector('title', :text => "Ruby on Rails | About us") }
  23:     end
  24:     
  25:     describe "Contact page" do
  26:         before { visit contact_path }
  27:         it { should have_selector('h1', :text => 'Contact') }
  28:         it { should have_selector('title', :text => 'Ruby on Rails | Contact') }
  29:     end
  30: end

visit接受一个url,并模拟浏览器打开该链接。have_selector则接受一个CSS选择器,并检测第二个参数(一个hash)中的key-value-pair在实际的页面中是否存在。

   1: it "signs me in" do
   2:   within("#session") do
   3:     fill_in 'Login', :with => 'user@example.com'
   4:     fill_in 'Password', :with => 'password'
   5:   end
   6:   click_link 'Sign in'
   7: end

这段代码则用以模拟用户登录,填入用户名/密码,然后点击文字为‘Sign in’的按钮进行登录,当然还可以检测页面是否跳转到正确的位置等。

   1: require 'spec_helper'
   2:  
   3: describe "admin pages" do
   4:     it "should jump to list when the link is clicked" do
   5:         visit '/admin_pages/admin'
   6:         click_link('User List')
   7:         current_path.should == '/admin_pages/list'
   8:     end
   9: end

先访问‘/admin_pages/admin’,然后点击该页面上的链接,则预期应该跳转到另一个页面:‘/admin_pages/list’。

capybara的driver是可配置的,driver是指使用哪种模拟器来运行页面,默认的是:rack_test,:rack_test不支持javascript,但是速度会比 :selenium快很多。很多情况下,可以对那些不需要javascript的页面使用:rack_test来跑,而其他的使用:selenium。

我打算在下一篇关于cucumber的介绍中,讨论一个更有意思的例子。

Comments