水豚 (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
我找不到水豚来查找复选框元素。
我已经尝试了所有常用的方法:
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