Capybara Selenium webdriver Transactional Rollbacks可以解决问题

时间:2014-08-03 06:37:57

标签: ruby-on-rails selenium selenium-webdriver capybara integration-testing

我正在为应用编写几个功能规格,并使用Capybara附带的默认Selenium webdriver。这是我写的规范。

DatabaseCleaner.cleaning do
      find(:css,'.dropdown-toggle').click
      click_on "Locations"  
      find(:css, "#location-8-upgradesub-60").click 
      value1 = find(:css, "#location-8-review-subscription").text
      value1.should be == '(2) Reviews (Paid)'    
end

我在这个片段中面临两个问题:

1)Capybara并没有等待XHR过关,而是在此之前退出测试。如果我给睡眠条件约10秒,它就有效。

更新 解决了1)设置Capybara.default_wait_time = 15并编写帮助以确保jQuery不活动。 page.evaluate_script('jQuery.active').zero?

2)我无法回滚selenim模拟测试时发生的数据库事务。我在INSERT中看到了COMMITtest.log,但没有ROLLBACK,因为每次运行测试时我都需要不断更改我的规格。如果我使用DatabaseCleaner.strategy = :truncation,我的整个数据库都会被删除,这不是我想要的。

我已经在这个问题上进行了一些广泛的谷歌搜索,并且无法找到有效的解决方法。我也试过为测试服务器使用相同的事务线程。 Haven也取得了丰硕的成果!任何抬头或帮助将不胜感激。提前致谢!

更新

我按照此链接https://relishapp.com/rspec/rspec-rails/docs/transactions将我的规范放在before(:each)块中,并将值存储在@value1实例变量中,以将其与it中的所需值进行比较阻止。我也没有运气。

before(:each) do
  find(:css,'.dropdown-toggle').click
  click_on "Locations"
  find(:css, "#location-8-upgradesub-60").click
  wait_for_ajax #Helper method to wait for ajax call to get over 
  find(:css, "#location-8-review-subscription").should be_visible
  @value1 = find(:css, "#location-8-review-subscription").text
end

it "should open the dropdown, find Location and open it's modal", js:true do
    @value1.should be == '(2) Reviews (Paid)'
end

2 个答案:

答案 0 :(得分:0)

使用1),我认为have_content或have_selector将起作用。在检查内容/选择器存在之前,这些方法将等待几秒钟。您可以通过spec_helper.rb配置此时间。您可以在查找(..)之前放置have_content / have_selector。单击以确保它在下次测试之前存在。

答案 1 :(得分:0)

终于找到了解决方法。我在spec_helper.rb中添加了此代码段。不再使用Database Cleaner了。

参考http://www.opinionatedprogrammer.com/2011/02/capybara-and-selenium-with-rspec-and-rails-3/#comment-441060846。整个评论主题非常有用。

ActiveRecord::ConnectionAdapters::ConnectionPool.class_eval do
  def current_connection_id
    # Thread.current.object_id
    Thread.main.object_id
  end
end