我正在使用 Selenium Java 2.0b3 。我有这段代码:
...
WebDriver driver = new InternetExplorerDriver();
Selenium seleniumDriver = new WebDriverBackedSelenium(driver, "http://localhost:8088/Sistema/");
...
...
RenderedWebElement menuRegistrar = (RenderedWebElement)driver.findElement(By.xpath("//a[normalize-space()='Registrar']"));
seleniumDriver.mouseOver("//a[normalize-space()='Registrar']"); //makes element visible
menuRegistrar.click();
seleniumDriver.mouseOut("//a[normalize-space()='Registrar']");
...
与InternetExplorerDriver(使用 IE 8 )的魅力相似,但不适用于FirefoxDriver(使用 Firefox 4 )。我用代码尝试了很多东西,没有任何作用。我必须使用FirefoxDriver,因为我正在测试的应用程序在IE上表现不佳。
正如您可能猜到的那样,“注册器”链接将被隐藏,直到mouseOver事件触发。
任何经过验证的解决方法?谢谢你的时间......
编辑:还尝试过使用Chrome 11的ChromeDriver。也没用。如果有适用于Chrome的解决方法,我会接受它!
ANSWER(Selenium Java 2.0RC1,Windows 7,Firefox 4的工作代码):感谢Andy Tinkham和Luke Inman-Semerau:
//get the element that shows menu with the mouseOver event
WebElement menu = driver.findElement(By.xpath("//div[@id='nav']/li[3]"));
//the element that I want to click (hidden)
WebElement menuOption = driver.findElement(By.xpath("//a[normalize-space()='Registrar']"));
//build and perform the mouseOver with Advanced User Interactions API
Actions builder = new Actions(driver);
builder.moveToElement(menu).build().perform();
//then click when menu option is visible
menuOption.click();
注意:高级用户交互API在浏览器上使用NativeEvents(跨平台不支持)。因此,如果您更改操作系统,此代码可能无法正常工作。这就是我添加操作系统和浏览器细节的原因。见question in selenium users group
答案 0 :(得分:18)
我建议尝试昨天在2.0rc1版本中添加的Advanced User Actions API,因为看起来你仍在使用Selenium 1 API(通过WebDriverBackedSelenium),我不知道多少提供的Firefox 4支持。我没有在我的Selenium测试中使用Java,但它看起来像你想要做的是这样的事情:
Actions builder = new Actions(driver); // Or maybe seleniumDriver? Not sure which one to use
Actions hoverOverRegistrar = builder.moveToElement(menuRegistrar);
hoverOverRegistrar.perform();
答案 1 :(得分:4)
我使用此代码获取特定webelement的鼠标悬停事件。它不需要本机事件。
protected void mouseOver(WebElement element) {
String code = "var fireOnThis = arguments[0];"
+ "var evObj = document.createEvent('MouseEvents');"
+ "evObj.initEvent( 'mouseover', true, true );"
+ "fireOnThis.dispatchEvent(evObj);";
((JavascriptExecutor) driver).executeScript(code, element);
}
答案 2 :(得分:1)
Actions action = new Actions(driver);
action.moveToElement(element).build().perform();
action.moveByOffset(1, 1).build().perform();