Capybara点击链接执行js不起作用

时间:2016-09-21 16:59:47

标签: ruby-on-rails

使用Capybara时我有这段代码:

a = page.find(".show-link")
a.click
expect(page).not_to have_css(".someClass.hidden")

我有链接

<a class="show-link" href="">Show me!</a>

我还有js函数绑定到click事件,它从元素中删除了隐藏的类:

$("body").on("click", ".show-link",function(){$('.someClass').removeClass('hidden');return false;});

但不是在点击时执行我的js功能,而是重定向到另一个页面。

我尝试设置href = "#",我尝试将<a>更改为<span>但不起作用 脚本未执行。

3 个答案:

答案 0 :(得分:0)

在测试定义中,添加title value2 ,以便:

:js => true

Capybara将使用describe 'some stuff which requires js', :js => true do it 'will test this or that' do ... end end (默认驱动程序)来测试您的JavaScript功能。它非常酷,因为它使用实际的浏览器窗口。

答案 1 :(得分:0)

如果您使用的是rspec,那么Christian-G是正确的。如果您使用的是Minitest,则适用相同的想法,但会执行以下操作:

test "this is my test" do
  Capybara.current_driver = Capybara.javascript_driver
  #test logic goes here
  Capybara.use_default_driver
end

理想情况下,你不会像这样更改内联驱动程序,但是将它们放入你的设置和拆卸测试中。像这样:

setup do
  Capybara.current_driver = Capybara.javascript_driver
end

teardown do 
  Capybara.use_default_driver
end

Capybara documentation中也列出了这一点。

答案 2 :(得分:0)

正如已经提到的,你需要使用一些支持js执行的驱动程序(webkit,poltergeist,selenium)。 此外,应该只有一个匹配元素,即如果有一个元素".someClass.hidden"而另一个".someClass.shown"测试将无法通过

另一个选择是你错误地使用了Capybara匹配器: expect(page).not_to have_css(".someClass.hidden") 应该 expect(page).to have_no_css(".someClass.hidden") 为什么吗

Capybara有等待某事发生的逻辑,所以在这种情况下它会检查该页面是否有.someClass.hidden并立即找到这样的元素。如果它是have_no_css它将找到元素,但然后重试几次等待它消失