Позвольте мне начать с подтверждения того, что это не дубликат (в том, что ответы, опубликованные там, не исправили мою проблему). Этот пост - это, по сути, моя точная проблема: Capybara не может найти поля формы в модуле Stripe, чтобы заполнить их.
Здесь моя спецификация Capybara:
describe 'checkout', type: :feature, js: true do
it 'checks out correctly' do
visit '/'
page.should have_content 'Amount: $20.00'
page.find('#button-two').click_button 'Pay with Card'
Capybara.within_frame 'stripe_checkout_app' do
fill_in 'Email', with: '[email protected]'
fill_in 'Name', with: 'Nick Cox'
fill_in 'Street', with: '123 Anywhere St.'
fill_in 'ZIP', with: '98117'
fill_in 'City', with: 'Seattle'
click_button 'Payment Info'
fill_in 'Card number', with: '4242424242424242' #test card number
fill_in 'MM/YY', with: '02/22'
fill_in 'CVC', with: '222'
click_button 'Pay'
end
page.should have_content 'Thanks'
end
end
Текст этой спецификации - моя самая последняя попытка. Ошибка Capybara Unable to find field "Email"
.
Что я пробовал
- Эта последняя попытка заполнить поле текстом-заполнителем, предложенным здесь
- Поиск поля электронной почты с помощью атрибута name (например,
fill_in 'email', with: '[email protected]'
) - С и без хэшей
type: :feature
иjs: true
вdescribe
- С вызовом
within_frame
и без него <<27 > - Попытка найти вход css (например,
page.find('.emailInput input').set('[email protected]'
) - Добавление блока
within
:within('.panel') do
вокруг входов формы (сбой сUnable to find css ".panel"
) - Добавление
sleep 3
перед предыдущим шагом в случае, если он слишком рано ищет этот div (с ошибкойUnable to find css ".panel"
) - Добавление вызова к
find
(а такжеpage.find
) и передача формы в виде блока (с блокомwithin
, вложенным в блокfind
):
Capybara.within_frame 'stripe_checkout_app' do
page.find('.panel') do
fill_in 'Email', with: '[email protected]'
...
end
end
Я тоже пробовал это с помощью полтергейста.
Какое безумие в этом заключается в том, что я изменил драйвер Capybara от полтергейста до селена /Firefox, и я могу физически видеть, как драйвер открывает страницу, нажимая кнопку и поднимая модальность.
Любые мысли о том, как заставить Capybara взаимодействовать с этой формой?
Изменить
Я также попытался вставить binding.pry
туда и отладить pry gem. HTML страницы в точке, где модальные нагрузки - это несколько элементов, а затем теги script, которые динамически вставляют JS в начало iframe. Смотрите этот снимок экрана DOM в точке, где поражен binding.pry
(после того, как модальное окно открывается в форме Stripe):
Итак, <div class="emailInput">
явно там, но page.has_selector?('.emailInput')
возвращает false в консоль pry.
Здесь - это описание GitHub того, что происходит, когда я печатаю page.html
из привязки pry как следующую строку после Capybara.within_frame 'stripe_checkout_app' do
. То есть это разметка с точки зрения Capybara, и это сильно отличается от DOM, как показано на скриншоте DOM фактической формы, когда она появляется на экране, показанной выше. Как вы можете видеть, нет никаких входов или чего-либо, с чем можно работать в разметке, которую видит Capybara.
Update
Вот разметка для формы, содержащей JS, которая выполняет модальную. (Разметка находится в haml).
%form{ action: "/charge?amount=1400", method: 'post', class: 'payment', id: 'fourteen' }
%article
%label.amount
%span Amount: $14.00
.stripejs#button-one
%script{ src: 'https://checkout.stripe.com/checkout.js', class:'stripe-button', :'data-key' => settings.publishable_key, :'data-name' => 'Slow Coffee', :'data-description' => '2 8oz. bags (2/month)', :'data-shipping-address' => true }