Rieles, Carpincho. No se puede marcar el elemento de casilla de verificación
El siguiente es 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>
Me gustaría marcar esta casilla en la prueba E2E, pero no funciona.
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>'
Entiendo que este error significa que el elemento existe pero no se puede manipular.
¿Esto se debe a CSS? ¿O debería simplemente pasar una opción que no sea visible para el método de verificación?
.a-toggle-checkbox
+size(0)
display: block
+position(fixed, left 0)
opacity: 0
overflow: hidden
visibility: hidden
- Establece la opción visible en verdadero
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>'
- Desplácese hasta
scroll_to 'insert thumbnail?'
uncheck 'insert thumbnail?', visible: false
- buscar + hacer clic
find('label[for=article_insert_thumbnail]').click
=> Puedo hacer clic, pero quiero usar check/uncheck
el método.
Debido al hecho de que sus casillas de verificación no están visibles y está apuntando al elemento de etiqueta con su selector, creo que solo necesita habilitar la automatic_label_click
opción.
Si intentará hacer clic en el elemento <label> asociado si la casilla
Element#choose
de verificación/botón de opción no está visible.Element#check
Element#uncheck
Capybara.configure do |config|
config.automatic_label_click = true
end
O pasar esa opción explícitamente al check
método, por ejemplo
check 'insert thumbnail?', allow_label_click: true
Aquí está el método real, que tiene un intento secundario si esta opción es verdadera y el error es "detectable", como ocurre en su caso ( consulte a continuación ).
Esto luego buscará la etiqueta y llamará a hacer clic (lo que parece funcionar para usted ahora)
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
Como referencia, los "Errores detectables" ( catch_error?(e) #=> true
) en este caso serían:
Selenium::WebDriver::Error::StaleElementReferenceError
Selenium::WebDriver::Error::ElementNotInteractableError
Selenium::WebDriver::Error::InvalidSelectorError
Selenium::WebDriver::Error::ElementClickInterceptedError
Selenium::WebDriver::Error::NoSuchElementError
Selenium::WebDriver::Error::InvalidArgumentError
Capybara::ElementNotFound