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

Quiero hacer la función de mouseover sobre un menú desplegable. Cuando pasamos el cursor sobre el menú, se muestran 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 la forma manual, estoy tratando de pasar el cursor 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(); 

No es posible realizar una acción de ‘mouse hover’, en su lugar debe encadenar todas las acciones que desea lograr de una vez. Vaya 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, debes 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(); 

Ninguna de estas respuestas funciona cuando intenta hacer lo siguiente:

  1. Desplácese sobre un elemento del menú.
  2. Encuentra el elemento oculto que SÓLO está disponible después del vuelo estacionario.
  3. Haga clic en el elemento del submenú.

Si inserta un comando ‘ejecutar’ después de moveToElement, se mueve al elemento, y el elemento del submenú se muestra durante un breve período de tiempo, pero eso no es un vuelo estacionario. El elemento oculto desaparece inmediatamente antes de poder encontrarlo, 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 desplazarse y el clic de WebDriver estándar, puedo desplazarme y hacer clic.

Basado en esta publicación de blog, pude activar el vuelo estacionario usando 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); 

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 en la información revelada

Encontré esta pregunta buscando la forma 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(); 

Progtwig de ejemplo para desplazarse con el mouse usando 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(); } } 

Vea este ejemplo de cómo podríamos implementar esto.

enter image description here

 public class HoverableDropdownTest { private WebDriver driver; private Actions action; 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/

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 tiene caso, la web tiene muchas categorías, use el primer método. Para el menú que quería, solo necesita el segundo método.