2016-11-23 188 views
0

我使用Selenium 3.0.1運行使用TestNG的自動化測試。 在一次測試中我試圖懸停動作菜單,然後單擊該菜單中的選項:moveToElement鼠標懸停功能在Selenium WebDriver中使用Java不穩定

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

但測試並不穩定。我可以看到菜單打開但立即關閉,所以測試失敗,因爲它沒有找到選項。 我收到此錯誤:

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) 

我如何檢查菜單打開? perform()方法返回void。 我注意到如果我把moveToElement調用兩次,比測試更穩定。有沒有這樣做的優雅選擇?

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

這菜單看起來如何,當我們將鼠標懸停在它像: hover over menu

我發現這個問題: https://sqa.stackexchange.com/questions/3467/issue-with-losing-focus-of-hover-command-when-the-mouse-is-outside-of-the-acti 這也解釋了最好的我的問題。不幸的是,仍然沒有解決方案。

回答

1

如果您沒有必要打開菜單,請嘗試使用JavascriptExecutor單擊該選項。 JavascriptExecutor也可以單擊一個隱藏元素,使用JavascriptExecutor觸發點擊所需的全部內容就是該元素存在於DOM中。

片段(JAVA):

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

您可以等待菜單懸停後出現了FluentWait,像這樣:

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

如果鼠標懸停成功 - 菜單開始出現 - 沒有理由需要兩次調用它。

+0

這裏的問題是,菜單不打開,但關閉之前硒能找到的子菜單按鈕。我覺得FluentWait在這裏不會有幫助,因爲菜單已經關閉了,所以它只會等待一切。如果我錯了,請糾正我。 我正在尋找的是一種在打開後凍結下拉菜單但不點擊它的方法。 – sami610

+0

很難說如果你的錯誤沒有看到洞情節和網站本身......所以我會鼓勵你先嚐試等待。 – Moshisho

+0

它是否也與JavaScriptExecutor一起使用? ((JavascriptExecutor)driver).executeScript(「$('element_selector')。hover();」); –

0

這似乎是一個時間問題。

如果菜單有一個過渡效果,然後添加效果的持續時間的延遲:

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

submenu.click(); 

您也可以等待目標元素變得可見,穩定(同一位置的返回兩次行)。

+0

也沒有工作。 – sami610

相關問題