Добрый день!
столкнулся с проблемой определения элемента HtmlUnitDriver в Iframe.
Можект кто сталкивался?
итого:
На одном хосте сидит приложение в нём сидит iframe у iframe есть webelement. Надо до этого webelement и достучаться собсно.
проблема:
при использовании HtmlUnitDriver получаю nosuchelement exception. Причём пробовал играться с локаторами и так и эдак, пропертей у элемента хвататет. При использовании FireFoxdriver всё работает на 5+
детали:
1. driver = new HtmlUnitDriver(); - org.openqa.selenium.NoSuchElementException
2. Поиск элемента:
@FindBy (id = "year")
public WebElement dropdownYear;
3. перескакивание на фрейм по индексу, за неимением имени:
driver.switchTo().frame(0);
4. Работа с элементом:
Select select = new Select(dropdownMonth);
select.selectByVisibleText(month);
Вроде всё необходимое указал
всем откликнувшемся кину +5 пойнтов в карму:)
заранее благодарен
а какая версия вебдрайвера используется?
2.21
мне кажеться что ви relativeUp() не делаете просто напросто)
именно, не делаю.
не могли бы пояснить?:)
мне казалось что в webdriver эта необходисость отпала, нет?
у меня бил проект с фреймами, я при @Before всегда relativep() помню делал, и когда переключался между фреймами, тоже самое, выходил "наверх", а потом уже в фрейм
походу вы всётаки имеете в виду selenium rc с методом selectFrame.
в webdriver для работы с окнами/фреймами используется методы
driver.switchTo().frame("наш фрейм айди нейм индекс"); переключение на заданый фрейм
driver.switchTo().defaultContent(); выход из фрейма любого уровня
Сори, я вот что имел ввиду
protected void relativeUp(){
у нас походу недопонимание выходит:)
по воркфлоу я и так первоначально нахожусь в defaultContent()(соотвественно мне ваш метод relativeUp() никчему), а мне надо достучаться до элемента, который расположен в iframe. Тобишь я переключаюсь из defaultContent в frame (switchTo().frame) и далее уже обращаюсь к элементу, который никак не хочет находитсья именно в HTMLUNIT(в firefox всё ок, поэтому тег тут нипричём)
в какаом броузере не работает ?
HtmlUnitDriver не распазнаёт элементы Iframe
я не понимаю зачем Вам вообще его использовать,
http://code.google.com/p/selenium/wiki/HtmlUnitDriver
здесь написано что он бедный)
и использует JS , можна просто доступиться через JAva Script Executor к вашему елементу попробовать тогда
может быть не работает, потому что в момент, когда происходит какое-то действие, появляется javascript error
а вы пробовали:
1. запустить этот же тест на несколько версий веб-драйвера ниже
2. запустить на файерфоксе и посмотреть работает ли он
3. запустить htmlunitdriver c включенным javascript
4. поискать похожме баги на http://code.google.com/p/selenium/issues/list?can=2&q=iframe&colspec=ID+Stars+Type+Status+Priority+Milestone+Owner+Summary&cells=tiles
было бы неплохо увидеть страницу, которую вы тестируете. если есть возможность, залейте ее где-то в интернет.
Спасибо за ответ!
да, с ff драйвером всё работает, а при включённом js в htmlunit посыпались эксепшны. Отправил на на доработку. Отпишусь после того как поправят, даабы выявить проблему окончательно
скинь потом плиз решение этой проблемы, чтобы можно было перенаправлять людей
в общем, пока ничем не могу помоч. Решили не заморачиваться и оставить всё как есть, поэтому локализировать проблему моего случая на 100% пока не удастся
можно конечно сделать обходной путь и делать действия через javascript
например, я кликал по ссылке с помощью такого javascript
window.frames['Content'].document.getElementById('P_OptionalServDFID_cb_4').click()
Кстати да, надо будет попробовать на досуге
спасибо
только учитывай что метод click() в javascript хорошо работает для виндовых машин, а вот для линукса работать скорее всего не будет
То что надо! По индексу заработало (пока только в хроме):
(driver as IWebDriver).SwitchTo().DefaultContent();
switch (selector) {
case SwitchToFrameWays.FrameElement:
errorReport = "FrameElement = " + ((SwitchToCmdletBase)cmdlet).FrameElement.ToString();
cmdlet.WriteObject(cmdlet, (driver as IWebDriver).SwitchTo().Frame(((SwitchToCmdletBase)cmdlet).FrameElement));
break;
case SwitchToFrameWays.FrameIndex:
errorReport = "FrameIndex = " + ((SwitchToCmdletBase)cmdlet).FrameIndex.ToString();
cmdlet.WriteObject(cmdlet, (driver as IWebDriver).SwitchTo().Frame(((SwitchToCmdletBase)cmdlet).FrameIndex));
break;
case SwitchToFrameWays.FrameName:
errorReport = "FrameName = " + ((SwitchToCmdletBase)cmdlet).FrameName;
cmdlet.WriteObject(cmdlet, (driver as IWebDriver).SwitchTo().Frame(((SwitchToCmdletBase)cmdlet).FrameName));
break;
}
Интересно, а можно его ещё как-нибудь заставить генерить ошибку, если, например, имя передал неправильное? А то просто тихо остаётся на том же самом фрейме.