我一直在尝试使用 Selenium WebDriver 和 Firefox 19 在我的网页中测试工具提示。
我基本上是在尝试使用鼠标操作将鼠标悬停在附加了工具提示的元素上,以测试工具提示是否显示并悬停在另一个元素上测试工具提示是否隐藏。第一个操作工作正常,但是当将鼠标悬停在另一个元素上时,工具提示仍然可见。手动测试网页时不会出现此问题。
以前有没有其他人遇到过这个问题?我正在使用 Ubuntu 12.04。
4 回答
高级操作 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);
此外,在我的情况下,我需要将 WebDriver 升级到 2.31 版,因为moveToElement
即使显式启用了本机事件, hover() 操作在 2.30 上也无法正常工作。在 Linux 上使用 2.31 版的 WebDriver 和 17 版和 19 版的 Firefox 对此进行了测试。有关更多信息,您可以查看此链接:
http ://code.google.com/p/selenium/wiki/AdvancedUserInteractions#Native_events_versus_synthetic_events
我在 Firefox 19 上的 Selenium 2.30 也遇到了这个问题。它在 FF 18.2 上运行良好。
这是一个简单但方便的方法,带有一个 javascript 调用,它将向您指定的任何元素发送 mouseout() 事件(我更喜欢使用 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);
仅供参考,我的通过带有 try/catch 的 for 循环尝试 10 倍,因为我们的应用程序在 Chrome 中倾向于出现陈旧元素异常,因此如果您没有这个问题,则可以大大减少该方法。
我有同样的问题。起初我使用moveToElement()
没有perform()
. 然后我添加Firefox Profile
了setEnableNativeEvents
,但它仍然对我不起作用。最后我以这种方式解决了这个问题(只需添加perform()
:
WebElement 用户名 = driver.findElement(By.id("username")); 动作动作=新动作(驱动程序); actions.moveToElement(username).perform(); WebElement tooltip = driver.findElement(By.id("tooltip")); tooltip.isDisplayed();
它工作正常。