在Selenium2中是否有针对FirefoxDriver的经过validation的mouseOver解决方法?

我正在使用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事件触发。

任何经证实的解决方法? 谢谢你的时间…

编辑 :还试用ChromeDriver与Chrome 11.也没用。 如果有适用于Chrome的解决方法,我会接受它!


答案(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(跨平台不支持)。 因此,如果您更改操作系统,此代码可能无法正常工作。 这就是我添加操作系统和浏览器细节的原因。 请参阅selenium用户组中的问题

我建议尝试昨天在2.0rc1版本中添加的高级用户操作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(); 

我使用此代码获取特定webelement的mouseover事件。 它不需要本机事件。

 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); } 
 Actions action = new Actions(driver); action.moveToElement(element).build().perform(); action.moveByOffset(1, 1).build().perform();