我无法让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,所以我已经手动编写了复选框,但它没有帮助。
这里发生了什么?
答案 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')