2016-03-17 4 views
1

У меня есть спецификации функций javascript, которые отлично работают с селеном, но я бы хотел переключиться на capybara-webkit по нескольким причинам (CI, не вызывая окна браузера , и т.д).Невозможно заполнить поле ввода с помощью capybara-webkit

Я пытаюсь переключиться с селена, но что-то мешает моему коду работать правильно. У меня есть следующий помощник:

def capybara_login(user) 
    visit login_path 
    fill_in "email", with: user.email 
    fill_in "password", with: user.password 
    click_button "Log in" 
end 

Вот мой поле ввода, что в настоящее время выводится:

<input type="email" name="email" id="email" value="" class="form-control" placeholder="[email protected]" autocomplete="off"> 

Я проверил, что user.email не равна нулю. По какой-то причине, когда я использую capybara-webkit, это терпит неудачу и ничего не заполняется (я проверяю, делая save_and_open_page). Однако этот код работает отлично, если я использую регулярные capybara (не js) или селен для js.

Я что-то упустил? Любые идеи относительно того, что может помешать capybara webkit заполнить эти поля?

EDIT: Спасибо, Том за помощь. Таким образом, сохранение и открытая страница не будут отображаться в этих полях.

Я смог использовать save_and_open_screenshot, чтобы увидеть, что страница на самом деле просто застряла на загружаемом изображении на экране входа в систему. Если я делаю «sleep (1)», он записывается в порядке.

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

+1

Поскольку заполнение поля изменяет только значение свойства элемента (а не атрибут value), '# save_and_open_page' не является допустимым способом проверить, было ли поле изменено, оно покажет исходное содержимое. 'puts find (: field, 'email'). value' выдаст свойство value элемента, если вам нужно его проверить (' # save_and_open_screenshot' должен показать тоже). Что касается того, почему он не заполняется, у вас есть какое-либо поведение JS, которое связано с полями электронной почты (валидация и т. Д.), И может ли оно быть прикреплено после того, как оно уже было заполнено? Вы можете проверить это, поставив 'sleep 10' или так до вызова fill_in. –

+0

Том, я не знаю, кто ты, но ты продолжаешь отвечать на мои вопросы, и я очень ценю это, ха-ха! Хорошо, это отличный момент, и есть смысл, почему я не вижу наполненную ценность.Я просто удалил весь раздел главы моей страницы, и он зарегистрировался в порядке - так что что-то противоречиво. Может быть, turbolinks. Будет отчитываться с дополнительной информацией. И там JS работает на этом поле электронной почты, я думаю ... Я тоже проверю это. – gregblass

+1

Я - главный разработчик Capybara в настоящее время (взял на себя ответственность от jnicklas около двух лет назад), поэтому я заинтересован в том, чтобы люди использовали его «правильно» :) - Capybara имеет репутацию в некоторых кругах от шелушения, но это обычно из-за того, что люди просто не понимают, что делают и/или не читают документацию, чтобы использовать правильные методы (слишком много использования #all, например, у которого есть пара основных ошибок, которые приводят к нестабильности теста) –

ответ

1

Capybara не имеет никакого способа узнать, когда страница полностью загружена, поскольку многие страницы будут загружаться асинхронно, динамически по мере необходимости и т. Д. Фактически Capybara показывает вам проблему с удобством использования ваших страниц, поскольку пользователь может технически взаимодействовать с элементами до их фактического использования - в этом случае Capybara, вероятно, быстрее, чем любой пользователь может быть, но все же ... Из-за этого вам нужно определить, какие виджеты вы используете на странице и какие изменения они делают - Например, класс получает набор в элементе body, когда библиотека закончила обработку страницы, имеет ли поле ввода добавленный класс/атрибут, когда оно было добавлено, и т. Д. После того, как вы определили, что можете сказать Capybara что-то вроде

expect(page).to have_selector('body.class_added_when_ready') 

, чтобы убедиться, что страница полностью взаимодействует.

0

Это была полная случайность, с некоторым javascript, работающим на моем конце. В какой-то момент я подумал, что было бы неплохо позволить 300-миллионную задержку для загрузчиков ladda полностью анимировать перед отправкой формы. Это заставляло капибару задыхаться. Я смог изолировать эту проблему от этого конкретного кода.

Спасибо за помощь, Том!

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