web-dev-qa-db-ja.com

Selenium2のFirefoxDriverで証明された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)。私はコードで多くのことを試しましたが、何も機能しません。そして、私がテストしているアプリケーションはIEでうまく動作しないため、私はmustFirefoxDriverを使用する必要があります。

ご想像のとおり、「Registrar」リンクは、mouseOverイベントがトリガーされるまで非表示になっています。

証明された回避策はありますか?御時間ありがとうございます...

[〜#〜] edit [〜#〜]:ChromeDriverもChrome 11。動作しませんでしたChromeで動作する回避策がある場合は、それを採用します。


ANSWER(Seleniumでの作業コードJava 2.0RC1、Windows 7、Firefox 4):AndyTinkhamと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();

注:Advanced User Interaction APIは、ブラウザーでNativeEventsを使用します(クロスプラットフォームではサポートされていません)。そのため、OSを変更した場合、このコードはそのように機能しない可能性があります。そのため、OSとブラウザの詳細を追加しました。 Seleniumユーザーグループの質問 を参照してください

19
Juan Paredes

昨日2.0rc1リリースで追加された Advanced User Actions API を試してみることをお勧めします。Selenium1APIをまだ使用しているようです(WebDriverBackedSeleniumを使用しているようです)。提供するFirefox4サポートの量を確認してください。私はSeleniumテストにJavaを使用していませんが、あなたがやりたいことは次のようなもののように見えます。

   Actions builder = new Actions(driver); // Or maybe seleniumDriver? Not sure which one to use

   Actions hoverOverRegistrar = builder.moveToElement(menuRegistrar);

   hoverOverRegistrar.perform();
18
Andy Tinkham

このコードを使用して、特定のWeb要素のマウスオーバーイベントを取得します。ネイティブイベントは必要ありません。

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