java firefox selenium selenium-webdriver mouseout

java - Acciones del mouse de Selenium WebDriver moveToElement no aumenta el evento mouseout en Firefox Linux



selenium-webdriver (4)

También encuentro este problema con Selenium 2.30 en Firefox 19. Funciona bien en FF 18.2.

He intentado probar una información sobre herramientas en mi página web utilizando Selenium WebDriver con Firefox 19.
Básicamente estoy tratando de usar las acciones del mouse para pasar el cursor sobre el elemento que tiene la información sobre herramientas adjunta para probar que se muestra la información sobre herramientas y pasar el cursor sobre otro elemento para probar que la información sobre herramientas está oculta. La primera operación funciona bien, pero al pasar el cursor sobre otro elemento, la información sobre herramientas permanece visible. Este problema no ocurre al probar la página web manualmente.
¿Alguien más ha tenido este problema antes? Estoy usando Ubuntu 12.04.


Parece que la API de acciones avanzadas se basa en eventos nativos, que están desactivados en la versión Linux de Firefox de forma predeterminada. Por lo tanto, deben estar habilitados en la instancia de WebDriver explícitamente.

FirefoxProfile profile = new FirefoxProfile(); //explicitly enable native events(this is mandatory on Linux system, since they //are not enabled by default profile.setEnableNativeEvents(true); WebDriver driver = new FirefoxDriver(profile);

Además, en mi caso necesitaba actualizar WebDriver a la versión 2.31 ya que la acción de moveToElement ( moveToElement ) no funcionaba correctamente en 2.30, incluso con eventos nativos habilitados explícitamente. Probado esto con la versión 2.31 de WebDriver y las versiones 17 y 19 de Firefox en Linux. Para más información puede consultar este enlace:
http://code.google.com/p/selenium/wiki/AdvancedUserInteractions#Native_events_versus_synthetic_events


Yo tuve el mismo problema. Al principio usé el método moveToElement() sin perform() . Luego agregué Firefox Profile con setEnableNativeEvents , pero aún así no funcionó. Finalmente resolví este problema de esta manera (simplemente agregando perform() :

WebElement username = driver.findElement(By.id("username")); Actions actions = new Actions(driver); actions.moveToElement(username).perform(); WebElement tooltip = driver.findElement(By.id("tooltip")); tooltip.isDisplayed();

y funciona bien


Este es un método simple pero útil con una llamada javascript que enviará un evento mouseout () a cualquier elemento que especifique (prefiero pasarlos usando By pero puede cambiar esto a lo que quiera).

Tuve un problema con Chrome, donde la información sobre herramientas se negaba a cerrar una vez que se hacía clic y oscurecía otros eventos de clics cercanos, lo que hacía que fallaran. Este método salvó el día en ese caso. Espero que ayude a alguien más!

/** * We need this to close help text after selenium clicks * (otherwise they hang around and block other events) * * @param by * @throws Exception */ public void javascript_mouseout(By by) throws Exception { for (int i=0; i<10; i++) { try { JavascriptExecutor js = (JavascriptExecutor)driver; WebElement element = driver.findElement(by); js.executeScript("$(arguments[0]).mouseout();", element); return; } catch (StaleElementReferenceException e) { // just catch and continue } catch (NoSuchElementException e1) { // just catch and continue } } }

Puede llamarlo después de cualquier tipo de evento click () como este:

By by_analysesButton = By.cssSelector("[data-section=''Analyses'']"); javascript_mouseout(by_analysesButton);

Fyi, el mío prueba 10x a través del bucle for con try / catch porque nuestra aplicación tiene una tendencia con Chrome hacia las excepciones de elementos obsoletos, por lo que si no tienes este problema, el método puede reducirse considerablemente.