2012-07-18 16 views
13

Estoy trabajando para vivir la vida de la manera BDD. Estoy usando Pepino (con Selenio) y utilizo modales de Twitter Bootstrap en mi aplicación.Sugerencias para hacer que el selenio juegue bien con el desvanecimiento modal Bootstrap?

Mientras ejecutaba las pruebas de Cucumber, obtenía un error de "Selenium::WebDriver::Error::MoveTargetOutOfBoundsError". Después de mucha búsqueda, depuración y desesperación general, he llegado a la conclusión de que tiene que ver con el uso del parámetro "fade" en mis versiones modales de Bootstrap. Si uso "fade", se lanza el error:

<div class="modal hide fade" id="info-share-edit-modal" style="display: none;"> 
    . 
    . 
    . 
</div> 

Si quito "fade", a continuación, selenio está llena de felicidad y mis pruebas claras:

<div class="modal hide" id="info-share-edit-modal" style="display: none;"> 
    . 
    . 
    . 
</div> 

Por lo tanto, ahora estoy quitando "fade" de mi diversos modales. Pero, esto me entristece porque me gusta el efecto de desvanecimiento.

¿Alguien más ha tenido problemas al usar Selenium con desvanecimiento en Bootstrap modales? Si es así, ¿hay alguna manera inteligente de hacer que los dos funcionen bien juntos?

Por cierto (no estoy seguro de si importa), soy Rails 3.2.3, Firefox 13.0.1 y Ubuntu 12.04LTS.

+0

He encontrado el mismo error, usando el 'reveal.js' de Foundation Zurb y gracias a su sugerencia lo conseguí al eliminar la animación' fade'. Pero no encontré una solución real. Tan interesado en escuchar cómo otros resolvieron esto. – nathanvda

+0

¿Cuándo ocurre exactamente el error? – spinningarrow

Respuesta

-1

Ponga una bandera para que en el entorno de prueba no se desvanezca, pero sí en cualquier otro entorno.

8

Hice una prueba rápida con la inserción de un WebDriverWait que mira la opacidad del modal. Parece que funciona, pero el tiempo dirá que (al menos para mí) es un problema intermitente. Aquí está mi implementación en Java.

//Ensure the modal is done animating 
new WebDriverWait(driver, 5).until(
    new ExpectedCondition<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver webDriver) {   
      return webDriver.findElement(By.id("videoModal")).getCssValue("opacity").equals("1"); 
     } 
    } 
); 
+0

Este [ticket] (https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/2766) para el controlador de Chrome sugiere que lo tengas bien. En pocas palabras, dice que un elemento tiene que dejar de animar antes de poder hacer clic en él. – jpaugh

-1

En un caso de prueba de selenio cuando la aplicación abre el modal de arranque, añadir un comando de pausa para preguntar selenio para hacer una pausa durante un segundo antes de interactuar con contenido de su modal:

Command: pause/
Target: 1000/
Value: (leave empty) 
2

Lo resuelto este manera (usando C#). Es rápido y no ha fallado una vez.

public static void WaitForModal(this RemoteWebDriver driver) 
{ 
    using (driver.NoImplicitWait()) 
    { 
     var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); 
     wait.Until(d => d.FindElements(By.ClassName("modal-backdrop").Count == 0); 
    } 
} 

NoImplicitWait se utiliza para deshabilitar temporalmente la espera implícita del controlador.

public static NoImplicitWait NoImplicitWait(this IWebDriver driver) 
{ 
    return new NoImplicitWait(driver); 
} 

public sealed class NoImplicitWait : IDisposable 
{ 
    private readonly IWebDriver _driver; 

    public NoImplicitWait(IWebDriver driver) 
    { 
     _driver = driver; 
     _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0)); 
    } 

    public void Dispose() 
    { 
     _driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30)); 
    } 
} 
0

código C#

que tenían el mismo problema y el código está trabajando para mí desde 2+ meses, no más de choque.

public static void WaitForModal(this IWebDriver driver) 
    { 
     wait.Until<IWebDriver>((d) => 
     { 
      if (driver.FindElements(By.ClassName("modal-backdrop")).Count == 0) 
      { 
       return driver; 
      } 
      return null; 
     }); 
    } 

Espera hasta que encuentra no más IWebElement que tienen un class de "modal telón de fondo".

0

Mejorando la respuesta de user1965252, esto funcionó para mí. Simplemente reemplace the-modal-id con su identificación de div modal.

Cuestiones relacionadas