Comment exécuter la fonction de survol de la souris dans Selenium WebDriver à l'aide de Java?

132

Je veux faire passer la souris sur un menu déroulant. Lorsque nous survolons le menu, il affichera les nouvelles options. J'ai essayé de cliquer sur les nouvelles options en utilisant le xpath. Mais ne peut pas cliquer directement sur les menus. Donc, en tant que méthode manuelle, j'essaie de survoler le menu déroulant, puis je clique 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();
Pradeep SJ
la source
Consultez ce site pour une réponse détaillée - testautomationguru.com
vins

Réponses:

116

Il n'est pas vraiment possible d'effectuer une action de "survol de la souris", mais vous devez enchaîner toutes les actions que vous souhaitez réaliser en une seule fois. Passez donc à l'élément qui révèle les autres, puis au cours de la même chaîne, passez à 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 le ferait».

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
la source
5
Pour moi, cela ne fonctionne pas. Mon menu n'est survolé que si j'effectue un build (). Perform () après un moveToElement ()
GarfieldKlon
8
La raison pour laquelle cela ne fonctionnerait pas tout à fait est que tous les appels à webdriver.findElement(By... something)sont exécutés avant toute autre chose (c'est la seule façon dont leur résultat peut être transmis moveElement). À ce moment-là, le deuxième élément que vous souhaitez rechercher n'est pas encore visible car le premier doit encore être survolé. Pour résoudre ce problème, comme vous l'avez dit, vous pouvez insérer des intermédiaires .perform(), puis pour le second findElement, le premier survol aura été performmodifié. La solution donnée pourrait fonctionner, en fonction de la mise en œuvre de la page, mais apparemment, votre kilométrage et mon kilométrage variaient.
Sander Verhagen
57

Aucune de ces réponses ne fonctionne lorsque vous essayez d'effectuer les opérations suivantes:

  1. Survolez un élément de menu.
  2. Trouvez l'élément masqué qui est UNIQUEMENT disponible après le survol.
  3. Cliquez sur l'élément du sous-menu.

Si vous insérez une commande 'perform' après le moveToElement, elle se déplace vers l'élément et l'élément de sous-menu s'affiche pendant une brève période, mais ce n'est pas un survol. L'élément masqué 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. Ce qui suit 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 pour survoler et le clic WebDriver standard, je pourrais passer le curseur, puis cliquer.

zmorris
la source
3
Le deuxième exemple a également fonctionné pour moi lors de l'ajout de .perform ()
TheRed__
1
Je ne peux pas croire que c'est toujours un problème ... même cela ne fonctionne pas: builder.moveToElement (paramètres) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); Je vois même le déclencheur css de survol sur l'élément dans le délai d'expiration. mais aucun clic ne se déclenche, peu importe ce que j'essaye
Sangoku
Comment géreriez-vous si l'élément cliquable n'est pas un élément normal et qu'il se présente comme :: avant . Cet avant est visible lorsque vous survolez la souris
Ashok kumar Ganesan
25

Sur la base de cet article de blog, j'ai pu déclencher le survol à l'aide du 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);
Zugwalt
la source
2
Solution moins évidente, mais 100% solide pour mes tests IE11. Si vous avez des problèmes pour survoler moveToElement, utilisez celui-ci! Je code en C #, donc ce n'est pas seulement une façon Java de le faire.
vt100
Selenium Mouse Actions & Waits , Javascript initMouseEvent () Example
Yash
Qu'est-ce que c'est arguments[0]?
Arian
@ArianHosseinzadeh c'est la référence passée au deuxième argument passé à executeScript(), qui est unwebElement
Zugwalt
Je reçois une référence missign pour l'exécuteur Javascript. Quelle référence dois-je ajouter en C #
mark1234
11

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 ensuite effectuer l'action suivante que vous souhaitez sur les informations révélées


la source
Excellent vient d'ajouterusing OpenQA.Selenium.Interactions;
SushiGuy
7

Vérifiez cet exemple comment nous pourrions implémenter cela.

entrez la description de l'image ici

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, consultez ici - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/

vins
la source
5

J'ai trouvé cette question à la recherche d'un moyen de faire la même chose pour mes tests Javascript, en utilisant Protractor (une interface javascript vers Selenium.)

Ma solution avec protractor 1.2.0 et webdriver 2.1:

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

Cela accepte également un décalage (je l'utilise pour cliquer au-dessus et à gauche d'un élément :)

browser.actions()
.mouseMove(
  element(by.css('.material-dialog-container'))
  , -20, -20  // pixel offset from top left
)
.click()
.perform();
Platon
la source
4

Exemple de programme pour survoler la souris à l'aide de 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();
    }
}
Aider les mains
la source
9
Veuillez envisager d'inclure des informations sur votre réponse, plutôt que de simplement publier un code. Nous essayons non seulement de fournir des «correctifs», mais d'aider les gens à apprendre. Vous devez expliquer ce qui n'allait pas dans le code d'origine, ce que vous avez fait différemment et pourquoi vos modifications ont fonctionné.
Andrew Barber
2
@AndrewBarber - Un programme donné peut vraiment aider l'utilisateur. Ce programme fonctionne correctement. L'utilisateur a déjà accepté cela ..
Helping Hands
4
Je ne conteste pas que cela fonctionnera ; Je dis que vous devriez expliquer pourquoi cela pourrait fonctionner, pourquoi ce qu'ils avaient ne fonctionnait pas et ce que vous avez changé.
Andrew Barber
Ce code est équivalent aux OP et ne répond pas à la question. Sans aucune information contextuelle, c'est superflu.
jpaugh
2

Tu peux essayer:

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 vous aviez le cas, le Web a plusieurs catégories, utilisez la première méthode. Pour le menu que vous vouliez, vous avez juste besoin de la deuxième méthode.

Prasetyo Budi
la source