t.me/atinfo_chat Telegram группа по автоматизации тестирования

HtmlUnitDriver не распазнаёт элементы Iframe


(zc84) #1

Добрый день!

столкнулся с проблемой определения элемента 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 пойнтов в карму:)

заранее благодарен


(Mykhailo Poliarush) #2

а какая версия вебдрайвера используется?


(zc84) #3

2.21


(Taras) #4

мне кажеться что ви relativeUp() не делаете просто напросто)


(zc84) #5

именно, не делаю.

не могли бы пояснить?:)

мне казалось что в webdriver эта необходисость отпала, нет?


(Taras) #6

у меня бил проект с фреймами, я при @Before всегда relativep() помню делал, и когда переключался между фреймами, тоже самое, выходил "наверх", а потом уже в фрейм


(zc84) #7

походу вы всётаки имеете в виду selenium rc  с методом selectFrame.

в webdriver для работы с окнами/фреймами используется методы

 

driver.switchTo().frame("наш фрейм айди нейм индекс"); переключение на заданый фрейм

driver.switchTo().defaultContent(); выход из фрейма любого уровня


(Taras) #8

Сори, я вот что имел ввиду

protected void relativeUp(){

 

   getDriver().switchTo().defaultContent();
}
а тогда уже делайте driver.switchTo().frame("наш фрейм айди нейм индекс") так как вы и написали
Еще может быть что вас тег кривой с фреймом

(zc84) #9

у нас походу недопонимание выходит:)

по воркфлоу я и так первоначально нахожусь в defaultContent()(соотвественно мне ваш метод relativeUp() никчему), а мне надо достучаться до элемента, который расположен в iframe. Тобишь я переключаюсь из defaultContent в frame (switchTo().frame) и далее уже обращаюсь к элементу, который никак не хочет находитсья именно в HTMLUNIT(в firefox всё ок, поэтому тег тут нипричём)


(Taras) #10

в какаом броузере не работает ?


(zc84) #11

HtmlUnitDriver не распазнаёт элементы Iframe


(Taras) #12

я не понимаю зачем Вам вообще его использовать, 

http://code.google.com/p/selenium/wiki/HtmlUnitDriver

 

здесь написано что он бедный)

и использует JS , можна просто доступиться через JAva Script Executor к вашему елементу попробовать тогда


(Mykhailo Poliarush) #13

может быть не работает, потому что в момент, когда происходит какое-то действие, появляется 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

 

было бы неплохо увидеть страницу, которую вы тестируете. если есть возможность, залейте ее где-то в интернет.

 


(zc84) #14

Спасибо за ответ!

 

да, с ff драйвером всё работает, а при включённом js в htmlunit посыпались эксепшны. Отправил на на доработку. Отпишусь после того как поправят, даабы выявить проблему окончательно


(Mykhailo Poliarush) #15

скинь потом плиз решение этой проблемы, чтобы можно было перенаправлять людей


(zc84) #16

в общем, пока ничем не могу помоч. Решили не заморачиваться и оставить всё как есть, поэтому локализировать проблему моего случая на 100% пока не удастся


(Mykhailo Poliarush) #17

можно конечно сделать обходной путь и делать действия через javascript

например, я кликал по ссылке с помощью такого javascript

window.frames['Content'].document.getElementById('P_OptionalServDFID_cb_4').click()


(zc84) #18

Кстати да, надо будет попробовать на досуге

спасибо


(Mykhailo Poliarush) #19

только учитывай что метод click() в javascript хорошо работает для виндовых машин, а вот для линукса работать скорее всего не будет


(apetrovskiy) #20

То что надо! По индексу заработало (пока только в хроме):

                     (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;
                    }

Интересно, а можно его ещё как-нибудь заставить генерить ошибку, если, например, имя передал неправильное? А то просто тихо остаётся на том же самом фрейме.