¿Cómo realizar la función mouseover en Selenium WebDriver usando Java?

132

Quiero hacer la función mouseover sobre un menú desplegable. Cuando pasemos el mouse sobre el menú, mostrará las nuevas opciones. Traté de hacer clic en las nuevas opciones usando xpath. Pero no puede hacer clic en los menús directamente. Entonces, como forma manual, estoy tratando de pasar el mouse sobre el menú desplegable y luego haré clic en las nuevas opciones.

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).build().perform();
Pradeep SJ
fuente
Consulte este sitio para obtener una respuesta detallada - testautomationguru.com/…
vins

Respuestas:

116

No es realmente posible realizar una acción de 'desplazamiento del mouse', sino que debes encadenar todas las acciones que deseas lograr de una vez. Así que muévase al elemento que revela a los demás, luego, durante la misma cadena, muévase al elemento ahora revelado y haga clic en él.

Al usar Action Chains, debe recordar 'hacerlo como lo haría un usuario'.

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).moveToElement(webdriver.findElement(By.xpath("/expression-here"))).click().build().perform();
Mark Rowlands
fuente
55
Para mí esto no funciona. Mi menú solo queda suspendido si realizo una construcción (). Perform () después de moveToElement ()
GarfieldKlon
8
La razón por la que esto no funcionaría es que todas las llamadas a webdriver.findElement(By... something)se ejecutan antes que nada (esa es la única forma en que se puede transmitir su resultado moveElement). En ese momento, el segundo elemento que desea encontrar aún no es visible porque aún debe pasar el primero. Para solucionar esto, como dijiste, puedes insertar .perform()s intermedios . Luego, para el segundo findElement, se habrá performeditado el primer elemento emergente . La solución dada podría funcionar, dependiendo de la implementación de la página, pero aparentemente tu y mi kilometraje variaron.
Sander Verhagen
57

Ninguna de estas respuestas funciona cuando se intenta hacer lo siguiente:

  1. Desplácese sobre un elemento del menú.
  2. Encuentre el elemento oculto que SOLO está disponible después del desplazamiento.
  3. Haga clic en el elemento del submenú.

Si inserta un comando 'realizar' después del moveToElement, se mueve al elemento, y el elemento del submenú se muestra durante un breve período, pero eso no es un desplazamiento. El elemento oculto desaparece inmediatamente antes de que pueda encontrarse, lo que da como resultado una ElementNotFoundException. Intenté dos cosas:

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
builder.moveToElement(clickElement).click().perform();

Esto no funcionó para mí. Lo siguiente funcionó para mí:

Actions builder = new Actions(driver);
builder.moveToElement(hoverElement).perform();
By locator = By.id("clickElementID");
driver.click(locator);

Usando las Acciones para desplazar y el clic estándar de WebDriver, podría desplazar y luego hacer clic.

zmorris
fuente
3
El segundo ejemplo también funcionó para mí al agregar .perform ()
TheRed__
1
No puedo creer que esto siga siendo un problema ... ni siquiera esto funciona: builder.moveToElement (configuración) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); Incluso veo el desplazamiento de CSS CSS en el elemento en el lapso de tiempo de espera. pero no se activa ningún clic, no importa lo que intente
Sangoku
¿Cómo manejaría si el clic no es un elemento normal y viene como :: antes . Esto antes se hace visible cuando se pasa el mouse
Ashok kumar Ganesan
25

En base a esta publicación de blog, pude activar el desplazamiento utilizando el siguiente código con Selenium 2 Webdriver:

String javaScript = "var evObj = document.createEvent('MouseEvents');" +
                    "evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);" +
                    "arguments[0].dispatchEvent(evObj);";


((JavascriptExecutor)driver).executeScript(javaScript, webElement);
Zugwalt
fuente
2
Solución menos obvia, pero 100% sólida para mis pruebas de IE11. Si tienes problemas para flotar moveToElement, ¡usa este! Codifico en C #, por lo que no es solo la forma de Java hacerlo.
vt100
Selenium Mouse Actions & Waits , Javascript initMouseEvent () Example
Yash
¿Qué es esto arguments[0]?
Arian
@ArianHosseinzadeh es la referencia pasada en dom al segundo argumento pasado executeScript(), que es unwebElement
Zugwalt
Obtengo missign ref para el ejecutor de Javascript. ¿Qué referencia debo agregar en C #
Mark1234
11

Este código funciona perfectamente bien:

 Actions builder = new Actions(driver);
 WebElement element = driver.findElement(By.linkText("Put your text here"));
 builder.moveToElement(element).build().perform();

Después de pasar el mouse, puede continuar para realizar la siguiente acción que desee sobre la información revelada


fuente
Excelente solo tenía que agregarusing OpenQA.Selenium.Interactions;
SushiGuy
7

Mira este ejemplo de cómo podemos implementar esto.

ingrese la descripción de la imagen aquí

public class HoverableDropdownTest {

    private WebDriver driver;
    private Actions action;

    //Edit: there may have been a typo in the '- >' expression (I don't really want to add this comment but SO insist on ">6 chars edit"...
    Consumer < By > hover = (By by) -> {
        action.moveToElement(driver.findElement(by))
              .perform();
    };

    @Test
    public void hoverTest() {
        driver.get("https://www.bootply.com/render/6FC76YQ4Nh");

        hover.accept(By.linkText("Dropdown"));
        hover.accept(By.linkText("Dropdown Link 5"));
        hover.accept(By.linkText("Dropdown Submenu Link 5.4"));
        hover.accept(By.linkText("Dropdown Submenu Link 5.4.1"));
    }

    @BeforeTest
    public void setupDriver() {
        driver = new FirefoxDriver();
        action = new Actions(driver);
    }

    @AfterTest
    public void teardownDriver() {
        driver.quit();
    }

}

Para obtener una respuesta detallada, consulte aquí: http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/

vins
fuente
5

Encontré esta pregunta buscando una manera de hacer lo mismo para mis pruebas de Javascript, usando Protractor (una interfaz de JavaScript para Selenium).

Mi solución con transportador 1.2.0 y webdriver 2.1:

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
)
.click()
.perform();

Esto también acepta un desplazamiento (lo estoy usando para hacer clic arriba y a la izquierda de un elemento :)

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
  , -20, -20  // pixel offset from top left
)
.click()
.perform();
Platón
fuente
4

Programa de ejemplo para desplazar el mouse con Selenium java WebDriver:

public class Mhover {
    public static void main(String[] args){
       WebDriver driver = new FirefoxDriver();
       driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
       driver.get("http://www.google.com");
       WebElement ele = driver.findElement(By.id("gbqfba"));
       Actions action = new Actions(driver);
       action.moveToElement(ele).build().perform();
    }
}
Manos amigas
fuente
9
Considere incluir información sobre su respuesta, en lugar de simplemente publicar el código. Intentamos proporcionar no solo 'soluciones', sino ayudar a las personas a aprender. Debe explicar qué estuvo mal en el código original, qué hizo de manera diferente y por qué sus cambios funcionaron.
Andrew Barber
2
@ AndrewBarber: el programa dado realmente puede ayudar al usuario. Ese programa está funcionando correctamente. El usuario ya ha aceptado que ..
Helping Hands
44
No discuto que funcionará ; Estoy diciendo que deberías explicar por qué podría funcionar, por qué lo que tenían no funcionaba y qué cambiaste.
Andrew Barber
Este código es equivalente a los OP y no responde la pregunta. Sin ninguna información contextual, es superfluo.
jpaugh
2

Puedes probar:

WebElement getmenu= driver.findElement(By.xpath("//*[@id='ui-id-2']/span[2]")); //xpath the parent

Actions act = new Actions(driver);
act.moveToElement(getmenu).perform();

Thread.sleep(3000);
WebElement clickElement= driver.findElement(By.linkText("Sofa L"));//xpath the child
act.moveToElement(clickElement).click().perform();

Si tuvo un caso en el que la web tiene muchas categorías, use el primer método. Para el menú que desea, solo necesita el segundo método.

Prasetyo Budi
fuente