Wie führe ich die Mouseover-Funktion in Selenium WebDriver mit Java aus?


131

Ich möchte die Mouseover-Funktion über ein Dropdown-Menü ausführen. Wenn Sie mit der Maus über das Menü fahren, werden die neuen Optionen angezeigt. Ich habe versucht, mit dem xpath auf die neuen Optionen zu klicken. Kann aber nicht direkt auf die Menüs klicken. Als manuelle Methode versuche ich, mit der Maus über das Dropdown-Menü zu fahren und dann auf die neuen Optionen zu klicken.

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

Überprüfen Sie diese Website für eine detaillierte Antwort - testautomationguru.com/…
vins

Antworten:


115

Es ist nicht wirklich möglich, eine Maus-Hover-Aktion auszuführen. Stattdessen müssen Sie alle Aktionen, die Sie ausführen möchten, auf einmal verketten. Gehen Sie also zu dem Element, das die anderen enthüllt, und wechseln Sie dann während derselben Kette zum jetzt offenbarten Element und klicken Sie darauf.

Wenn Sie Aktionsketten verwenden, müssen Sie daran denken, dies wie ein Benutzer zu tun.

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

5
Bei mir funktioniert das nicht. Mein Menü wird nur schwebend, wenn ich ein build (). Perform () nach einem moveToElement ()
GarfieldKlon

8
Der Grund, warum dies nicht ganz funktionieren würde, ist, dass alle Aufrufe von webdriver.findElement(By... something)vor allem anderen ausgeführt werden (nur so kann das Ergebnis weitergeleitet werden moveElement). Zu diesem Zeitpunkt ist das zweite Element, das Sie suchen möchten, noch nicht sichtbar, da das erste noch über den Mauszeiger bewegt werden muss. Um dies zu beheben, können Sie, wie Sie sagten, Intermediate .perform()s einfügen. Für den zweiten findElementwurde der erste Hover performbearbeitet. Die angegebene Lösung funktioniert möglicherweise, abhängig von der Implementierung der Seite, aber anscheinend waren Ihr und mein Kilometerstand unterschiedlich.
Sander Verhagen

57

Keine dieser Antworten funktioniert, wenn Sie versuchen, Folgendes zu tun:

  1. Bewegen Sie den Mauszeiger über einen Menüpunkt.
  2. Suchen Sie das versteckte Element, das NUR nach dem Hover verfügbar ist.
  3. Klicken Sie auf den Untermenüpunkt.

Wenn Sie nach moveToElement einen Befehl 'perform' einfügen, wird dieser zum Element verschoben, und der Untermenüpunkt wird für einen kurzen Zeitraum angezeigt, dies ist jedoch kein Hover. Das versteckte Element verschwindet sofort, bevor es gefunden werden kann, was zu einer ElementNotFoundException führt. Ich habe zwei Dinge ausprobiert:

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

Das hat bei mir nicht funktioniert. Folgendes hat bei mir funktioniert:

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

Mit den Aktionen zum Schweben und dem Standard-WebDriver-Klick konnte ich schweben und dann klicken.


3
Das zweite Beispiel funktionierte auch für mich beim Hinzufügen von .perform ()
TheRed__

1
Ich kann nicht glauben, dass dies immer noch ein Problem ist ... nicht einmal das funktioniert: builder.moveToElement (Einstellungen) .moveByOffset (0, 30) .moveToElement (stagingMenu) .pause (20000) .keyDown (Keys.CONTROL) .click (stagingMenu) .keyUp (Keys.CONTROL) .sendKeys (Keys.ENTER) .perform (); Ich sehe sogar den Hover-CSS-Trigger auf dem Element in der Zeitüberschreitungsspanne. aber kein Klick wird ausgelöst, egal was ich versuche
Sangoku

Wie würden Sie damit umgehen , wenn die klickbare nicht ein normales Element ist und es kommt wie :: vor . Dies wird sichtbar, wenn Sie mit der Maus schweben
Ashok Kumar Ganesan

25

Basierend auf diesem Blog-Beitrag konnte ich mit dem folgenden Code mit Selenium 2 Webdriver das Schweben auslösen:

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

2
Weniger offensichtliche Lösung, aber 100% solide für meine IE11-Tests. Wenn Sie Probleme mit dem Schweben haben moveToElement, verwenden Sie dieses! Ich codiere in C #, es ist also nicht nur eine Java-Methode, dies zu tun.
vt100


Was ist das arguments[0]?
Arian

@ArianHosseinzadeh ist der in dom übergebene Verweis auf das zweite Argument übergeben an executeScript(), das einwebElement
Zugwalt

Ich bekomme Missign Ref für Javascript Executor. Welche Referenz muss ich in C #
mark1234

11

Dieser Code funktioniert einwandfrei:

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

Nachdem Sie mit der Maus darüber gefahren sind, können Sie die nächste gewünschte Aktion für die angezeigten Informationen ausführen


Ausgezeichnet musste nur hinzufügenusing OpenQA.Selenium.Interactions;
SushiGuy

7

Überprüfen Sie in diesem Beispiel, wie wir dies implementieren können.

Geben Sie hier die Bildbeschreibung ein

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

}

Eine ausführliche Antwort finden Sie hier - http://www.testautomationguru.com/selenium-webdriver-automating-hoverable-multilevel-dropdowns/


5

Ich fand diese Frage auf der Suche nach einer Möglichkeit, dasselbe für meine Javascript-Tests mit Protractor (einem Javascript-Frontend für Selen) zu tun.

Meine Lösung mit Winkelmesser 1.2.0 und Webdriver 2.1:

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

Dies akzeptiert auch einen Versatz (ich benutze ihn, um über und links von einem Element zu klicken :)

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

4

Beispielprogramm zum Bewegen des Mauszeigers mit 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();
    }
}

9
Bitte geben Sie einige Informationen zu Ihrer Antwort an, anstatt nur den Code zu veröffentlichen. Wir versuchen, nicht nur "Korrekturen" bereitzustellen, sondern den Menschen beim Lernen zu helfen. Sie sollten erklären, was im ursprünglichen Code falsch war, was Sie anders gemacht haben und warum Ihre Änderungen funktionierten.
Andrew Barber

2
@ AndrewBarber - Ein bestimmtes Programm kann dem Benutzer wirklich helfen. Das Programm funktioniert einwandfrei. Benutzer hat das bereits akzeptiert ..
Helping Hands

4
Ich bestreite nicht, dass es funktionieren wird . Ich sage, dass Sie erklären sollten, warum es funktionieren könnte, warum das, was sie hatten, nicht funktionierte und was Sie geändert haben.
Andrew Barber

Dieser Code entspricht den OPs und beantwortet die Frage nicht. Ohne Kontextinformationen ist es überflüssig.
Jpaugh

2

Du kannst es versuchen:

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

Wenn das Web viele Kategorien hat, verwenden Sie die erste Methode. Für das gewünschte Menü benötigen Sie nur die zweite Methode.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.