在rspec测试中点击第二个链接的问题

时间:2013-09-11 20:21:39

标签: rspec capybara capybara-webkit

当我的capybara测试遇到我的rspec文件中的第二个阻塞时,我无法单击链接或基本上执行任何操作。

所以我的代码如下: 注意 - 这是一个基本测试,我浏览到一个页面,在前一个块中创建一个调查,然后我在it块中的测试将是编辑和查看调查。

require 'spec_helper'
include Tests # - this is a module where I include the Capybara DSL

describe "Survey Tests" do


before :all do
  visit('http://mytestenv.com')
  fill_in('login', :with => 'testaccount@test.com')
  fill_in('password', :with => 'TestyTest')
  click_button('login_button')
  all('a.edit', :text => 'Edit')[0].click
  click_link('Polls & Feedback')
  click_link('Session Polls')
  click_link('Create New Session Poll')
  fill_in('question', :with => "New Question")
  choose('User can type a response')
  click_button('Add')
end



    describe "View and Edit polls" do

    it "allows you to view polls" do
      click_link('Polls & Feedback')
      click_link('View Poll')
      should have_no_css('.form_error')
      should have_content('Add another question')
      should have_content('Results')
    end


    it "allows you to edit a poll question" do
       click_link('Edit')
       first('a.blueb').click
       find('.checkbox').click
       click_link("Add an answer")
       fill_in('options[]', :with=>"Multiple answers")
       click_button('Save Changes')
       should have_no_css('.form_error')
    end

所以,当我使用webkit(或任何其他驱动程序,如chrome)时会发生什么事情,它将通过我的before语句运行没问题,然后它会在第一个块中运行而没有任何问题但是当它进入时它阻止的第二个,它然后扯掉并说它无法找到编辑链接。但是如果我把click_link('Edit)放在第一个it语句的底部(之后应该有have_content('Results')),那么它会点击链接没问题。所以当它进入第二个语句块时就会发生这种情况。有趣的是,如果我这样说:

session = Capybara::Session.new(:selenium)

在我的测试规范文件的顶部,并在我的规范帮助文件中注释掉webkit驱动程序信息,测试将运行并使用firefox完成而没有任何问题。

我的规范帮助文件如下:

require 'yaml'
require 'capybara'
require 'capybara/rspec'
require 'rspec-expectations'
require 'config'
require 'capybara-webkit'
require 'selenium/webdriver'


########### - chrome driver - ####################### #
#Capybara.default_selector = :css#
#Capybara.default_driver = :selenium#
#Capybara.run_server = false#
#Capybara.register_driver :selenium do |app|#
#  Capybara::Selenium::Driver.new(app, :browser => :chrome)
   #end




############# - Poltergeist - #######################
#Capybara.default_driver    = :poltergeist##Capybara.javascript_driver = :poltergeist##
#Capybara.run_server = false##
#Capybara.register_driver :poltergeist do |app|##
#Capybara::Poltergeist::Driver.new(app, {:inspector => true})
#end




############### - Capybara WebKit - ##################
Capybara.default_driver    = :webkit
Capybara.javascript_driver = :webkit
Capybara.run_server = false




#This will including the Capybara DSL in the tests
module Tests
    include Capybara::DSL
end

有谁知道我做错了什么?我尝试了各种不同的驱动程序,如chrome,firefox,poltergeist和capybara webkit,但总是同样的问题。

我使用的是ruby 1.9.3, - 安装的capybara版本是2.1.0和1.1.4。

非常感谢任何帮助!!

由于

1 个答案:

答案 0 :(得分:0)

问题是当你执行require capybara/rspec时,它会加载一个钩子,在每次测试后重置你的会话/浏览器(即阻止)。

如果您使用这个裸测试套件,您可以看到问题所在。请注意,运行第二个测试时,页面不再与第一个测试结束时相同。会话已重置。

require 'capybara'
require 'capybara/rspec'
require 'rspec/autorun' 

Capybara.default_driver = :selenium
include Capybara::DSL

describe 'stuff' do
    it '1' do
        visit('http://www.google.ca')
        puts page.current_url
        #=> "http://www.google.ca/"
    end

    it '2' do
        puts page.current_url
        #=> "about:blank"
    end     
end

作为一种解决方法,您可以修补reset_sessions!方法,无所事事。

如下所示,在应用此猴子补丁之后,测试2继续从测试1停止的浏览器开始。

require 'capybara'
require 'capybara/rspec'
require 'rspec/autorun' 

Capybara.default_driver = :selenium
include Capybara::DSL

module Capybara
    def self.reset_sessions!
      # Do nothing
    end
end

describe 'stuff' do
    it '1' do
        visit('http://www.google.ca')
        puts page.current_url
        #=> "http://www.google.ca/"
    end

    it '2' do
        puts page.current_url
        #=> "http://www.google.ca/"
    end     
end