Есть ли проверенный обходной путь мыши для 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, я возьму его!
ОТВЕТ (РАБОЧИЙ КОД с 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 ответа
Я бы предложил попробовать API Advanced User Actions, который был добавлен вчера в выпуске 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();
Я использую этот код, чтобы получить событие 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);
}
Actions action = new Actions(driver);
action.moveToElement(element).build().perform();
action.moveByOffset(1, 1).build().perform();