Есть ли проверенный обходной путь мыши для FirefoxDriver в Selenium2? - PullRequest
19 голосов
/ 04 июня 2011

Я использую 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) : Спасибо Энди Тинхэмуи Люк Инман-Семерау:

//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 в браузерах (которые не поддерживаются кроссплатформенными).Так что этот код может не работать так же, если вы меняете ОС.Вот почему я добавил детали ОС и браузера.См. вопрос в группе пользователей селена

Ответы [ 3 ]

18 голосов
/ 04 июня 2011

Я бы предложил попробовать Advanced User Actions API , который был добавлен вчера в выпуске 2.0rc1, так как похоже, что вы все еще используете API Selenium 1 (проходит через WebDriverBackedSelenium), и я ' Я не уверен, сколько поддержки Firefox 4 обеспечивает. Я не использую Java для своих тестов Selenium, но мне кажется, что вы хотели бы сделать что-то вроде этого:

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

   Actions hoverOverRegistrar = builder.moveToElement(menuRegistrar);

   hoverOverRegistrar.perform();
4 голосов
/ 16 марта 2012

Я использую этот код, чтобы получить событие mouseover для определенного элемента 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);
}
1 голос
/ 07 марта 2012
Actions action = new Actions(driver);
action.moveToElement(element).build().perform();
action.moveByOffset(1, 1).build().perform();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...