contexto

El caso es que en un desarrollo que integra varios servicios, hice unos test en Cucumber en donde el usuario interactúa con varias páginas (va a una, hace algo, va a otra…). Como el driver por defecto de Capybara, RackTest ejecuta directamente contra el código (creo que ni levanta un servidor) éste no puede testear páginas externas, por lo que me cambié a WebKit (después de probar Selenium, que no se la pudo).

Luego le integré como método de pago Stripe, que es la última chupada del mate: incluyes un JavaScript que levanta un pop-up que toma el pago, y luego submitea el form que le des con un token, haciéndose cargo de todo el pago fuera de tu sitio. Cuando tocó testear con Cucumber, todo fue bien

@webkit
Escenario: Pago
Dado que el usuario entra a la página de pago
Y hace click en "Pagar con tarjeta"
Y pone su correo
Y pone su número de tarjeta
Entonces
...

Hasta que de un día para otro, todos los tests que involucaban pago se rompieron

broken

Después de agotar todas las instancias y ya que pareciera que nada había cambiado sustancialmente, deduje que algo tenía que haber cambiado en checkout.js, el script de Stripe, el cual se linkea directamente desde el servidor de ellos.

Busqué un changelog en su página, pero el código es privado. Me conecté a #stripe en IRC y mv me confirmó que habían actualizado de versión el día anterior. ¿Qué puede ser? ¿Por qué webkit se niega a ejecutarlo ahora?

webkit en debug

En su página de GitHub el driver dice que tiene una versión de debug:

so we’ve included a debug version of the driver that prints a log of what happened during each test

Pero no se indica cómo activarlo, y el link que dan está roto, debiera apuntar al wiki que dice que basta con poner

Capybara.javascript_driver = :webkit_debug

y tenemos nuestro log

Received "Node.leftClick" 
Started "Node.leftClick" 
Started request to "https://q.stripe.com/?event=outerLoad&lsid=33023aa4-10d7-43ee-80c6-f2be1399f493&cid=603fa6ca-0f76-4424-af23-d6c679b84d32&rf=http%3A%2F%2F127.0.0.1%3A33074%2Frequester%2Fteams%2F52f702c2616c646ea3090000%2Fname&sc=&key=pk_test_AR55DVwGjvs6XD8LX99I22L2&merchantVariantID=pk_test_AR55DVwGjvs6XD8LX99I22L2&forceV3=true&merchant_i3=test&version=v3&i=1391919819178" 
Load started 
"Node.leftClick" started page load 
Started request to "https://checkout.stripe.com/v3" 
Started request to "https://checkout.stripe.com/v3" 
Finished "Node.leftClick" with response "Success()" 
Started request to "https://checkout.stripe.com/v3/checkout/desktop.css?version=nzQPwWRdq1CkpeODzgibGw" 
Started request to "https://checkout.stripe.com/v3/checkout/desktop.css?version=nzQPwWRdq1CkpeODzgibGw" 
Started request to "https://checkout.stripe.com/js/raven.min.js?version=l0KqNMHa_QhUOamdDvGk-A" 
Started request to "https://checkout.stripe.com/js/raven.min.js?version=l0KqNMHa_QhUOamdDvGk-A" 
Started request to "https://checkout.stripe.com/v3/checkout/desktop.js?version=0KWqslarIzhG12n8fQnLaw" 
Started request to "https://checkout.stripe.com/v3/checkout/desktop.js?version=0KWqslarIzhG12n8fQnLaw" 
Started request to "https://js.stripe.com/v1/" 
Started request to "https://js.stripe.com/v1/" 
Started request to "https://mpsnare.iesnare.com/snare.js" 
Started request to "https://mpsnare.iesnare.com/snare.js" 
Received 200 from "https://checkout.stripe.com/v3" 
Received 200 from "https://checkout.stripe.com/v3/checkout/desktop.css?version=nzQPwWRdq1CkpeODzgibGw" 
Received 200 from "https://checkout.stripe.com/js/raven.min.js?version=l0KqNMHa_QhUOamdDvGk-A"
...

Como vemos, al apretar el botón de Stripe sí se cargan todos sus assets…

Además, la consola del browser no tiene errores

page.console_errors # y similares
# => [ ]

así es que tampoco es que el javascript falle por algún motivo…

page.driver.window_handles

A punto de cambiarme a Poltergeist (que está basado en webkit pero las hace todas – hasta reportar errores remotos), me fijé en esta parte de su documentación y decidí probarla con webkit no más

page.driver.window_handles
# => ["{bcd5174f-daaf-4530-a0cb-8e789dda6a64}", "{611cfc31-ee42-4358-b032-a1b3d81ae761}"]

¡demonios! ahí está

stripe = page.driver.window_handles.last
# => "{611cfc31-ee42-4358-b032-a1b3d81ae761}"
page.within_window(stripe){ find_field 'Email' }
#<Capybara::Element tag="h1" path="/html/body/div[@id='wrap']/div[2]/div[1]/div/h1">

fuck yea!

switch_to v/s within_window

Lo idea sería poder simplemente cambiarse de ventana de ahora en adelante >>

page.driver.browser.switch_to.window(stripe)

pero webkit no soporta esa sintaxis, así es que me las tengo que arreglar con

within_window stripe do
  # toma un bloque...
end

lo que es una lata porque tengo que wrappear todas las queries que van a stripe en distintos lados… y
hell-yea

Este sitio utiliza cookies.    Leer más