我正在为应用编写几个功能规格,并使用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
中看到了COMMIT
和test.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
答案 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