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
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">
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