我在 RSpec 中为 Capybara 使用基于 Webdriver 的驱动程序,我像这样配置和使用它,它肯定会处理 JS 并且不需要重新加载 dom。关键是使用 wait_until 和当您的 AJAX 响应完成时为真的条件。
before(:each) do
select_driver(example)
logout
login('databanks')
end
def select_driver(example)
if example.metadata[:js]
Capybara.current_driver = :selenium
else
Capybara.use_default_driver
end
end
it "should let me delete a scenario", :js=>true do
select("Mysite Search", :from=>'scenario_id')
wait_until{ page.has_content?('mysite_searchterms')}
click_on "delete"
wait_until{ !page.has_content?('mysite_searchterms')}
visit '/databanks'
page.should_not have_content('Mysite Search')
end
昨晚我还想出了一个技巧来减慢 webdriver 的速度,就像这样,如果你想用慢动作看东西:
#set a command delay
require 'selenium-webdriver'
module ::Selenium::WebDriver::Remote
class Bridge
def execute(*args)
res = raw_execute(*args)['value']
sleep 0.5
res
end
end
end
正如其他人所提到的,如果您等待元素超时,您可以考虑增加这个:
Capybara.default_wait_time = 10