2014-01-09 4 views
31

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

Вот флажок

<span class="checkbox tos"> 
    <input id="agreement" name="agreement" onclick="agreeValidate();" type="checkbox" value="false"> 
    <label for="agreement">I accept the <a href="http://www.dev.com:3000/terms" target="_blank">Terms of Use</a>, <a href="http://www.dev.com:3000/privacy" 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. Однако я не уверен в этом.

Update

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

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

Это может не найти самый span элемент не проблема

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

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

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

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

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

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

+0

Пожалуйста, пост больше кода. В отдельности это выглядит так: 'find ('# agreement')' должен работать, чтобы найти этот флажок, поэтому, если это не работает, может быть что-то не так с окружающим кодом (возможно, он не загружает страницу правильно, или, возможно, на странице есть недопустимая разметка). –

+0

Какова ценность 'Capybara.default_wait_time'? –

ответ

8

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

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

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

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

3

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

0

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

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

-2

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

  1. Возможно, вы ищете флажок перед полной загрузкой страницы? Удостоверьтесь, что у вас достаточно времени ожидания до вызова find(#agreement)
  2. У вас может быть несколько тегов с одинаковым id = «соглашение». Удостоверьтесь, что у вас есть только один.
  3. Убедитесь, что страница действительна HTML.
  4. Убедитесь, что флажок виден и включен, а соглашение выполнено правильно() работает правильно.
+0

2 балла недействительны. Capybara не будет поднимать такую ​​ошибку, если бы было несколько элементов с таким локатором. –

+0

AFAIK также не имеет значения, включен ли вход, когда вызывается 'find'. Было бы важно, если вызывается 'click', но код OP останавливается на' find'. –

0

У меня такая же проблема ... Я попытался следующие он работает отлично ...

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

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

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

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

Capybara.ignore_hidden_elements = false 
+2

Я попробовал проверку ('# id',: visible => false), а Capybara поднял «Selenium :: WebDriver :: Error :: ElementNotVisibleError: элемент в настоящее время не виден и поэтому не может взаимодействовать с« Итак, решение, которое я придумал с нажатием фактического родительского элемента, который пользователь видит. В идеале Capybara делает то, что делает ваш пользователь, поэтому следует избегать нажатия на невидимый элемент. –

Смежные вопросы