Оформление полоски заполняется в Capybara-webkit
Я использую драйвер capybara-webkit
для моих тестов с поддержкой JS. Однако, когда я пытаюсь заполнить поля формы для проверки iframe, я не могу это сделать, используя помощник capybara fill_in
в обоих драйверах. Selenium
драйвер предоставляет методы, которые облегчают выполнение этой задачи.
4.times {page.driver.browser.find_element(:id, 'card_number').send_keys('4242')}
page.driver.browser.find_element(:id, 'cc-exp').send_keys '5'
page.driver.browser.find_element(:id, 'cc-exp').send_keys '18'
page.driver.browser.find_element(:id, 'cc-csc').send_keys '123'
page.driver.browser.find_element(:id,'billing-zip').send_keys '600004'
Если я использую помощник fill_in
, я не могу полностью ввести данные. Например, для 16-значного номера карты поле ввода заполняется только 4 цифрами, а в поле даты я могу ввести только месяц, а не год.
Я хочу знать, есть ли помощники в драйвере webkit, которые позволят мне заполнить формы в форме проверки Stripe. Любые хедз-ап на это было бы здорово! Спасибо заранее.
Ответы
Ответ 1
У меня были похожие проблемы с Selenium, которые оба
find(:css, "input[id$='card_number']").set("4242 4242 4242 4242")
fill_in('card_number', with: "4242 4242 4242 4242")
перестала работать. Ранее я нашел (: css,...), который все еще работал несколько месяцев назад, но я думаю, что изменения в checkout.js сделали это так, что он больше не работал. С помощью Capybara не может заполнить поля Stripe Checkout.js Мне удалось заставить его работать. Это не очень красивое (или действительно управляемое поведением) решение, но оно выполняет эту работу:
stripe_iframe = all('iframe[name=stripe_checkout_app]').last
Capybara.within_frame stripe_iframe do
page.execute_script(%Q{ $('input#card_number').val('4242 4242 4242 4242'); })
page.execute_script(%Q{ $('input#cc-exp').val('12/16'); })
#rest of the Stripe-capybara
end
Я не уверен, работает ли он с Webkit.
Ответ 2
Похоже, что Stripe изменила идентификаторы элементов оформления. У многих есть динамические идентификаторы, которые не соответствуют другим примерам здесь.
То, что сработало для меня, - это сопоставление элементов с текстом-заполнителем. Здесь рабочий фрагмент по состоянию на 12/06/16:
stripe_card_number = '4242424242424242'
within_frame 'stripe_checkout_app' do
find_field('Card number').send_keys(stripe_card_number)
find_field('MM / YY').send_keys "01#{DateTime.now.year + 1}"
find_field('CVC').send_keys '123'
find('button[type="submit"]').click
end
page.has_content?('Success!', wait: 30)
Ответ 3
У меня была точно такая же проблема, и выяснилось, что следующее решение работает с capybara-webkit, а также с селеновым хромом:
page.find_field('Email').set "[email protected]"
page.find_field('Card number').set ('4242424242424242')
"Email" и "Номер карты" здесь являются заполнителями. Причина, по которой он работает таким образом, а не с find('#email')
заключается в том, что на странице нет элемента с id = 'email'. Capybara правильно не может найти этот элемент, он не существует много раз. Причина в том, что нет элемента, потому что иногда stripe iframe отображается без соответствующего id, например:
element-with-dynamic-id
find_field
выполняет поиск по id, name или placeholder, и в этом случае placeholder является единственным атрибутом, который не изменяется в обеих ситуациях и который может быть найден capybara (например, "type" не измените, но я не смог найти способ сделать поиск capybara по типу, а также тест был бы гораздо менее читабельным).
Почему Stripe iframe иногда пропускает эти правильные идентификаторы и заменяет их динамическими идентификаторами? Не знаю.
Ответ 4
Для полноты, здесь рабочий код.
Capybara.within_frame stripe_iframe do
page.find_field('Email').set '[email protected]'
page.find_field('Card number').set '4242 4242 4242 4242'
page.find_field('MM / YY').set '12/42'
page.find_field('CVC').set '123'
find('button[type="submit"]').click
end
Вы всегда можете найти последнюю рабочую версию в https://github.com/dblock/slack-gamebot/blob/master/spec/integration/upgrade_spec.rb.
Ответ 5
Если вы используете Stripe из iframe (возможно, https://www.paymentiframe.com/?), вы сможете изменить масштаб своих тестов к кадру с помощью Capybara within_frame
метод:
within_frame('stripe-iframe') do
fill_in 'card_number', :with => '4242'
end
Если вы укажете iframe имя (stripe-iframe
в этом примере), то это должно сделать это.
Надеюсь на помощь!
Ответ 6
Я сделал его похожим на @humpah, но без злого кода JS.
form_iframe = all('iframe.wysihtml5-sandbox').last
within_frame form_iframe do
page.find('body').set('SomeContent')
end