Есть ли проверенное решение mouseOver для FirefoxDriver в Selenium2?
Я использую 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, я возьму его!
ANSWER (WORKING CODE с 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 в браузерах (который не поддерживается кросс-платформой). Таким образом, этот код может работать не так, если вы меняете ОС. Поэтому я добавил детали ОС и браузера. См. вопрос в группе пользователей селена
Ответы
Ответ 1
Я предлагаю попробовать 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();
Ответ 2
Я использую этот код для получения события 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);
}
Ответ 3
Actions action = new Actions(driver);
action.moveToElement(element).build().perform();
action.moveByOffset(1, 1).build().perform();