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

Фотография

Помогите различить объекты


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

#21 AuRum

AuRum

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

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Andrey Simonov
  • Город:Россия, Москва

Отправлено 16 января 2007 - 17:16

Да, кстати я не понял, почему Вы не используете Object Repository? Никто не мешает использовать одновременно описания из object repository и описания по свойствам. Главное, чтобы у объектов, определённых по набору свойств не было дочерних объектов, определяемых из объектного репозитория.


С Object Repository работать не получается по следующим причинам:

1) сами эти таблички при записи с помощью Record нажатия на кнопку в него не добавлются
2) если добавлять вручную, то

а) название таблички будет такое же, как и innerText, причем обрезанное, т.е. "User Role: ADMINISTRATORFirst" - неуникальное :((
б) табличка добавится без дочерних объектов

(см. скриншоты)

Определять таблицу по innertext - дело последнее, кстати сказать - innertext - это то что меняется в первую очередь. Да и распознование таблиц по нему зачастую подглючивает. Рекоммендую либо по индексу (правда, его прийдётся подбирать методом тыка), либо по каким-нибудь осмысленным свойствам типа className, html id, и т.п. Для этого попросите девелоперов эти свойства добавить.


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

Уверен, что работать должно было при использовании любого, из предложеных Вам способов. Советую, всё-таки их всех попробовать - приобретёте много полезных навыков, и, возможно, всё-таки начнёте понимать, как работает QTP.


Да было бы интересно проработать другие, но тут время поджимает. С QTP очень недавно, было всего лишь обучение 7 дней :help: и вот первое боевое задание - этот проект :) Так что я думаю есть шанс понять, как он работает, в будущем.

Прикрепленные файлы

  • Прикрепленный файл  16_01_0.GIF   13,99К   31 Количество загрузок:
  • Прикрепленный файл  16_01_1.GIF   23,73К   29 Количество загрузок:
  • Прикрепленный файл  16_01_2.GIF   28,14К   29 Количество загрузок:

  • 0

#22 Mike

Mike

    Консультант

  • Members
  • PipPipPipPipPipPip
  • 1 079 сообщений
  • Город:Москва

Отправлено 16 января 2007 - 20:49

Прочитайте в Help, и у меня в QTP FAQ про Object Identification Settings. А также прочтите Help по добавлению объектов в объектный репозиторий и по работе с объектным репозиторием. Давайте разберёмся с таблицами. По порядку.


1) сами эти таблички при записи с помощью Record нажатия на кнопку в него не добавлются

Всё правильно. Добавлять надо вручную

2) если добавлять вручную, то

а) название таблички будет такое такое же, как и innerText, причем обрезанное, т.е. "User Role: ADMINISTRATORFirst" - неуникальное :((

При чём тут название? Название поменять можно. Важно - по каким свойствам QTP распознаёт таблицу. У Вас в Object Identification Settings прописано распозновать по тeгу. Фактически (так как у всех таблиц теги одинаковые - TABLE) QTP у Вас настроен распознавать таблицы по псевдо-свойству Index - то есть - по порядку появления в HTML документе (среди таблиц с одинаковыми значениями остальных свойств, то есть - свойства html tag в данном случае). Чтобы это изменяиь - надо изменить Object Identification Settings. В вашем случае, надо распознавать таблицы по свойству name, и, возможно, html id (его на скриншоте не видно). Таблицы с одинаковыми значениями свойтсва name будут рапознаваться ещё и по индексу - 1, 2, ... А название таблицы в объектном репозитории Вы просто напросто поменяете, если оно Вам не нравится.

б) табличка добавится без дочерних объектов


Правильно. Дочерние объекты будете распознавать по свойствам, без объектного репозитория. Как-нибудь так:

Browser("Development - Login Page").Page("Development - User Management Page").WebTable("Table1").WebButton("name:=Delete User").Click()

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


Возможно, их и нет. Но всегда можно использовать свойство Index. Надо только правильно настроить Object Identification Settings, и только после этого добавить объект в репозиторий.
  • 0
Best regards,
Майк.

#23 Mike

Mike

    Консультант

  • Members
  • PipPipPipPipPipPip
  • 1 079 сообщений
  • Город:Москва

Отправлено 16 января 2007 - 20:52

А вообще, в данном случае решение с ChildItem, которое Вы использовали - самое правильное. Другое дело, что непонятно, зачем Вы ВСЕ объекты распознаёте прямым указанием свойств, а не через Object Repository. В этом здесь нет никакой необходимости (если правильно настроить распознавание - Object Identification Settings)
  • 0
Best regards,
Майк.

#24 AuRum

AuRum

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

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Andrey Simonov
  • Город:Россия, Москва

Отправлено 17 января 2007 - 07:55

Добрый день, Михаил!

Прочитайте в Help, и у меня в QTP FAQ про Object Identification Settings. А также прочтите Help по добавлению объектов в объектный репозиторий и по работе с объектным репозиторием.

Ну это как-то обидно :) Конечно я читал и help и faq. Я бы не обратился на форум, не прочитав их. А из предыдущих постов следует, что я не читал?

Название поменять можно.

Теперь ясно.

В вашем случае, надо распознавать таблицы по свойству name, и, возможно, html id (его на скриншоте не видно). Таблицы с одинаковыми значениями свойтсва name будут рапознаваться ещё и по индексу - 1, 2, ...

Свойство name = Edit User, неуникальное. Html id - вообще пустое на Object Spy.

Но всегда можно использовать свойство Index.

Как я его могу использовать, если объект появляется во время прогона теста, неизвестно на какой из страниц и неизвестно на каком из 5 мест?

Еще несовсем понятно, чем лучше распознавание моей конкретной страницы из репозитория, чем распознавание по свойствам. На ней же есть кнопочки [1], [2], ... - т.е. номера страниц с юзерами. Вполне может быть что в репозитории у таких страничек будут разные свойства, а name, которое можно указать явно, - одно.
  • 0

#25 Mike

Mike

    Консультант

  • Members
  • PipPipPipPipPipPip
  • 1 079 сообщений
  • Город:Москва

Отправлено 17 января 2007 - 08:51

Еще несовсем понятно, чем лучше распознавание моей конкретной страницы из репозитория, чем распознавание по свойствам. На ней же есть кнопочки [1], [2], ... - т.е. номера страниц с юзерами. Вполне может быть что в репозитории у таких страничек будут разные свойства, а name, которое можно указать явно, - одно.


Какие свойства будут в репозитории - зависит от Вас. Во-первых это настраивается в Object Identification Settings, во вторых - это можно поменять в самом Object Repository. В данном же случае, уверен, если всё правильно настроена, объект в OR должен быть один.

Свойство name = Edit User, неуникальное. Html id - вообще пустое на Object Spy.


Ну так я и говорю, остальное - по свойству index, либо location. Изменить свойства распознавания для таблиц в Object Identification Settings имеет смысл в любом случае.

Как я его могу использовать, если объект появляется во время прогона теста, неизвестно на какой из страниц и неизвестно на каком из 5 мест?


Изменить свойство распознавания в объектном репозитории в Run-time можно двумя способами - вызовом метода .SetTOProperty, либо параметризацией значения свойства в объектном репозитории. Впрочем, проще, конечно, распознавать по свойствам, без использования OR.

А найти нужную таблицу можно по тому-же тексту, только не тексту всей таблицы, а тексту отдельных ячеек. То есть, в цикле проходитесь по всем таблицам с name:=Edit User и разными значениями index, и ищете среди них таблицу с нужными значниями в определённых ячейках. Текст ячейки можно получить методом GetCellData..., а лучше - получить таблицу сразу в виде массива (используя одну из моих функций - она есть в FAQ), и работать с этим массивом...

На Вашем месте, я бы написал специальную функцию для поиска нужной таблицы, в которой в качестве параметров использовал бы User Role, E-mail, User Name, и т.д., причём так, чтобы можно было указывать только некоторые поля.

Другое дело, что в данном случае это стрельба из пушки по воробьям... Ваше решение с распознаванием по innertext, пусть и некрасивое, но самое простое. До тех пор, пока не прийдётся работать с 20-ю разными таблицами вместо одной...
  • 0
Best regards,
Майк.

#26 AuRum

AuRum

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

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Andrey Simonov
  • Город:Россия, Москва

Отправлено 17 января 2007 - 11:30

Спасибо большое за ответы!
  • 0

#27 Snayp

Snayp

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

  • Members
  • Pip
  • 7 сообщений

Отправлено 19 января 2007 - 15:24

Новая проблема :ok: . Теперь не получается распознать ссылку. Ссылка находится в отдельной таблице, имя которой зависит от имен других таблиц, которые могут менятся. Единственное уникальное свойство, которое есть это ID, но не получается его получить GetROProperty, потому как существует несколько ссылок с одинаковыми именами на этой странице (колличество которых не известно), так же не получается присвоить SetTOProperty по той же причине.
Я пытался создать цикл, который бы считал эти ссылки, чтобы затем им присвоить уникальные индексы. Однако, при указании свойств этих ссылок из репозитория ничего не получается QTP их не видит
dim a
a=0
if Browser("Admin Console").Page("Admin - Configuratio_2").Link("name:=Delete").exist then
a=a+1
else
msgbox "blabla"
end if
все время выходит blabla. Настраивал по разному Object Indification, указывал все возможные свойства, но без результатно, все равно не видит.
Осталась последняя мысль создать динамический массив, в который по очереди записать все эти ссылки и потом достать последнюю, нужную, при прогоне теста она записывается в конец этого списка.
Посоветуйте как можно решить эту проблему.
Заранее спасибо.
С уважением Дмитрий.
  • 0

#28 Mike

Mike

    Консультант

  • Members
  • PipPipPipPipPipPip
  • 1 079 сообщений
  • Город:Москва

Отправлено 19 января 2007 - 15:31

Дмитрий, что-то Вы не так понимаете.
Цикл должен выглядить примерно так:

i=0
do while Browser("Admin Console").Page("Admin - Configuratio_2").Link("name:=Delete","index:="&cstr(i)).exist
    if <дальше следует успловие, по которому Вы определяете, что это та ссылка, которая Вам нужна; если не знаете как его описать - спросите, описав на словах условие> then exit do
loop 

set targetLink = Browser("Admin Console").Page("Admin - Configuratio_2").Link("name:=Delete","index:="&cstr(i))

targetLink.Click()

  • 0
Best regards,
Майк.

#29 Mike

Mike

    Консультант

  • Members
  • PipPipPipPipPipPip
  • 1 079 сообщений
  • Город:Москва

Отправлено 19 января 2007 - 15:32

Ошибку допустил... Перед тем, как кликать, надо проверить, что ссылка существует. Если ссылок на странице вообще нет, то i=0
  • 0
Best regards,
Майк.

#30 Snayp

Snayp

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

  • Members
  • Pip
  • 7 сообщений

Отправлено 19 января 2007 - 15:39

Вроде не совсем понятно я изяснился, вот для этого скриншот.

Прикрепленные файлы


  • 0

#31 Snayp

Snayp

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

  • Members
  • Pip
  • 7 сообщений

Отправлено 19 января 2007 - 15:40

Ссылка существует в любом случае, она создается во время прогона теста.
  • 0

#32 Mike

Mike

    Консультант

  • Members
  • PipPipPipPipPipPip
  • 1 079 сообщений
  • Город:Москва

Отправлено 19 января 2007 - 15:56

Спасибо за снэпшот. Тогда немного по-другому (но принцип не меняеется):

branchElementsName=<свойство name вёб-элемента ячейки колонки branches>
textToSearch="kuyrtrwthdgs"

i=0
do while Browser("Admin Console").Page("Admin - Configuratio_2").WebElement("name:="&branchElementsName,"index:="&cstr(i)).exist
   if  Browser("Admin Console").Page("Admin - Configuratio_2").WebElement("name:="&branchElementsName,"index:="&cstr(i).GetROProperty("innertext")=textToSearch then exit do
loop 

set targetLink = Browser("Admin Console").Page("Admin - Configuratio_2").Link("name:=Delete","index:="&cstr(i))

targetLink.Click()

То есть цикл не по ссылкам, а по ячейкам первой колонки.
  • 0
Best regards,
Майк.

#33 AuRum

AuRum

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

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Andrey Simonov
  • Город:Россия, Москва

Отправлено 24 января 2007 - 15:18

Михаил, мы так и не смогли одолеть этот цикл.

Проблемы такие:

1. branchElementsName=<свойство name вёб-элемента ячейки колонки branches>

у этого WebElement'a нет свойства name

2. Если я правильно понял, суть цикла такова: мы пробегаемся по названиям в первой колонке, когда находим нужное нам, выходим из цикла, а затем нажимаем на линку с уже сохраненным index.

Вопрос 1: почему нигде нет i=i+1 ?
Вопрос 2: все-таки опять спрошу, как же мы можем определять объект по индексу, когда он сам появляется только во время прогона теста (индекс ему соответственно не присваивается)?

Пробовали кучу вариантов, и конечно i=i+1 вставляли, то он уходит в бесконечный цикл, то просто не видит линк. Путем многочисленных проверок вроде бы выяснили, что проблема именно в индексе.

Что делать?
  • 0

#34 Mike

Mike

    Консультант

  • Members
  • PipPipPipPipPipPip
  • 1 079 сообщений
  • Город:Москва

Отправлено 24 января 2007 - 15:49

1) Если свойства Name (или любого другого, по которому можно отличить все элементы колонки Branch Name от всех остальных) нет, то мой способ работать не будет. Есть и другие способы найти номер нужного ряда. Например, используя метод GetCellData в цикле.

2) Поняли правильно
2.1) i=i+1 нет, потому что я ошибся. Извиняюсь
2.2) индекс присваивается в момент распознавания объекта. То есть, во время распознавания QTP проходится по всем объектам, подпадающим под определение - то есть, со совпадающими значениями всех свойств кроме свойства index, и выбирает из них объект номер index. Вы явно что-то неправильно понимаете, но что именно не понимаю уже я :dirol:

Я же не имел в виду использовать буквально мой код... Откуда ж мне знать, какие у Вас там свойства у объектов... Код был приведён чтобы продемонстрировать идею. Сама идея (с циклом и изменяющимся свойством index) работает - проверялось неоднократно.
  • 0
Best regards,
Майк.

#35 AuRum

AuRum

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

  • Members
  • Pip
  • 25 сообщений
  • ФИО:Andrey Simonov
  • Город:Россия, Москва

Отправлено 25 января 2007 - 12:43

Все понятно c index, спасибо. Теперь пытаюсь сделать с GetCellData, как Вы советовали в начала предыдущего поста, так как на самом деле никакого уникального свойства у WebElement'ов этого столбца нет.

Возникли 2 пролемы:

1. У вас не было такого, что QTP вдруг перестает видеть объекты? Т.е. я записываю кликами скрипт, он нормально проигрывается, затем отступаю пару строчек от конца скрипта вниз, пишу для любой кнопки/картинки вместо .Click

msgbox Browser("Development - you have").Page("Development - you have").Image("Edit detail").Exist

запускаю через CTRL+F5, возвращается False. А иногда все ок. Соответственно функция в репозитории "Highlight in Application" тоже не пашет.

2. Не могу обратиться к табличке! Скриншот я приделал, там почти все как у Димы (Snayp) - мы вообще рядом сидим тут и делаем 1 таску, просто разные части приложения.

Так вот что я ни пробовал, Exist все время выдает False. В предыдущий раз прокатило по InnerText к табличке обращаться и использовать ChildItem, но здесь InnerText одинаковый.

Прикрепленные файлы

  • Прикрепленный файл  screen.jpg   35,92К   21 Количество загрузок:

  • 0

#36 Mike

Mike

    Консультант

  • Members
  • PipPipPipPipPipPip
  • 1 079 сообщений
  • Город:Москва

Отправлено 25 января 2007 - 12:52

1) Нет, не было. Было такое, что не распознаются вообще все объекты. Лечится закрытием всех браузеров и рестартом QTP. То что происходит у Вас скорее указывает либо на то, что объект не уникален, либо что у него меняются свойства (по которым его распознавали). Других вариантов нет.

2) Что значит не можете? Не знаете, по каким свойствам распознавать? Я тоже. Снэпшот тут не поможет - нужен source code или "живая" вёб-страница.
  • 0
Best regards,
Майк.


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

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