Rspec 水豚:找不到css

Rspec 水豚:找不到css,rspec,capybara,capybara-webkit,Rspec,Capybara,Capybara Webkit,我用水豚点击一个复选框,但无论我做什么,它似乎都找不到。我能够正确地找到范围和范围内的标签,但不能找到我实际需要的输入 这是复选框 <span class="checkbox tos"> <input id="agreement" name="agreement" onclick="agreeValidate();" type="checkbox" value="false"> <label for="agreement">I accept the &

我用水豚点击一个复选框,但无论我做什么,它似乎都找不到。我能够正确地找到范围和范围内的标签,但不能找到我实际需要的输入

这是复选框

<span class="checkbox tos">
  <input id="agreement" name="agreement" onclick="agreeValidate();" type="checkbox" value="false">
  <label for="agreement">I accept the <a href="http://www.dev.com:3000/terms" target="_blank">Terms of Use</a>, <a href="http://www.dev.com:3000/privacy" target="_blank">Privacy Policy</a>, and am at least 13 years old</label>
</span>
然而,他们都给了我同样的错误

Unable to find css "#agreement" (Capybara::ElementNotFound)
我还想知道,当选中复选框时,这些方法中是否有一种会触发
onclick
方法?我觉得
find(:css,#agreement')。set(true)
不会触发
onclick
事件。不过,其余的我不确定

更新

我还尝试过通过xpath选择元素。以下是我发现的各种情况

find(:xpath, '//*[@id="registration"]/span[2]')
这可以找到
span
元素,没有问题

find(:xpath, '//*[@id="registration"]/span[2]/input')
这找不到我需要的元素,但是这个xpath在chrome的控制台中正确地选择了元素

find(:xpath, '//*[@id="agreement"]')
find(:xpath, '//*[@id="registration"]/span[2]/label')
这无法找到我需要的元素,但xpath会在chrome的控制台中选择该元素

find(:xpath, '//*[@id="agreement"]')
find(:xpath, '//*[@id="registration"]/span[2]/label')

这可以在
span
中找到
标签
元素,没有问题。

尝试添加
:visible
选项设置为false

find('#agreement', visible: false).click
默认情况下,水豚只能找到可见的元素。似乎底层驱动程序将此输入标识为不可见,所以水豚没有找到它


:visible
选项也受大多数其他水豚方法的支持(如
检查
有css?
有选择器
,等等)

试试这个
页面。执行脚本($('.\35;协议').attr('checked',true')
。要实现这一点,您应该使用
js:true

标记您的示例。问题是,由于您被带到其他页面,因此无法呈现该页面。要解决这个问题,您不需要更改您的水豚代码。您可能需要对控制器代码进行一些更改


我有这个想法,因为你在一篇评论中提到,你在执行
保存和打开页面时,会被带到域的内部服务器。请向我提供您在内部服务器中看到的详细信息。您是否在那里看到任何错误消息?另外,请向我提供您要选中复选框的视图的控制器操作的代码,以及在该控制器操作中调用的您定义的任何其他代码

如果看不到整个HTML页面,很难判断。以下是一些可能的问题:

  • 在页面完全加载之前,您可能正在查找复选框?在调用
    find(#agreement)
  • 您可能有多个具有相同id=“协议”的标签。确保你只有一个
  • 确保页面是有效的HTML
  • 确保复选框可见并已启用,并且agreeValidate()工作正常

  • 我也有同样的问题。。。我试了以下方法,效果很好

    find('#tos', visible: false).set(true)
    

    我昨天有一个确切的问题。水豚自动忽略输入,因为它是不可见的。我用以下方法解决了这个问题:

    find('#agreement', :visible => false).click
    
    您还可以将以下内容添加到env.rb中,以使水豚能够与所有隐藏元素交互:

    Capybara.ignore_hidden_elements = false
    

    请发布更多的代码。单独来看,
    find(“#agreement”)
    应该可以找到该复选框,因此如果不起作用,则周围的代码可能有问题(可能根本没有正确加载页面,或者页面中有无效标记).水豚的值是多少?默认等待时间?2点无效。如果有多个元素带有这样的定位器,Capybara不会引发这样的错误。当然,调用
    find
    时是否启用输入也不重要。如果调用了
    click
    ,但OP的代码在
    find
    上停止执行,这将很重要。我尝试了检查(“#id”,:visible=>false)Capybara提出了“Selenium::WebDriver::Error::ElementNotVisibleError:元素当前不可见,因此可能无法与之交互”,因此我提出的解决方案涉及单击用户确实看到的实际父元素。理想情况下,水豚和用户一样,所以应该避免点击不可见的元素。