Rails,水豚。无法检查复选框元素

问题描述 投票:0回答:1

以下是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
  • 将可见选项设置为 true
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
方法。

ruby-on-rails capybara
1个回答
0
投票

我相信您只需要启用

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
``` 
© www.soinside.com 2019 - 2024. All rights reserved.