水豚 (poltergeist) 在表单中找不到复选框

Capybara (poltergeist) cannot find checkbox in form

我找不到水豚来查找复选框元素。

我已经尝试了所有常用的方法:

find_field
check
find
click_on

就好像这个元素不存在一样。如果我 select 父元素,并查看它的内部 HTML 包含复选框:

(byebug) all(:css, '.checkbox.form-group').last['innerHTML']
\n    <input type=\"checkbox\" id=\"google_agreed_to_terms_at\" value=\"1\" required=\"true\" ng-model=\"agreed_to_terms\" required-notification=\"Please agree to the terms and conditions\" class=\"ng-pristine ng-untouched ng-empty ng-invalid ng-invalid-required\" bs-validation=\"\">\

但是 select 它不存在子元素:

(byebug) all(:css, '.checkbox.form-group').last.all :xpath, './*'
[#<Capybara::Node::Element tag="label" 
path="//HTML[1]/BODY[1]/DIV[2]/DIV[1]/DIV[2]/FORM[1]/DIV[1]/LABEL[1]">]

我觉得我要疯了。

这里是相关代码(复制自save_and_open_page

<div class="checkbox form-group">
  <input type="checkbox" id="agreed_to_terms_at" value="1" required="true" ng-model="agreed_to_terms" required-notification="Please agree to the terms and conditions" class="ng-pristine ng-untouched ng-empty ng-invalid ng-invalid-required" bs-validation="">
  <label class="label-light" for="agreed_to_terms_at">
     I have read and agree to the terms</label>
</div>

我认为 rails 可能会生成稍微不合规的 HTML,所以我开始手动编写复选框,但没有帮助。

这是怎么回事?

由于 CSS 样式,复选框元素被隐藏,标签用于显示它。因此该元素被水豚的默认行为跳过以忽略隐藏元素。

我使用

解决了这个问题
find('#agreed_to_terms_at', :visible => false).trigger('click')

隐藏复选框以允许在所有浏览器中使用统一的样式。由于您有一个正确关联的标签元素,您可以告诉检查点击标签而不是实际的复选框

check('agreed_to_terms_at', allow_label_click: true)

如果复选框可见,它将单击该复选框,如果不可见,它将单击该标签。如果你想让它只点击你可以做的标签

find(:label, 'I have read and agree').click

或者

find(:label, for:'agreed_to_terms_at').click