在使用Capybara和Selenium时,我似乎无法测试使用jQuery执行的光滑javascript操作。预期的行为是当用户单击“添加资源”链接时动态生成表单。 Capybara将能够单击该链接,但无法识别新的表单元素(即“resource [name]”)。
有没有办法为Capybara重新加载DOM,或者我还没有学到这个宝石的某些元素?
提前致谢!
==编辑==
目前正在尝试使用selenium:
wait_for_element
方法
==编辑==
在尝试执行以下操作时,我继续为nill类获取“未定义的方法'wait_for_element`:
@selenium.wait_for_element
看起来那个特定的方法,或者wait_for
和一个巨大的选择器访问我期望的DOM元素是正确的行动方案,但现在试图让selenium会话开始成为一个巨大的麻烦。
答案 0 :(得分:17)
我在RSpec中使用基于Webdriver的Capybara驱动程序,我这样配置和使用它肯定会处理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
答案 1 :(得分:7)
来自Capybara的文档:
使用异步时 JavaScript,你可能会遇到 您尝试的情况 与不是的元素交互 但仍然出现在页面上。水豚 自动处理这个 等待元素出现在 页。
你可能会有一些运气来增加等待时间:
Capybara.default_wait_time = 10
如果这没有用,那么我会邀请你联系GitHub项目的某人,写信给邮件列表或提交问题报告。
答案 2 :(得分:0)
甚至wait_until从Capybara 2.0中删除。仍然有用并从下面获取代码:
def wait_until(delay = 1)
seconds_waited = 0
while ! yield && seconds_waited < Capybara.default_wait_time
sleep delay
seconds_waited += 1
end
raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield
end