以下是Slim。
.checkboxes__item
= f.check_box :insert_thumbnail, { checked: @article.new_record? || @article.insert_thumbnail, class: 'a-toggle-checkbox' }
= f.label :insert_thumbnail, 'insert thumbnail?'
HTML
<input name="article[insert_thumbnail]" type="hidden" value="0">
<input class="a-toggle-checkbox"
type="checkbox"
value="1"
checked="checked"
name="article[insert_thumbnail]"
id="article_insert_thumbnail">
<label for="article_insert_thumbnail">insert thumbnail?</label>
</div>
我想在E2E测试中选中此复选框,但它不起作用。
check 'insert thumbnail?', visible: false
Error:
ArticlesTest#test_uncheck_checkbox_whether_to_display_thumbnail_in_body:
Selenium::WebDriver::Error::ElementNotInteractableError: element not interactable
(Session info: headless chrome=117.0.5938.62)
test/system/articles_test.rb:292:in `block in <class:ArticlesTest>'
我理解这个错误意味着该元素存在但无法操作。
这是CSS造成的吗?或者我应该传递一个对检查方法不可见的选项?
.a-toggle-checkbox
+size(0)
display: block
+position(fixed, left 0)
opacity: 0
overflow: hidden
visibility: hidden
uncheck 'insert thumbnail?', visible: true
Error:
ArticlesTest#test_uncheck_checkbox_whether_to_display_thumbnail_in_body:
Capybara::ElementNotFound: Unable to find visible checkbox "insert thumbnail?" that is not disabled
test/system/articles_test.rb:292:in `block in <class:ArticlesTest>'
scroll_to 'insert thumbnail?'
uncheck 'insert thumbnail?', visible: false
find('label[for=article_insert_thumbnail]').click
=>我可以点击。但是我想使用
check/uncheck
方法。
automatic_label_click
选项即可。
“...如果复选框/单选按钮不可见,将尝试单击关联的元素。”
check
方法,例如
check 'insert thumbnail?', allow_label_click: true
[此处]https://github.com/teamcapybara/capybara/blob/3.40.0/lib/capybara/node/actions.rb#L364)是实际的方法,如果此选项是,则有二次尝试true(并且错误是“可捕获的”,在您的情况下)。然后,这将查找标签并调用 click (现在似乎对您有用)
def _check_with_label(selector, checked, locator,
allow_label_click: session_options.automatic_label_click, **options)
options[:allow_self] = true if locator.nil?
synchronize(Capybara::Queries::BaseQuery.wait(options, session_options.default_max_wait_time)) do
el = find(selector, locator, **options)
el.set(checked)
rescue StandardError => e
raise unless allow_label_click && catch_error?(e)
begin
el ||= find(selector, locator, **options.merge(visible: :all))
unless el.checked? == checked
el.session
.find(:label, for: el, visible: true, match: :first)
.click(**(Hash.try_convert(allow_label_click) || {}))
end
rescue StandardError # swallow extra errors - raise original
raise e
end
end
end
```