Подтвердить что ты не робот

Capybara: Не удалось найти css

Я использую capybara, чтобы щелкнуть флажок, однако он не может найти его независимо от того, что я делаю. Я могу правильно найти как диапазон, так и метку внутри пролета, но не тот ввод, который мне действительно нужен.

Вот флажок

<span class="checkbox tos">
  <input id="agreement" name="agreement" onclick="agreeValidate();" type="checkbox" value="false">
  <label for="agreement">I accept the <a href="#" onclick="location.href='http://www.dev.com:3000/terms'; return false;" target="_blank">Terms of Use</a>, <a href="#" onclick="location.href='http://www.dev.com:3000/privacy'; return false;" target="_blank">Privacy Policy</a>, and am at least 13 years old</label>
</span>

И вот некоторые из вещей, которые я пробовал

page.check('agreement')
find(:css, '#agreement').set(true)
find('#agreement').set(true)
find('#agreement').click

Однако все они дают мне ту же ошибку

Unable to find css "#agreement" (Capybara::ElementNotFound)

Мне также интересно, будет ли любой из этих методов отключен метод onclick, когда будет установлен флажок? Мне кажется, что find(:css, '#agreement').set(true) не вызывает событие onclick. Однако я не уверен в этом.

Обновление

Я также попытался выбрать элемент через xpath. Вот несколько вещей, которые я обнаружил

find(:xpath, '//*[@id="registration"]/span[2]')

Это не может найти элемент span

find(:xpath, '//*[@id="registration"]/span[2]/input')

Это не может найти нужный элемент, но этот xpath правильно выбирает элемент в консоли Chrome

find(:xpath, '//*[@id="agreement"]')

Это не может найти нужный элемент, но xpath выбирает элемент в консоли chrome

find(:xpath, '//*[@id="registration"]/span[2]/label')

Это может найти элемент label в span без проблем.

4b9b3361

Ответ 1

Вчера у меня был точный вопрос. Capybara автоматически игнорировал вход из-за невидимости. Я решил это со следующим:

find('#agreement', :visible => false).click

Вы также можете добавить в env.rb следующее: чтобы Capybara взаимодействовал со всеми скрытыми элементами:

Capybara.ignore_hidden_elements = false

Ответ 2

Попробуйте добавить параметр :visible в значение false.

find('#agreement', visible: false).click

По умолчанию Capybara находит только видимые элементы. Кажется, что базовый драйвер идентифицировал этот вход как невидимый, поэтому он не был найден Капибарой.

Опция

:visible также поддерживается большинством других методов Capybara (например, check, has_css?, have_selector и т.д.)

Ответ 3

Попробуйте page.execute_script("$('#agreement').attr('checked', true)"). Чтобы сделать эту работу, вы должны пометить свои примеры с помощью js: true

Ответ 4

Проблема заключается в том, что страница не отображается, потому что вы попали на другую страницу. Чтобы решить эту проблему, вам не нужно менять код Capybara. Вероятно, вам придется внести некоторые изменения в свой код контроллера.

У меня возникла эта идея, так как вы подняли в одном из комментариев, что вы попали на внутренний сервер своего домена при выполнении save_and_open_page. Пожалуйста, предоставьте мне подробную информацию о том, что вы видите на внутреннем сервере. Есть ли сообщения об ошибках, которые вы там видите? Кроме того, пожалуйста, предоставьте мне свой код для действия контроллера этого вида, в котором вы хотите установить флажок, и любой другой код, который вы определили, который вызвал действие этого контроллера.

Ответ 5

У меня такая же проблема... Я попробовал следующее, это прекрасно работает...

find('#tos', visible: false).set(true)

Ответ 6

Трудно сказать, не видя всю HTML-страницу. Вот некоторые возможные проблемы:

  • Возможно, вы ищете флажок перед полной загрузкой страницы? Убедитесь, что у вас достаточно времени ожидания до вызова find(#agreement)
  • У вас может быть несколько тегов с одинаковым id = "соглашение". Убедитесь, что у вас есть только один.
  • Убедитесь, что страница действительна HTML.
  • Удостоверьтесь, что флажок виден и включен, а соглашениеValidate() работает правильно.