Capybara(恶作剧者)在表格中找不到复选框

时间:2016-11-17 07:56:54

标签: ruby-on-rails checkbox capybara poltergeist

我无法让Capybara找到一个复选框元素。

我尝试了所有常用方法:

find_field
check
find
click_on

好像元素不在那里。如果我选择父元素,并查看它的innerHTML,则包含复选框:

(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=\"\">\

但是选择不存在的子元素:

(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,所以我已经手动编写了复选框,但它没有帮助。

这里发生了什么?

2 个答案:

答案 0 :(得分:2)

隐藏该复选框以允许在所有浏览器中进行统一样式化。由于您正确关联了标签元素,因此您可以告诉check单击标签而不是实际的复选框

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

答案 1 :(得分:0)

由于CSS样式,隐藏了checkbox元素并且标签用于呈现它。因此,这个元素被capybara的默认行为所忽略,以忽略隐藏的元素。

我使用

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