15

Ich habe versucht, einen Integrationstest für Stripe's checkout.js [https://checkout.stripe.com/checkout.js] für meine Rails 3.2 App zu schreiben.Wie schreibt man Integrationstests für Stripe Checkout auf Rails?

Stripe-Checkout funktioniert für mich manuell getestet (mit Stripes Testschlüssel), aber ich kann nicht Capybara zu erkennen und fill_in das E-Mail-Feld in der Stripe Checkout iframe modal.

Ich bin mit Poltergeist für Headless Javascript, obwohl auch diese mit Capybara-webkit und sogar Selen getestet mit dem gleichen Problem.

Was ich versuche, ist die komplette Abonnement Anmelde-Flow zu testen, um zu zeigen, dass ein neuer Benutzer ein Teilnehmerkonto nach ihrer Zahlungsdaten in Streifen Eingabe erstellen können - aber ich kann nicht über den Streifen Kasse Pop-up bekommen. Hier

ist mein before .. do:

describe "show Stripe checkout", :js => true do 
    before do 
    visit pricing_path 
    click_button 'plan-illuminated' 
    stripe_iframe = all('iframe[name=stripe_checkout_app]').last 
    Capybara.within_frame stripe_iframe do   
     fill_in "email", :with => "[email protected]" 
     fill_in "billing-name", :with => "Mr Name" 
     fill_in "billing-street", :with => "test Street" 
     fill_in "billing-zip", :with => 10000 
     fill_in "billing-city", :with => "Berlin" 
     click_button "Payment Info" 
    end 
    end 
    it { should have_selector('button', text: "Subscribe") } 
end 

Welche Fehler mit:

Failure/Error: Capybara.within_frame stripe_iframe do 
Capybara::Poltergeist::TimeoutError: 
    Timed out waiting for response to {"name":"push_frame","args":[null]} 

Wenn ich den Versuch, tauschen die richtige iframe zu wählen (hier vorgeschlagen: Capybara trouble filling in JS modal) wie folgt:

# stripe_iframe = all('iframe[name=stripe_checkout_app]').last 
# Capybara.within_frame stripe_iframe do 
Capybara.within_frame 'stripe_checkout_app' do 

Ich bekomme immer noch die ähnliche:

Capybara::Poltergeist::TimeoutError: 
    Timed out waiting for response to {"name":"push_frame","args":["stripe_checkout_app"]} 

Es scheint, dass welche auch immer Sie Javascript Test gem ich benutze, rspec/Capybara nicht die Stripe Kasse iframe finden. Wenn ich mit Selenium überprüfe, sehe ich die Taste Choose this Plan gedrückt und das Auschecken-Pop-up, aber die Spezifikation sucht nach dem E-Mail-Feld zum Ausfüllen.

Irgendwelche Ideen?

Ich habe schon versucht:

  • Verschiedene Arten der Wahl oder das E-Mail-Feld zu finden.
  • Aktualisierung alle meine Edelsteine.
  • Mit StripeMock vorher (nicht dass es beteiligt sein sollte, oder?).
  • die gleichen Tests gegen Stripe eigene Website Rennen, die die gleichen Fehler geben:

Testing mit:

visit "https://stripe.com/docs/checkout" 
    click_button 'Pay with Card' 
    stripe_iframe = all('iframe[name=stripe_checkout_app]').last 
    Capybara.within_frame stripe_iframe do 
    fill_in 'Email', with: '[email protected]' 
    sleep 3 
    end 

je nachdem, welche Methode, die ich verwende, um den iframe ich die gleichen Fehler erhalten zu wählen.Mit nur Capybara.within_frame 'stripe_checkout_app' do:

Failure/Error: Capybara.within_frame stripe_iframe do 
Capybara::Poltergeist::TimeoutError: 
    Timed out waiting for response to {"name":"push_frame","args":[null]} 

oder mit Selen mit stripe_iframe = all('iframe[name=stripe_checkout_app]').last:

Failure/Error: Unable to find matching line from backtrace 
SystemStackError: 
    stack level too deep 

oder auch nur:

Failure/Error: fill_in 'Email', with: '[email protected]' 
Capybara::ElementNotFound: 
    cannot fill in, no text field, text area or password field with id, name, or label 'Email' found 

... je nachdem, welche der Prüfung javascript gem ich verwende.

Jede Hilfe oder Weisheit ist sehr zu schätzen!

Antwort

9

ich hier nicht der Lösungen bekommen konnte bisher für mich zu arbeiten, und dann diesen Beitrag lesen: https://gist.github.com/nruth/b2500074749e9f56e0b7 Ich erkannte, dass der Schlüssel darin bestand, dem Test eine Verzögerung hinzuzufügen, um dem Stripe genügend Zeit zu geben, 1) das Kassenfenster zu laden und 2) das Token zu verarbeiten.

Aus diesem Grunde der einzige Code, den ich an der Arbeit konnte, war dies (frei fühlt mit Timing zu spielen):

SELENIUM

describe "test stripe" do, js: true, driver: :selenium do 

    before do 
    ... # fill in order form or whatever 
    click_button "checkout_with_stripe" 
    sleep(2) # allows stripe_checkout_app frame to load 
    stripe_iframe = all('iframe[name=stripe_checkout_app]').last 
    Capybara.within_frame stripe_iframe do 
     page.execute_script(%Q{ $('input#email').val('[email protected]'); }) 
     page.execute_script(%Q{ $('input#card_number').val('4242424242424242'); }) 
     page.execute_script(%Q{ $('input#cc-exp').val('08/44'); }) 
     page.execute_script(%Q{ $('input#cc-csc').val('999'); }) 
     page.execute_script(%Q{ $('#submitButton').click(); }) 
     sleep(3) # allows stripe_checkout_app to submit 
    end 
    end 

    it "should successfully process the request" do 
    ... # test should pass 
    end 
end 

Für Capybara-webkit, die sleep Trick funktionierte nicht und leider auch nicht @ Ryan's Lösung, und ich wurde zu müde, um das herauszufinden, also hörte ich einfach auf, aber hoffentlich wird es jemand anderes bekommen, weil ich Webkit aus Geschwindigkeitsgründen lieber benutzen würde! (Ich war mit capybara-webkit 1.3.0)

Falls es hilft, hier sind meine relevanten Versionen:

selenium-webdriver 2.35.1 
rspec-rails 2.14.2 
capybara 2.1.0 
stripe 1.16.0 da216fd 
rails 4.1.1 
ruby 2.1.2 
+0

Das funktionierte perfekt, aber ich habe den Schlaf etwas erhöht und anstatt den Code in einen Vorher-Block zu setzen, habe ich es in das tatsächliche Szenario eingefügt. Wie auch immer, großartige Lösung. Vielen Dank. –

+0

Gefallen mit 'Capybara.default_wait_time = 2' über' sleep (2) ' –

+0

Die einzige funktionierende Lösung für mich. Es ist schade, dass ich Selen für diesen Test brauche! – hcarreras

5

Problem gelöst!

Mit etwas Hilfe von Parov über seine ähnliche Frage & beantworten [Poltergeist Stripe checkout.js] ich das Problem auf verwenden eine ältere Version von Capybara '~> 1.1.2 und der nachfolgenden abhängigkeits Auswirkungen dies auf die hatte verfolgt verschiedene Javascript-Test-Edelsteine ​​(zB Selen, Capybara-Webkit, Poltergeist ...).

Eine bundle update von Capybara zu 2.3.0, und so bringt poltergeist zu 1.5.1, mit selen-webdriver bei 2.42.0 und capybara-webkit bei 1.1.0, (fast) alles funktioniert.

Für Selen, diese Methode über Capybara trouble filling in JS modaltut Arbeit:

stripe_iframe = all('iframe[name=stripe_checkout_app]').last 
    Capybara.within_frame stripe_iframe do 
    fill_in "email", with: "[email protected]" 
    ... 
    end 

jedoch, die nicht in Poltergeist oder Capybara-webkit funktioniert.

Für Poltergeist, Parov Vorschlag funktioniert:

stripe = page.driver.window_handles.last 
    page.within_window stripe do 
    fill_in "email", with: "[email protected]" 
    ... 
    end 

Für Capybara-webkit ich nicht in der Lage war zu bekommen alles funktioniert, obwohl gegeben hatte ich mit Poltergeist etwas Arbeit ich nicht zu haben setzen viel Zeit, um eine Capybara-Webkit-Lösung zu finden.

Kommentare?

+0

Selen-Version funktioniert Vielen Dank, aber Poltergeist Version funktioniert nicht, es gibt tatsächlich Stuck. – Filippos

+0

Ja, meins hat auch aufgehört zu arbeiten? aktuelles Juwel Update. Ich werde es nochmal untersuchen müssen ... grrr. –

+1

Dies scheint nicht mit den letzten Edelstein-Versionen zu funktionieren (ich benutze auch Poltergeist), es kann keine "Kartennummer" für mich finden. Irgendwelche Updates? – tirdadc

2

Für Capybara-webkit, konnte ich dies an der Arbeit:

stripe_iframe = page.driver.window_handles.last 
    page.within_window stripe_iframe do 
    fill_in "email", with: "[email protected]" 
    ... 
    end 
+0

Danke Ryan. Das ist das Gleiche wie mein Poltergeist-Code, also werde ich es noch einmal versuchen. Im Allgemeinen finde ich Poltergeist besser als Capybara-Webkit - obwohl jetzt Edelsteine ​​und die Abhängigkeiten für alle von ihnen herumlaufen ... haben! –

3

Ich habe mit diesem für einige Zeit zu kämpfen und am Ende (wie der Kern james zeigt Nennungen) fand es zu spröde und zu langsam, um die Kasse js zu testen.

Stattdessen können Sie verwenden Sie die folgende (Rubin, Capybara, Selen) checkout.js und posten Sie Ihre Form mit einem Streifen Token Stummel:

# optionally ensure the iframe was opened 
    expect(page).to have_css('iframe[name="stripe_checkout_app"]') 
    # post the form 
    token = Stripe::Token.create(
    :card => { 
     :number => "4242424242424242", 
     :exp_month => 7, 
     :exp_year => 2019, 
     :cvc => "314", 
     address_line1: Faker::Address.street_address, 
     address_city: Faker::Address.city, 
     address_zip: Faker::Address.postcode, 
     address_country: 'United Kingdom' 
    }, 
) 
    page.execute_script("$('#payment_token').val('#{token.id}');") 
    page.execute_script("$('#our-stripe-payment-form').submit();") 

N. B. dies setzt voraus, dass bereits die Streifen api Juwel in der Testumgebung (durch Ihre Rails-Anwendung) und hat einen registrierten API-Schlüssel usw., sonst see the docs geladen hat.

+0

Danke nruth, ich muss es versuchen. –

Verwandte Themen