2016-11-23 5 views
0

Ich verwende Selenium 3.0.1 für die Durchführung von Automatisierungstests mit TestNG. In einem Test Ich versuche, über ein Aktionsmenü zu schweben und dann in diesem Menü eine Option klicken:moveToElement Mouse Hovering-Funktion in Selenium WebDriver mit Java nicht stabil

Actions builder = new Actions(getWebDriver()); 
builder.moveToElement(actionButton).build().perform(); 

Aber der Test ist nicht stabil. Ich kann sehen, dass sich das Menü öffnet, aber sofort schließt, so dass der Test fehlschlägt, weil er die Option nicht mehr findet. Ich erhalte diese Fehlermeldung:

java.lang.IllegalArgumentException: Must provide a location for a move action. 
at org.openqa.selenium.interactions.MoveMouseAction.<init>(MoveMouseAction.java:30) 
at org.openqa.selenium.interactions.Actions.moveToElement(Actions.java:251) 

Wie kann ich überprüfen, ob das Menü geöffnet ist? Die Methode perform() gibt void zurück. Ich merke, wenn ich das moveToElement zweimal aufrufen, dann ist der Test stabiler. Gibt es eine elegante Option?

Actions builder = new Actions(getWebDriver()); 
builder.moveToElement(actionButton).build().perform(); 
builder.moveToElement(actionButton).build().perform(); 

Dieses, wie das Menü aussieht, wenn wir über sie schweben: hover over menu

ich dieses Problem finden: https://sqa.stackexchange.com/questions/3467/issue-with-losing-focus-of-hover-command-when-the-mouse-is-outside-of-the-acti , die am besten mein Problem erklärt. leider immer noch ohne lösung.

Antwort

1

Wenn Sie das Menü nicht öffnen müssen, klicken Sie bitte auf die Option mit JavascriptExecutor. JavascriptExecutor kann auch auf ein ausgeblendetes Element klicken. Alles was notwendig ist, damit der Klick mit JavascriptExecutor ausgelöst wird, ist, dass das Element im DOM vorhanden ist.

Snippet (Java):

((JavascriptExecutor)driver).executeScript("arguments[0].click()", driver.findElement(By.cssSelector("hiddenOptionFromMenu"))); 
0

Sie können für das Menü warten mit einem FluentWait nach dem Schweben erscheinen, etwa so:

FluentWait<> wait = new FluentWait<>(getWebDriver()) 
      .withTimeout(driverTimeoutSeconds, TimeUnit.SECONDS) 
      .pollingEvery(500, TimeUnit.MILLISECONDS) 
      .ignoring(StaleElementReferenceException.class) 
      .ignoring(NoSuchElementException.class) 
      .ignoring(ElementNotVisibleException.class) 

wait.until(x -> { return driver.findElement(menuElementBy); }); 

Wenn die Maus schweben gelungen - das Menü erscheint, beginnt - es gibt keinen Grund, warum Sie müssen zweimal es nennen.

+0

Das Problem hierbei ist, dass das Menü funktioniert öffnet, aber schließt unmittelbar vor Selenium das Untermenü Taste finden kann. Ich denke, FluentWait wird hier nicht helfen, denn die Speisekarte ist schon geschlossen, so dass es nur auf nichts warten wird. Bitte korrigieren Sie mich, falls ich falsch liege. Ich suche nach einer Möglichkeit, das Dropdown-Menü nach dem Öffnen einzufrieren, ohne es anzuklicken. – sami610

+0

Es ist schwer zu sagen, wenn Sie falsch liegen, ohne das Loch-Szenario und die Website selbst zu sehen ... Also würde ich Sie ermutigen, die Wartezeit zuerst zu versuchen. – Moshisho

+0

Funktioniert es nicht auch mit JavascriptExecutor? ((JavascriptExecutor) -Treiber) .executeScript ("$ ('element_selector'). Hover();"); –

0

Es scheint wie ein Timing-Problem.

Wenn das Menü einen Übergangseffekt hat, dann eine Verzögerung von der Dauer des Effekts hinzu:

new Actions(driver) 
    .moveToElement(menu) 
    .pause(100) // duration of the transition effect in ms 
    .perform(); 

submenu.click(); 

Sie auch für das gezielte Element sichtbar und stetig (gleiche Position in zweimal zurückgegeben werden kann warten Reihe).

+0

Hat auch nicht funktioniert. – sami610

Verwandte Themen