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

Фотография

[QTP 10] Как найти объект, не содержащийся в репозитории объектов


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

#1 EugeneL

EugeneL

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

  • Members
  • PipPip
  • 101 сообщений

Отправлено 05 декабря 2011 - 13:40

Добрый день.

Встала задача найти определенный объект, с заранее известными свойствами, но не хранящийся в репозитории: объект может быть произвольным, подобных объектов может быть очень много. У объекта известно:
- Class Name = Link // это гиперссылка
- text == innerttext == outertext // название модели, например, телефона, которое задано параметром

Для отыскания объекта использовал несколько подходов

Первый:
Set decrModelHyperLink = Description.Create
decrModelHyperLink("name").Value = tmpModelName
decrModelHyperLink("href").RegularExpression = False
decrModelHyperLink("micclass").Value = "Link"
decrModelHyperLink("micclass").RegularExpression = False
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    Set hyperLinkModel = hyperLinkModelList(i)
    hyperLinkModel.WaitProperty "visible", True, (intDelaySeconds * 1000)
    CheckAvailability hyperLinkModel, "Hyperlink on model " & tmpModelName
    hyperLinkModel.Click

Next
Вызывает ошибку в строке Click. Параметры гиперрссылки неопределены (т.е. GetROProperty(<smth>) выдвет Empty

Второй
Set decrModelHyperLink = Description.Create
decrModelHyperLink("Class Name").Value = "Link"
decrModelHyperLink("text").Value = tmpModelName
decrModelHyperLink("outertext").Value = tmpModelName
decrModelHyperLink("innertext").Value = tmpModelName
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    

Next
Не находит нужную гиперссылку вообще (хотя на странице она есть)

Третий
Set decrModelHyperLink = Description.Create
decrModelHyperLink("text").Value = tmpModelName
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    Set hyperLinkModel = hyperLinkModelList(i)

Next
Вызывает ошибку во вложенной строке цикла Set, хотя найденный объект -- всего один. Если верить spy, то это -- именно эта ссылка, иначе их должно быть больше.

На странице гиперссылка присутствует (смотрел Object Spy), свойства оттуда и брал. Подскажите, в чем может быть проблема

Edit: процедура CheckAvailability проверяет свойство Exist объекта и пишет в Report либо micPass либо micFail
Edit 2: на самом деле нужный набор гиперссылок содержится в WebTable, но я не могу ее накликать из Object Spy: я могу добавить только самый нижний объект иерархии, но ткнуть именно в таблицу наугад не получается из-за смещения

  • 0

#2 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 05 декабря 2011 - 14:09

Не используйте ChildObjects, он криво работает. Максимум для чего его можно использовать - получить количество объектов с заданным описанием на странице
Попробуйте
Dim i, count
count = pgProduct.ChildObjects(decrModelHyperLink).count
for i=0 to count
  decrModelHyperLink("index") = i
  Set link = pgProduct.Link(decrModelHyperLink)
  If link.Exist(0) Then
    link.Click
  Else
    Reporter.ReportEvent micFail, "Link doesn't exist", ""
  End If
Next
P.S. Может быть вместо Link нужно писать WebLink, не очень помню, как в QTP этот класс называется.
  • 0

#3 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 05 декабря 2011 - 14:11

Edit 2: на самом деле нужный набор гиперссылок содержится в WebTable, но я не могу ее накликать из Object Spy: я могу добавить только самый нижний объект иерархии, но ткнуть именно в таблицу наугад не получается из-за смещения[/b]

Не очень понял, что не получается накликать?
не надо помещать динамические объекты в ОР. Тяжело будет с ними работать, ведь заранее неизвестно, сколько их там.
Ну а спаем вы можете посмотреть любой объект из предложенной иерархии, и соответственно, в репозиторий вы можете добавить любые объекты со страницы
  • 0

#4 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 05 декабря 2011 - 14:14

Для отыскания объекта использовал несколько подходов

Первый:

Set decrModelHyperLink = Description.Create
decrModelHyperLink("name").Value = tmpModelName
decrModelHyperLink("href").RegularExpression = False
decrModelHyperLink("micclass").Value = "Link"
decrModelHyperLink("micclass").RegularExpression = False
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    Set hyperLinkModel = hyperLinkModelList(i)
    hyperLinkModel.WaitProperty "visible", True, (intDelaySeconds * 1000)
    CheckAvailability hyperLinkModel, "Hyperlink on model " & tmpModelName
    hyperLinkModel.Click

Next
Вызывает ошибку в строке Click. Параметры гиперрссылки неопределены (т.е. GetROProperty(<smth>) выдвет Empty

Какую ошибку вызывает? Что при этом в логе пишет процедура CheckAvailability?
Логичнее, кстати, сделать ее не процедурой, а функцией, возвращающей результат Exist'a

--------
Третий

Set decrModelHyperLink = Description.Create
decrModelHyperLink("text").Value = tmpModelName
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    Set hyperLinkModel = hyperLinkModelList(i)

Next
Вызывает ошибку во вложенной строке цикла Set, хотя найденный объект -- всего один. Если верить spy, то это -- именно эта ссылка, иначе их должно быть больше.

Какую ошибку возвращает?
  • 0

#5 EugeneL

EugeneL

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

  • Members
  • PipPip
  • 101 сообщений

Отправлено 05 декабря 2011 - 14:25

Выдает "General Runtime error", а далее приклеивает строку с ошибкой... В логе запись "12/5/2011 5:05:48 PM Model Nokia 101 found successfully" (в случае, если он доходит до процедуры CheckAvailability() ). Визуально на экране я ссылку уже вижу, но она не открывается QTP

Почему CheckAvailability() не функция: она делает одну-единственную проверку (оператор if - then - else) и делает запись в лог. В принципе, если еще раз анализировать ее результат, то проще вообще не делать такую функцию (но мне она нужна, так сказать, "по условию задачи") -- она слишком проста
  • 0

#6 EugeneL

EugeneL

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

  • Members
  • PipPip
  • 101 сообщений

Отправлено 06 декабря 2011 - 08:18

Честно говоря, не представляю, в чем могла заключаться проблема, но заработал такой вариант:

Set decrModelHyperLink = Description.Create

decrModelHyperLink("name").Value = tmpModelName
decrModelHyperLink("micclass").Value = "Link"
		
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    Set hyperLinkModel = hyperLinkModelList(i)
    hyperLinkModel.WaitProperty "visible", True, (intDelaySeconds * 1000)
    CheckAvailability hyperLinkModel, "Hyperlink on model " & tmpModelName
    hyperLinkModel.Click

Next
вариант, в принципе, ничем не отличается от "первого" варианта. Точнее, сначала я использовал именно этот вариант, а потом импользовал "первый", т.к. ранее я осуществлял поиск регулярных выражений.

В общем, проблема решена, хотя я не понимаю, каким образом
  • 0

#7 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 06 декабря 2011 - 09:05

Честно говоря, не представляю, в чем могла заключаться проблема, но заработал такой вариант:

Set decrModelHyperLink = Description.Create

decrModelHyperLink("name").Value = tmpModelName
decrModelHyperLink("micclass").Value = "Link"
		
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    Set hyperLinkModel = hyperLinkModelList(i)
    hyperLinkModel.WaitProperty "visible", True, (intDelaySeconds * 1000)
    CheckAvailability hyperLinkModel, "Hyperlink on model " & tmpModelName
    hyperLinkModel.Click

Next
вариант, в принципе, ничем не отличается от "первого" варианта. Точнее, сначала я использовал именно этот вариант, а потом импользовал "первый", т.к. ранее я осуществлял поиск регулярных выражений.
В общем, проблема решена, хотя я не понимаю, каким образом

Сейчас, когда вы наши решение, внимательнее присмотрелся к Вашему коду.
Постараюсь объяснить, в чем были проблемы с каждым из первоначальных вариантов (это мои предположения, они могут оказаться неверными, потому что проверить мне не на чем)
Итак, по порядку:

Первый:

Set decrModelHyperLink = Description.Create
decrModelHyperLink("name").Value = tmpModelName
decrModelHyperLink("href").RegularExpression = False
decrModelHyperLink("micclass").Value = "Link"
decrModelHyperLink("micclass").RegularExpression = False
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    Set hyperLinkModel = hyperLinkModelList(i)
    hyperLinkModel.WaitProperty "visible", True, (intDelaySeconds * 1000)
    CheckAvailability hyperLinkModel, "Hyperlink on model " & tmpModelName
    hyperLinkModel.Click

Next
Вызывает ошибку в строке Click. Параметры гиперрссылки неопределены (т.е. GetROProperty(<smth>) выдвет Empty


Сравнивая его с решением, заметил, что значение вы задавали для свойства name, а свойство RegularExpression выставляли для href, тем самым неявно включая параметр href с пустым значением в описание ваших объектов, что и приводило в итоге к ошибке

Второй

Set decrModelHyperLink = Description.Create
decrModelHyperLink("Class Name").Value = "Link"
decrModelHyperLink("text").Value = tmpModelName
decrModelHyperLink("outertext").Value = tmpModelName
decrModelHyperLink("innertext").Value = tmpModelName
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    

Next
Не находит нужную гиперссылку вообще (хотя на странице она есть)

Здесь вы явно перестарались со свойствами, задавая сразу трем аттрибутам ссылки одинаковое значение. Скорее всего outertext не равен innertext, поэтому не находилось ни одного объекта.

Третий

Set decrModelHyperLink = Description.Create
decrModelHyperLink("text").Value = tmpModelName
Set hyperLinkModelList = pgProduct.ChildObjects(decrModelHyperLink)
For i = 0 to (hyperLinkModelList.Count() - 1)
    Set hyperLinkModel = hyperLinkModelList(i)

Next
Вызывает ошибку во вложенной строке цикла Set, хотя найденный объект -- всего один. Если верить spy, то это -- именно эта ссылка, иначе их должно быть больше.

Вероятнее всего здесь ошибка генерилась из-за того, что в при описании свойств не был указан класс объектов, которые вы ищете (свойство micclass)
  • 1

#8 Dzmitry_by

Dzmitry_by

    Новый участник

  • Members
  • Pip
  • 10 сообщений
  • ФИО:- - -

Отправлено 23 декабря 2011 - 09:04

Set objDesc = Description.Create

objDesc("micclass").Value = "Link"

objDesc("name").Value = tmpModelName



Set colLinks = pgProduct.ChildObjects(objDesc)



If colLinks.Count = 0 Then

 ExitAction("error msg")

Else

 For i =0 To (colLinks.Count-1)

  strTemp = colLinks(i).getROproperty("innertext")

  If StrComp(strTemp, strExpected, 1)=0 Then

   blnFlag = true

   colLinks(i).Click

  End If

 Next

End If



If Not blnFlag Then

 ExitAction("link not found")

End If

  • 0

#9 ch_ip

ch_ip

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

  • Members
  • PipPipPipPipPipPip
  • 1 097 сообщений
  • ФИО:Павел Абдюшев
  • Город:Москва


Отправлено 07 января 2012 - 18:48

Set objDesc = Description.Create
objDesc("micclass").Value = "Link"
objDesc("name").Value = tmpModelName

Set colLinks = pgProduct.ChildObjects(objDesc)

If colLinks.Count = 0 Then
 ExitAction("error msg")
Else
 For i =0 To (colLinks.Count-1)
  strTemp = colLinks(i).getROproperty("innertext")
  If StrComp(strTemp, strExpected, 1)=0 Then
   blnFlag = true
   colLinks(i).Click
  End If
 Next
End If

If Not blnFlag Then
 ExitAction("link not found")
End If

К чему этот код?
  • 0

#10 Dzmitry_by

Dzmitry_by

    Новый участник

  • Members
  • Pip
  • 10 сообщений
  • ФИО:- - -

Отправлено 09 января 2012 - 17:18

К чему этот код?

немного отличающийся способ работы с элементами на странице:

Set objDesc = Description.Create 'создаём объект описание того что хотим получить со страницы
objDesc("micclass").Value = "Link" 'в данном случае для веб элементов достаточно будет указать что это веб линк.
objDesc("name").Value = tmpModelName 'в принципе можно выбрать вообще все линки со страницы, но чтобы сузить диапазон можно добавить ещё какой нибудь параметр который достоверно изветсно есть у искомого линка, например, если бы у линка было свойство name - то можно было бы добавить name

Set colLinks = pgProduct.ChildObjects(objDesc) 'в данном случае в переменной pgProduct должен хранится объект в виде Browser.Page если нужно выбрть все линки со страницы, либо Browser.Page.Frame если нужно выбрать линки из фрейма на странице, либо объект вида Browser.Page.WebElement если нужно получить линки от какого-то родительского элемента. ChildObjects метод возвращает не массив, а объект коллекцию. Это особенность vbs как и ещё некоторых объектных языков, заключающаяся в том, что массив и коллекция - это разные вещи, и обращатся с ними нужно по-разному.

If colLinks.Count = 0 Then 'проверяем сколько объектов содержится в полученной коллекции. Могут быть следующие варианты: 0 объектов если на странице ничего не найдено. В данном случае можно прорепортать ошибку - собственно репортание ошибки символизирует ExitAction("error msg"), если например у вас свой кастомный репортер, для которого вы самостоятельно собираете сообщения об ошибках.
ExitAction("error msg")
Else
' если-же нет, то на странице нашлось объектов больше 0, как я писал выше, это будут объекты типа Link.
For i =0 To (colLinks.Count-1) 'перебираем эти объекты, чтобы найти линку с заранее известным текстом. В данном случае последовательно получаем все объекты коллекции
strTemp = colLinks(i).getROproperty("innertext") ' у каждого i-того элемента считываем значение свойства innertext - это тот текст который заключен между тегами <a></a>
If StrComp(strTemp, strExpected, 1)=0 Then ' и сравниваем с искомым значением strExpected - обратите внимание что при именовании переменных нужно придеживатся конвенции наименований - например для всех строковых переменных использовать префикс str, StrComp - встроенная функция vbs для сравнения строк, о её работе можно почитать в мануале.
blnFlag = true ' специальный флаг, булевая переменная, в случае если StrComp(strTemp, strExpected, 1)=0 это значит что совпало strTemp и strExpected 1 - был использован регистронезависимый способ сравнения,
colLinks(i).Click ' кликаем на найденную ссылку.
End If
Next
End If


If Not blnFlag Then ' здесь проверяем состояние переменной blnFlag, если она имеет значение true, то ссылка на странице с нужным текстом была найдена и кликнута.
ExitAction("link not found") ' если же нет - то можно (как уже писал выше) - для кастомного репортера генерируем сообщение об ошибке.
End If

Есть и другие способы найти ссылку и кликнуть по ней, например
Browser("title:=Access Denied").Page("title:=Access Denied").Link("innertext:=Access Denied").Click
но перед тем как вызвать у такого объекта метод Click нужно проверить его присутсвие на странице -
If Browser("title:=Access Denied").Page("title:=Access Denied").Link("innertext:=Access Denied").Exist Then
Browser("title:=Access Denied").Page("title:=Access Denied").Link("innertext:=Access Denied").Click

чтобы не писать таких длинных выражений можно текущий объект сохранять в переменную
Set objCurrent = Browser("title:=Access Denied").Page("title:=Access Denied")
If objCurrent.Exist(5) Then 'wait 5 sec
'do somthing

hyperLinkModel.WaitProperty "visible", True, (intDelaySeconds * 1000)
- я не доверяю QTP шному свойству visible, из того с чем приходилось встречатся очень не стабильно работает.
Я бы предлоижл проверять существование объекта .Exist(intTimeOut)
и проверять его свойство "height" (у видиомого объекта должно быть не нулевое значение).
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных