150 votes

Comment exécuter la fonction mouseover dans Selenium WebDriver en utilisant Java ?

Je veux faire une fonction de mouseover sur un menu déroulant. Lorsque l'on survole le menu, les nouvelles options s'affichent. J'ai essayé de cliquer sur les nouvelles options en utilisant le xpath. Mais je ne peux pas cliquer directement sur les menus. J'essaie donc de passer la souris sur le menu déroulant et de cliquer ensuite sur les nouvelles options.

Actions action = new Actions(webdriver);
WebElement we = webdriver.findElement(By.xpath("//html/body/div[13]/ul/li[4]/a"));
action.moveToElement(we).build().perform();

121voto

Mark Rowlands Points 1849

Il n'est pas vraiment possible d'effectuer une action de "survol de la souris". Vous devez plutôt enchaîner toutes les actions que vous souhaitez réaliser en une seule fois. Ainsi, déplacez-vous vers l'élément qui révèle les autres, puis, au cours de la même chaîne, déplacez-vous vers l'élément maintenant révélé et cliquez dessus.

Lorsque vous utilisez des chaînes d'action, vous devez vous rappeler de "faire comme un utilisateur".

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();

61voto

zmorris Points 56

Aucune de ces réponses ne fonctionne lorsque vous essayez de faire ce qui suit :

  1. Passez la souris sur un élément de menu.
  2. Trouvez l'élément caché qui n'est disponible qu'après le survol.
  3. Cliquez sur l'élément de sous-menu.

Si vous insérez une commande "perform" après la commande moveToElement, celle-ci se déplace vers l'élément et l'élément de sous-menu s'affiche pendant un court instant, mais ce n'est pas un survol. L'élément caché disparaît immédiatement avant d'être trouvé, ce qui entraîne une exception ElementNotFoundException. J'ai essayé deux choses :

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

Cela n'a pas fonctionné pour moi. La solution suivante a fonctionné pour moi :

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

En utilisant les actions de survol et le clic WebDriver standard, je pouvais survoler puis cliquer.

26voto

Zugwalt Points 3783

Sur la base de ce J'ai réussi à déclencher le survol en utilisant le code suivant avec 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);

11voto

Ce code fonctionne parfaitement bien :

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

Après le passage de la souris, vous pouvez alors effectuer l'action suivante que vous souhaitez sur l'information révélée.

7voto

vins Points 9513

Voyez dans cet exemple comment nous pourrions mettre cela en œuvre.

enter image description here

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();
    }

}

Pour une réponse détaillée, voir ici - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X