Capybara может найти, но не fill_in

У меня очень странное поведение с Капибарой. Он упрямо отказывается заполнить поля моей формы входа.

<fieldset>
  <div class="clearfix">
    <label for="user_email">E-Mail Adresse</label>
    <div class="input">
      <input id="user_email" name="user[email]" size="30" type="email" value="">
    </div>
  </div>

  <div class="clearfix">
    <label for="user_password">Passwort</label>
    <div class="input">
      <input id="user_password" name="user[password]" size="30" type="password" value="">
    </div>
  </div>

  <div class="clearfix">
    <div class="input">
      <input name="user[remember_me]" type="hidden" value="0">
      <input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1">
      <label for="user_remember_me">angemeldet bleiben</label>
    </div>
  </div>
</fieldset>

И здесь начинается самое интересное:

within("#login_form"){ find("#user_email")}                                              
=> #<Capybara::Element tag="input" path="/html/body/div[2]/div[@id='content']/div/div[1]/form[@id='login_form']/fieldset/div[1]/div/input[@id='user_email']">
within("#login_form"){ fill_in("#user_email", with: "[email protected]")}                  
Capybara::ElementNotFound: Unable to find field "#user_email"

Я не совсем понимаю, как можно найти и не найти элемент. Еще одна пара глаз на этом будет оценена.

Ответ 1

Локатор для find и fill_in отличается:

  • find - Когда первый параметр не является символом, предполагается, что это Capybara.default_selector - то есть css-селектор или xpath.
  • fill_in - первый параметр - это имя поля, идентификатор или текст ярлыка.

Строка "#user_email" представляет css-селектор. Вот почему он работает в find, но не fill_in.

Чтобы работать fill_in, вам нужно просто передать значение id, то есть просто "user_email".

within("#login_form"){ fill_in("user_email", with: "[email protected]")}