¿Cómo interactúo con una ventana emergente con Mink, Selenium 2 y Behat?
popup selenium-webdriver (2)
Estoy ejecutando un sitio interno con Behat y, en general, todo va muy bien. Pero el problema es que en ciertas partes del sitio tenemos ventanas emergentes que aparecen para completar una acción. En este caso, presionamos el botón "Retirar" y aparece una ventana emergente para que seleccione un motivo y lo guarde.
En un mundo ideal, y si realmente hubiera diseñado esta aplicación, el sitio no usaría ninguna ventana emergente. Pero soy el nuevo tipo que se supone debe implementar pruebas funcionales automatizadas (y estoy aprendiendo cómo hacerlo desde cero). Así que realmente no tengo nada que decir sobre el diseño del sitio en este punto (aunque presionaré por un montón de cambios con el paso del tiempo).
Estoy ejecutando Behat con Mink y el controlador Selenium 2 en un sistema Ubuntu 12.10 (eventualmente tendrá que ejecutar algunas pruebas en un entorno Windows para probar en IE). También estoy usando PhantomJS para algunas de las pruebas que he configurado.
De todos modos, ¿Behat / Mink admite trabajar con ventanas emergentes de alguna manera a través del controlador Selenium 2 (oa través de PhantomJS)? Estoy al principio de toda esta configuración de automatización y realmente solo estoy experimentando con herramientas. Si hay una herramienta mejor que puede manejar esto, házmelo saber.
Mi pregunta principal es ¿cómo hago que Behat / Mink trabaje con la ventana emergente, marque una casilla, complete un campo y haga clic en el botón Guardar? Sé cómo hacer todo, excepto obtenerlo para interactuar directamente con la ventana recién aparecida. Cualquier idea / sugerencia sería bienvenida.
¡Gracias!
Al establecer el foco de la ventana también podemos nombrar estas ventanas para que podamos acceder a ellas nuevamente en el futuro.
Usando este método podemos cambiar fácilmente entre ventanas emergentes y continuar probando ...
/**
* @Then I switch to popup :name
*
* @param $name
*/
public function iSwitchToPopup($name)
{
$this->iSetMainWindowName();
$this->getSession()->switchToWindow($name);
}
/**
* @Then I set main window name
*/
public function iSetMainWindowName()
{
$window_name = ''main_window'';
$script = ''window.name = "'' . $window_name . ''"'';
$this->getSession()->executeScript($script);
}
/**
* @Then I switch back to main window
*/
public function iSwitchBackToMainWindow()
{
$this->getSession()->switchToWindow(''main_window'');
}
Así que resulta que Mink incluye algunas características de cambio de ventana, pero no hay forma de identificar dichas ventanas. Así que escribí dos funciones getWindowName () y getWindowNames () que identifican la ventana actual y todas las ventanas abiertas, respectivamente. Realicé estos cambios en el proyecto en GitHub, parece que mis soluciones se implementarán pronto en la base de códigos.
Pero con estos cambios puedo cambiar las ventanas sin problema.