Firefox19でSeleniumWebDriverを使用して、Webページでツールチップをテストしようとしています。
基本的に、ツールチップが表示されていることをテストしてホバーするために、マウスアクションを使用してツールチップがアタッチされている要素にカーソルを合わせようとしています。ツールチップが非表示になっていることをテストするために、別の要素の上に移動します。最初の操作は正常に機能しますが、別の要素にカーソルを合わせると、ツールチップが表示されたままになります。この問題は、Webページを手動でテストする場合には発生しません。
他の誰かが以前にこの問題に遭遇したことがありますか?Ubuntu12.04を使用しています。
4 に答える
Advanced Actions API はネイティブ イベントに依存しているようですが、これは Linux バージョンの Firefox ではデフォルトで無効になっています。したがって、WebDriver インスタンスで明示的に有効にする必要があります。
FirefoxProfile profile = new FirefoxProfile();
//explicitly enable native events(this is mandatory on Linux system, since they
//are not enabled by default
profile.setEnableNativeEvents(true);
WebDriver driver = new FirefoxDriver(profile);
また、私の場合、moveToElement
ネイティブ イベントが明示的に有効化されていても、2.30 では hover( ) アクションが適切に機能しなかったため、WebDriver をバージョン 2.31 にアップグレードする必要がありました。Linux 上の WebDriver のバージョン 2.31 と Firefox のバージョン 17 および 19 でこれをテストしました。詳細については、次のリンクを確認してください:
http://code.google.com/p/selenium/wiki/AdvancedUserInteractions#Native_events_versus_synthetic_events
これはシンプルですが便利なメソッドで、指定した要素に mouseout() イベントを送信する JavaScript 呼び出しを使用します (私は By を使用して渡すことを好みますが、これは好きなように変更できます。
クリックするとツールチップが閉じることを拒否し、近くにある他のクリックイベントを覆い隠して失敗するという Chrome の問題がありました。その場合、この方法はその日を救った。それが他の誰かに役立つことを願っています!
/**
* We need this to close help text after selenium clicks
* (otherwise they hang around and block other events)
*
* @param by
* @throws Exception
*/
public void javascript_mouseout(By by) throws Exception {
for (int i=0; i<10; i++) {
try {
JavascriptExecutor js = (JavascriptExecutor)driver;
WebElement element = driver.findElement(by);
js.executeScript("$(arguments[0]).mouseout();", element);
return;
} catch (StaleElementReferenceException e) {
// just catch and continue
} catch (NoSuchElementException e1) {
// just catch and continue
}
}
}
次のような任意の種類の click() イベントの後に呼び出すことができます。
By by_analysesButton = By.cssSelector("[data-section='Analyses']");
javascript_mouseout(by_analysesButton);
参考までに、私たちのアプリはChromeで古い要素の例外に向かう傾向があるため、try / catchを使用してforループを介して10回試行します。この問題がなければ、メソッドを大幅に削減できます。
Firefox 19 の Selenium 2.30 でもこの問題に遭遇しました。FF 18.2 では問題なく動作します。
私も同じ問題を抱えていました。最初は、moveToElement()
なしの方法を使用しましたperform()
。次に、 を追加Firefox Profile
しましsetEnableNativeEvents
たが、それでもうまくいきませんでした。最後に、この方法でこの問題を解決しました(単に追加するだけですperform()
:
WebElement ユーザー名 = driver.findElement(By.id("ユーザー名")); アクション アクション = 新しいアクション (ドライバー); actions.moveToElement(ユーザー名).perform(); WebElement tooltip = driver.findElement(By.id("tooltip")); tooltip.isDisplayed();
そしてそれはうまくいきます。