install capybara webkit
Raya de pago rellenar formulario en Capybara-webkit (6)
Estoy usando el controlador capybara-webkit
para mis pruebas habilitadas para JS. Sin embargo, cuando trato de completar los campos del formulario para el iframe de fill_in
, no puedo hacerlo usando el ayudante fill_in
capibara en ambos controladores. Selenium
controlador de Selenium
proporciona métodos que facilitan el logro de esta tarea.
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''
Si uso el helper fill_in
, no puedo ingresar los detalles completamente. Por ejemplo, para un número de tarjeta de 16 dígitos, el campo de entrada se llena solo con 4 dígitos y en el campo de fecha puedo ingresar solo el mes y no el año.
Quiero saber si hay ayudantes en el controlador de webkit que me permitirían completar formularios en el formulario de pago de Stripe. Cualquier aviso sobre esto sería genial! Gracias por adelantado.
Estaba teniendo problemas similares con Selenium que tanto
find(:css, "input[id$=''card_number'']").set("4242 4242 4242 4242")
fill_in(''card_number'', with: "4242 4242 4242 4242")
dejó de funcionar. Encontré (: css, ...) anteriormente, que todavía funcionaba hace unos meses, pero creo que los cambios en checkout.js lo hicieron para que no funcionara más. Con la ayuda de Capybara no puedo completar los campos de Stripe Checkout.js logré que funcionara. No es una solución bonita (o realmente basada en el comportamiento), pero hace el trabajo:
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
No estoy seguro si funciona con Webkit sin embargo.
Lo hice similar a @humpah, pero sin código JS malvado.
form_iframe = all(''iframe.wysihtml5-sandbox'').last
within_frame form_iframe do
page.find(''body'').set(''SomeContent'')
end
Para completar, aquí está el código de trabajo.
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
Siempre puede encontrar la última versión funcional en https://github.com/dblock/slack-gamebot/blob/master/spec/integration/update_cc_spec.rb
Parece que Stripe ha cambiado los ID en los elementos de pago. Muchos tienen identificaciones dinámicas que no coinciden con algunos de los otros ejemplos aquí.
Lo que funcionó para mí es hacer coincidir los elementos con el texto del marcador de posición. Aquí hay un fragmento de trabajo a partir del 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)
Si está utilizando Stripe desde un iframe (quizás https://www.paymentiframe.com/ ?), Debería poder cambiar el alcance de sus pruebas al marco usando el método within_frame
de Capybara:
within_frame(''stripe-iframe'') do
fill_in ''card_number'', :with => ''4242''
end
Si le da un nombre a su iframe ( stripe-iframe
en ese ejemplo), entonces debería hacerlo.
Espero que sea de ayuda!
Tuve exactamente el mismo problema y encontré que la siguiente solución funciona con capybara-webkit y con selenium-chrome:
page.find_field(''Email'').set "[email protected]"
page.find_field(''Card number'').set (''4242424242424242'')
El "Correo electrónico" y el "Número de tarjeta" aquí son los marcadores de posición. La razón por la que funciona de esta manera y no con find(''#email'')
es porque no hay ningún elemento con id = ''email'' en la página. Capibara correctamente no puede encontrar este elemento, no existe muchas veces. La razón por la que no hay ningún elemento es porque, a veces, el iframe de la banda se procesa sin el id. Adecuado, como así: element-with-dynamic-id
find_field
busca por id, nombre o marcador de posición, y en este caso, placeholder es el único atributo que no cambia en ambas situaciones y que puede ser encontrado por capybara (por ejemplo. no se pudo encontrar la manera de hacer una búsqueda de capibara por tipo y la prueba sería mucho menos legible entonces.
¿Por qué el iframe de Stripe a veces pasa por alto estas ID correctas y las reemplaza por IDs dinámicas? Ni idea.