Capybara:无法找到css

时间:2014-01-09 23:43:25

标签: 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 <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>

以下是我尝试过的一些事情

page.check('agreement')
find(:css, '#agreement').set(true)
find('#agreement').set(true)
find('#agreement').click

然而,他们都给我同样的错误

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"]')

这找不到我需要的元素,但xpath选择chrome控制台中的元素

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

这可以在label中找到span元素而没有任何问题。

6 个答案:

答案 0 :(得分:36)

我昨天遇到了确切的问题。由于它不可见,Capybara自动忽略了输入。我解决了以下问题:

find('#agreement', :visible => false).click

您还可以将以下内容添加到env.rb中,以使Capybara能够与所有隐藏元素进行交互:

Capybara.ignore_hidden_elements = false

答案 1 :(得分:10)

尝试将:visible选项设置为false。

find('#agreement', visible: false).click

默认情况下,Capybara仅查找可见元素。似乎潜在的驱动程序将此输入识别为不可见,因此Capybara尚未找到它。

大多数其他Capybara方法也支持

:visible选项(例如checkhas_css?have_selector等。

答案 2 :(得分:3)

试试这个page.execute_script("$('#agreement').attr('checked', true)")。为了完成这项工作,您应该使用js: true

标记您的示例

答案 3 :(得分:1)

我有同样的问题......我尝试了下面的工作正常......

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

答案 4 :(得分:0)

问题是页面没有被渲染,因为你被带到了其他页面。要解决此问题,您无需更改Capybara代码。您可能需要对控制器代码进行一些更改。

我得到了这个想法,因为你在其中一条评论中提到你在执行save_and_open_page时被带到你域的内部服务器。请向我提供您在内部服务器中看到的内容的详细信息。你在那里看到任何错误信息吗?另外,请向我提供您要检查复选框的视图的控制器操作的代码以及您在该控制器操作中调用的任何其他代码。

答案 5 :(得分:-1)

很难说没有看到整个HTML页面。以下是一些可能的问题:

  1. 在页面完全加载之前,您可能正在寻找复选框?在致电find(#agreement)
  2. 之前,请确保您有足够的等待时间
  3. 您可能有多个具有相同ID =“协议”的标签。确保你只有一个。
  4. 确保页面有效HTML。
  5. 确保该复选框可见,并已启用,并且AgreeValidate()正常运行。