Capybara не хочет выбирать узел ввода

Мой HTML / ERB выглядит так

<fieldset class="row notifications">
    <legend>
        <hr class="dash blue inline">
        <%= t :my_notifications %>
    </legend>

    <label>
        <%= f.check_box(:subscribed_to_news) %>
        <span></span>
        <span class="checkbox-text"><%= t :accepts_to_receive_news %></span>
        <br>
    </label>
</fieldset>

Когда я отлаживаю свой тест огурца с капибарой, я нахожу флажок уведомления f.check_box(:subscribed_to_news)в этом беспорядке

page.find('.notifications label')['innerHTML']
# => "ntt<input name="user[subscribed_to_news]" type="hidden" value="0"><input type="checkbox" value="1" checked="checked" name="user[subscribed_to_news]" id="user_subscribed_to_news">ntt<span></span>ntt<span class="checkbox-text">blahblahblah</span>ntt<br>nt"

Но по какой-то причине я не могу найти вложенные входные данные или найти их по ID

page.find('.notifications label input') 
# => Capybara::ElementNotFound Exception: Unable to find css ".notifications label input"
page.find('.notifications label #user_subscribed_to_news') # => Capybara::ElementNotFound Exception: Unable to find css ".notifications label #user_subscribed_to_news"

Однако выбор метки работает

page.find('.notifications label')
# => #<Capybara::Node::Element tag="label" path="//HTML[1]/BODY[1]/DIV[1]/MAIN[1]/SECTION[1]/FORM[1]/FIELDSET[3]/LABEL[1]">

Что я делаю не так ? Я просто хочу проверить чертов флажок :'(

2 ответа

  1. Скорее всего, причина в том, что флажок на самом деле скрыт CSS, а затем заменен изображениями, чтобы включить идентичный стиль флажков в разных браузерах. Если вы используете последнюю капибару, вы можете нажать на нее метку, когда флажок скрыт вызовом

    page.check('user_subscribed_to_news', allow_label_click: true) # you can also set Capybara.automatic_label_click = true to default to this behavior
    

    или если вы используете старую капибару, вам нужно будет нажать на метку самостоятельно

    page.find(:label, "blahblahblah").click #match on labels text
    

    или

    page.find(:label, for: 'user_subscribed_to_news').click #match on labels for attribute if set
    
  2. Казалось бы, флажок недоступен через обычный css /xpath…

    Я ушел, используя javascript

    page.execute_script(%Q{document.querySelector('#{area} input##{selector}').click()})