Поиск контрола по имени
#1
Отправлено 29 августа 2006 - 10:56
Расскажите, пожалуйста, можно ли найти элемент на странице по свойству Name?
Я тестирую WEB-приложение. У меня на странице есть несколько иконок с названиями icon_1, icon_2 и так далее. Мне нужно нажать все эти иконки по очереди.
Пишу:
for(i=0; i<20; i++)
{
page = w.Page("*").ToURL("http://pageName");
controlName = "icon_"+ i;
control = page.find("Name", controlName, "IMG");
if(control.Exists)
{
control.Click();
}
else
Log.Error("Кнопка ", controlName, " не найдена");
}
И у меня все кнопки не найдены. Хотя они есть на странице, и я их вижу в ObjectBrowser. Может, функция find не работает со свойством Name? у меня TestComplete 3.12.
#2
Отправлено 29 августа 2006 - 11:28
Раньше (с ТС3) я использовал такую функцию:
function FindObjectsByPropVal(Object, PropertyName, PropertyValue) { var arr = new Array(); if (IsSupported(Object, PropertyName)) { var ObjChildCount, StringToEval, Val, ObjChildCount, i, ResObj, Arr; var evalStr = "Object." + PropertyName; eval("var val =" + evalStr); if (val == PropertyValue) arr.push(Object); } var currentObj; for (var i = 0; i < Object.ChildCount; i++) { currentObj = Object.Child(i); arr = arr.concat(FindObjectsByPropVal(currentObj, PropertyName, PropertyValue)); } return arr; }В TestComplete 4 есть встроенная функция.
Дмитрий
#3
Отправлено 30 августа 2006 - 08:17
Вы мне эту функцию уже как-то раз предложили, я ей успешно пользуюсь и выйду из положения с ее помощью.
Мне просто странно, что я не могу просто так найти элемент по свойству Name, при помощи find().
#4
Отправлено 30 августа 2006 - 11:22
page = w.Page("*").ToURL("http://pageName");
Здравствуйте. Я бы порекоммендовал вынести эту строчку за пределы цикла.
И попробуйте поставить задержку хотя бы простой Wait. Быть может вы не успеваете получить всю страничку, а уже ищите на ней контролы.
Консультант по процессам тестирования
#5
Отправлено 30 августа 2006 - 12:21
А тут нет ничего странного. Просто функция page.Find ищет объекты по значениям их нативных свойств, а не свойств, видимых в TestComplete. Так как TestComplete именует объекты по аттрибуту ID, то, скорее всего, ваши объекты не имеют значения нативного аттрибута name, но имеют значение аттрибута ID. Попробуйте искать по ID.Мне просто странно, что я не могу просто так найти элемент по свойству Name, при помощи find().
Кстати, функция page.Find в TestComplete 3 не работает для объектов, находящихся внутри фреймов. Надо вызывать функцию frame.Find.
Дмитрий
#6
Отправлено 30 августа 2006 - 12:55
... Так как TestComplete именует объекты по аттрибуту ID то, скорее всего, ваши объекты не имеют значения нативного аттрибута name, но имеют значение аттрибута ID...
Простите, не вижу связи между именованием по ID и отсутствием нативного аттрибута name. Не могли бы Вы Дмитрий уточнить что имелось ввиду?
... Попробуйте искать по ID ...
Однако его знать надо в run-time.
Иначе, малейшее изменение на страничке может дорого стоить.
Консультант по процессам тестирования
#7
Отправлено 30 августа 2006 - 13:36
Объекты на веб странице имеют два набора свойств ID и NAME. Один набор - нативные свойства объекта, другой - свойства добавленные ему TestComplete'ом. Например:
function Test1() { var p, w, page p = Sys.Process("IEXPLORE") w = p.Window("IEFrame", "*") w.Activate() page = w.Page("*").ToURL("http://www.automatedqa.com") var obj = page.document.all.productBox; Log.Message("TestComplete properties:\r\n" + "Name: " + VarToStr(obj.Name) + "\r\n" + "Id: " + VarToStr(obj.Id)); Log.Message("Native attributes:\r\n" + "Name: " + VarToStr((IsSupported(obj.Native, "name") ? obj.Native.name : "< empty >")) + "\r\n" + "Id: " + VarToStr(obj.Native.id)); }
Результат:
TestComplete properties:
Name: productBox
Id: 71
Native attributes:
Name: < empty >
Id: productBox
Метод page.Find ищет объекты по тем свойствам, которые доступны через obj.Native. Как правило, значение свойства obj.name равно значению obj.Native.id.
Дмитрий
#8 Гость_FAT_*
Отправлено 01 сентября 2006 - 09:16
В TestComplete 4 есть встроенная функция.
Здравствуйте Дмитрий.
вы не могли бы сказать как она называется и как вызвать в ТС 4 эту функцию.
З.Ы. Сильно не пинайте, с ТС знаком плохо.
#9
Отправлено 01 сентября 2006 - 09:26
За пределы цикла - не пойдет. Потому что после того, как я кликаю на найденном объекте, попадаю на другую страничку, а мне надо вернуться обратно.
page = w.Page("*").ToURL("http://pageName");
Здравствуйте. Я бы порекоммендовал вынести эту строчку за пределы цикла.
Wait стоит везде, где нужно.
Про Native и не Native - поняла, спасибо, Дмитрий.
#10
Отправлено 01 сентября 2006 - 09:28
А извиняюсь, в ObjectBrowser видны какие? Нативные или TestComplete-ские?Объекты на веб странице имеют два набора свойств ID и NAME. Один набор - нативные свойства объекта, другой - свойства добавленные ему TestComplete'ом.
#11
Отправлено 01 сентября 2006 - 12:53
За пределы цикла - не пойдет. Потому что после того, как я кликаю на найденном объекте, попадаю на другую страничку, а мне надо вернуться обратно.
page = w.Page("*").ToURL("http://pageName");
Здравствуйте. Я бы порекоммендовал вынести эту строчку за пределы цикла.
Wait стоит везде, где нужно.
Про Native и не Native - поняла, спасибо, Дмитрий.
Ок. Тогда предлагаю такой вариант:
page = w.Page("*").ToURL("http://pageName"); for(i=0; i<20; i++) { controlName = "icon_"+ i; control = page.find("Name", controlName, "IMG"); if(control.Exists) { control.Click(); page = w.Page("*").ToURL("http://pageName"); } else Log.Error("Кнопка ", controlName, " не найдена"); }
Простите, я никак не могу понять зачем Вам загружать страничку если текущий контрол не тот который Вы ищите.
Консультант по процессам тестирования
#12
Отправлено 01 сентября 2006 - 13:00
Консультант по процессам тестирования
#13
Отправлено 01 сентября 2006 - 13:43
TestComplete'овские. Однако большинство из них - это просто обертки для аналогичных нативных. Те нативные свойства, которые отличаются от ТС'овских по назначению, но одинаковы по названию (например ID или Name), в Object Browser имеют приставку 'Native'. Например 'Native.Id'.А извиняюсь, в ObjectBrowser видны какие? Нативные или TestComplete-ские?
to FAT:
Их там даже несколько:вы не могли бы сказать как она называется и как вызвать в ТС 4 эту функцию.
- obj.Find() // раздел справки 'Find Method'
- obj.FindAll() // раздел 'FindAll Method'
- obj.FindChild() // раздел 'FindChild Method'
- obj.FindAllChildren() // раздел 'FindAllChildren Method'
Все эти методы ищут объект или объекты по их TestComplete'овским свойствам (одному или нескольким). Метод page.Find для Веб страниц тоже остался. Только теперь доступ к нему возможем через пространство имен NativeWebObject. Например 'page.NativeWebObject.Find()'. Смотрите одноименный раздел справки.
Дмитрий
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных