Перейти к содержимому

Фотография

Поиск контрола по имени


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 12

#1 Лена

Лена

    Активный участник

  • Members
  • PipPip
  • 100 сообщений
  • ФИО:Елена

Отправлено 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.
  • 0

#2 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 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 есть встроенная функция.
  • 0
С уважением,
Дмитрий

#3 Лена

Лена

    Активный участник

  • Members
  • PipPip
  • 100 сообщений
  • ФИО:Елена

Отправлено 30 августа 2006 - 08:17

Дмитрий, спасибо.
Вы мне эту функцию уже как-то раз предложили, я ей успешно пользуюсь и выйду из положения с ее помощью.
Мне просто странно, что я не могу просто так найти элемент по свойству Name, при помощи find().
  • 0

#4 Rost

Rost

    Постоянный участник

  • Members
  • PipPipPip
  • 241 сообщений
  • ФИО:Rostyslav Boruk
  • Город:Украина, Киев

Отправлено 30 августа 2006 - 11:22

        page = w.Page("*").ToURL("http://pageName");


Здравствуйте. Я бы порекоммендовал вынести эту строчку за пределы цикла. :clapping:
И попробуйте поставить задержку хотя бы простой Wait. Быть может вы не успеваете получить всю страничку, а уже ищите на ней контролы. :ok:
  • 0
Ростислав Борук,
Консультант по процессам тестирования

#5 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 30 августа 2006 - 12:21

Здравствуйте, Лена.

Мне просто странно, что я не могу просто так найти элемент по свойству Name, при помощи find().

А тут нет ничего странного. Просто функция page.Find ищет объекты по значениям их нативных свойств, а не свойств, видимых в TestComplete. Так как TestComplete именует объекты по аттрибуту ID, то, скорее всего, ваши объекты не имеют значения нативного аттрибута name, но имеют значение аттрибута ID. Попробуйте искать по ID.

Кстати, функция page.Find в TestComplete 3 не работает для объектов, находящихся внутри фреймов. Надо вызывать функцию frame.Find.
  • 0
С уважением,
Дмитрий

#6 Rost

Rost

    Постоянный участник

  • Members
  • PipPipPip
  • 241 сообщений
  • ФИО:Rostyslav Boruk
  • Город:Украина, Киев

Отправлено 30 августа 2006 - 12:55

... Так как TestComplete именует объекты по аттрибуту ID то, скорее всего, ваши объекты не имеют значения нативного аттрибута name, но имеют значение аттрибута ID...


Простите, не вижу связи между именованием по ID и отсутствием нативного аттрибута name. Не могли бы Вы Дмитрий уточнить что имелось ввиду?

... Попробуйте искать по ID ...


Однако его знать надо в run-time. :clapping:
Иначе, малейшее изменение на страничке может дорого стоить.
  • 0
Ростислав Борук,
Консультант по процессам тестирования

#7 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 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.
  • 0
С уважением,
Дмитрий

#8 Гость_FAT_*

Гость_FAT_*
  • Guests

Отправлено 01 сентября 2006 - 09:16

В TestComplete 4 есть встроенная функция.


Здравствуйте Дмитрий.
вы не могли бы сказать как она называется и как вызвать в ТС 4 эту функцию.

З.Ы. Сильно не пинайте, с ТС знаком плохо.

#9 Лена

Лена

    Активный участник

  • Members
  • PipPip
  • 100 сообщений
  • ФИО:Елена

Отправлено 01 сентября 2006 - 09:26


        page = w.Page("*").ToURL("http://pageName");


Здравствуйте. Я бы порекоммендовал вынести эту строчку за пределы цикла. :victory:

Просмотр сообщения

За пределы цикла - не пойдет. Потому что после того, как я кликаю на найденном объекте, попадаю на другую страничку, а мне надо вернуться обратно.
Wait стоит везде, где нужно.
Про Native и не Native - поняла, спасибо, Дмитрий.
  • 0

#10 Лена

Лена

    Активный участник

  • Members
  • PipPip
  • 100 сообщений
  • ФИО:Елена

Отправлено 01 сентября 2006 - 09:28

Объекты на веб странице имеют два набора свойств ID и NAME. Один набор - нативные свойства объекта, другой - свойства добавленные ему TestComplete'ом.

А извиняюсь, в ObjectBrowser видны какие? Нативные или TestComplete-ские?
  • 0

#11 Rost

Rost

    Постоянный участник

  • Members
  • PipPipPip
  • 241 сообщений
  • ФИО:Rostyslav Boruk
  • Город:Украина, Киев

Отправлено 01 сентября 2006 - 12:53


        page = w.Page("*").ToURL("http://pageName");


Здравствуйте. Я бы порекоммендовал вынести эту строчку за пределы цикла. :victory:

Просмотр сообщения

За пределы цикла - не пойдет. Потому что после того, как я кликаю на найденном объекте, попадаю на другую страничку, а мне надо вернуться обратно.
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, " не найдена");
}

Простите, я никак не могу понять зачем Вам загружать страничку если текущий контрол не тот который Вы ищите. :good:
  • 0
Ростислав Борук,
Консультант по процессам тестирования

#12 Rost

Rost

    Постоянный участник

  • Members
  • PipPipPip
  • 241 сообщений
  • ФИО:Rostyslav Boruk
  • Город:Украина, Киев

Отправлено 01 сентября 2006 - 13:00

Простите и в догонку. При Вашем коде в последний раз (если искомый контрол является последним) Вы таки перейдете на другую страничку. Я так понимаю, Вы пытаетесь этого избежать.
  • 0
Ростислав Борук,
Консультант по процессам тестирования

#13 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 01 сентября 2006 - 13:43

Здравствуйте.

А извиняюсь, в ObjectBrowser видны какие? Нативные или TestComplete-ские?

TestComplete'овские. Однако большинство из них - это просто обертки для аналогичных нативных. Те нативные свойства, которые отличаются от ТС'овских по назначению, но одинаковы по названию (например ID или Name), в Object Browser имеют приставку 'Native'. Например 'Native.Id'.

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 гостей, 0 анонимных