Last active
March 7, 2023 00:21
-
-
Save nruth/b2500074749e9f56e0b7 to your computer and use it in GitHub Desktop.
capybara selenium webdriver stripe.js checkout test helper
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- encoding : utf-8 -*- | |
module PayStripeHelpers | |
# must be used with driver: :selenium (or :sauce?) | |
def pay_stripe | |
sleep(0.7) # wait for the js to create the popup in response to pressing the button | |
within_frame 'stripe_checkout_app' do # must be selenium | |
# fill_in 'card_number', with: '4242424242424242' no longer works | |
4.times {page.driver.browser.find_element(:id, 'card_number').send_keys('4242')} | |
# fill_in 'cc-exp', with: '5/2018' no longer works | |
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' | |
find('button[type="submit"]').click | |
end | |
# wait for stripe to finish and change the page; default is 2 seconds | |
find("body[data-tests-page='member/dashboard']", wait: 30) | |
end | |
end | |
if respond_to?(:World) #cucumber | |
World(PayStripeHelpers) | |
else | |
RSpec.configure do |config| | |
config.include PayStripeHelpers, :type => :feature | |
end | |
end |
Adding address stuff to @iloveitaly 's answer. This stuff still works as of late(ish) 2017.
within_frame 'stripe_checkout_app' do
find_field('Name').send_keys 'Some Person'
find_field('Street').send_keys '123 Sunshine Pl.'
find_field('City').send_keys 'Seattle'
find_field('ZIP Code').send_keys '98112'
find('button[type="submit"]').click
find_field('Card number').send_keys '4242424242424242'
find_field('MM / YY').send_keys "01#{DateTime.now.year + 1}"
find_field('CVC').send_keys '123'
find('button[type="submit"]').click
end
for v3 (was able to find iframe only by position)
def fill_stripe(card, cvc, exp)
iframes = all('iframe')
card_iframe = iframes[0]
cvc_iframe = iframes[1]
exp_iframe = iframes[2]
within_frame card_iframe do
card.chars.each do |piece|
find_field('cardnumber').send_keys(piece)
end
end
within_frame cvc_iframe do
cvc.chars.each do |piece|
find_field('cvc').send_keys(piece)
end
end
within_frame exp_iframe do
exp.chars.each do |piece|
find_field('exp-date').send_keys(piece)
end
end
end
Modified to work with Stripe Card Element:
def fill_stripe_element(card,exp, cvc, postal='')
card_iframe = all('iframe')[0]
within_frame card_iframe do
card.chars.each do |piece|
find_field('cardnumber').send_keys(piece)
end
exp.chars.each do |piece|
find_field('exp-date').send_keys(piece)
end
cvc.chars.each do |piece|
find_field('cvc').send_keys(piece)
end
postal.chars.each do |piece|
find_field('postal').send_keys(piece)
end
end
end
Thanks @bhbryant!
Is this still working for you ? It's not working for me anymore... This is what I'm seeing
- Stripe DOES in fact initialize an
iframe
; without Stripe on the page, noiframe
is found - However, with Stripe and within that
iframe
, if I search for a genericinput
element, it defaults to an input I had put on the page
It's as if Stripe's iframe
is "deflecting" to my regular view...
I added some helpers for Stripe SCA in case anyone needs that: https://gorails.com/blog/fill-in-stripe-elements-js-for-sca-3d-secure-2-and-capybara
Was wondering if there was any update to this for Stripe's Payment Element? Have been struggling to get this to work with the new way. Oddly, I can get it to work within a pry, but not when it runs by itself.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You are my hero!