Как найти объект, если известно значение свойства, но неизвестно назва
#1
Отправлено 16 апреля 2011 - 13:13
А вот что делать, если имеется объект, название свойства которого тебе неизвестно, но известно значение этого свойства?
Скажем, есть кнопка с надписью "Справочники" и мне нужно на неё кликнуть. FinderTool может максимум отыскать панель, на которой лежит эта кнопка, но не саму кнопку. А название свойства кнопки, которое имеет значение "Справочники" мне неизвестно, соответственно функциями "Find" для поиска этой кнопки я также воспользоваться не могу.
Как решаются такого рода задачи?
#2
Отправлено 16 апреля 2011 - 16:01
Имеется функция Find (и её производные), которые позволяют по паре "Свойство - Значение" отыскать нужный объект.
А вот что делать, если имеется объект, название свойства которого тебе неизвестно, но известно значение этого свойства?
Скажем, есть кнопка с надписью "Справочники" и мне нужно на неё кликнуть. FinderTool может максимум отыскать панель, на которой лежит эта кнопка, но не саму кнопку. А название свойства кнопки, которое имеет значение "Справочники" мне неизвестно, соответственно функциями "Find" для поиска этой кнопки я также воспользоваться не могу.
Как решаются такого рода задачи?
Ну для разных типов приложений, для разных объектов по разному..
Гдето можно воспользоваться методом ClickItem() (Например, panel.ClickItem(1) - кликает по второму элементу панели)
Гдето можно воспользоваться методом Click(x,y) , где x,y - координаты кнопки внутри панели (например в Java-приложении для объекта SWTObject("CTabFolder", "") чтобы перейти на 3-ю вкладку я использовал именно этот метод,а координаты находил так - x = tab.items.Item(2).x , y = tab.items.Items(2).y )
#3
Отправлено 16 апреля 2011 - 17:40
Имеется функция Find (и её производные), которые позволяют по паре "Свойство - Значение" отыскать нужный объект.
А вот что делать, если имеется объект, название свойства которого тебе неизвестно, но известно значение этого свойства?
Скажем, есть кнопка с надписью "Справочники" и мне нужно на неё кликнуть. FinderTool может максимум отыскать панель, на которой лежит эта кнопка, но не саму кнопку. А название свойства кнопки, которое имеет значение "Справочники" мне неизвестно, соответственно функциями "Find" для поиска этой кнопки я также воспользоваться не могу.
Как решаются такого рода задачи?
Для начала нужно узнать на каком языке написано приложение
Если компонент не распознает тесткомплит, то можно попробывать другие тулы...
И посмотреть нужное свойство.
#4
Отправлено 16 апреля 2011 - 21:36
XXX верное говорит. Как правило, внутри панелей приходится работать с кнопками через их индексы, а совсем в тяжелых случаях через координаты.Имеется функция Find (и её производные), которые позволяют по паре "Свойство - Значение" отыскать нужный объект.
А вот что делать, если имеется объект, название свойства которого тебе неизвестно, но известно значение этого свойства?
Скажем, есть кнопка с надписью "Справочники" и мне нужно на неё кликнуть. FinderTool может максимум отыскать панель, на которой лежит эта кнопка, но не саму кнопку. А название свойства кнопки, которое имеет значение "Справочники" мне неизвестно, соответственно функциями "Find" для поиска этой кнопки я также воспользоваться не могу.
Как решаются такого рода задачи?
Но есть еще один простой способ - это найти обходной путь :)
Обязательно ли кликать на кнопку? Обычно команды на панели инструментов дублируют соответствующие операции из основного мню. TC хорошо справляется как с обычным, так и с контекстным меню.
Если у вас Delphi-приложение, то попробуйте откомпилировать его с дебажной информацией, как описано в документации к TC. В этом случае вероятность успешной работы с нопками внутри панели будет больше. Если же это стороннее приложение(например, Диасофт 5NT), то в этом случае откомпилировать его не получится и придется идти обходными путями.
Приложение, видимо, на Delphi. И в этом случае, TC - один из лучших вариантов в плане его автоматизации, а если это сторонее приложение, то "один из" превращается в "самый".Для начала нужно узнать на каком языке написано приложение
Если компонент не распознает тесткомплит, то можно попробывать другие тулы...
И посмотреть нужное свойство.
Нужное свойство - это свойство кнопки внутри панели. Очень мала вероятность, что к нему удастся получить доступ.
SQL для тестировщиков
Тренинги по HP QTP и автоматизации тестирования
Если минарет, значит выше всех (с)
#5
Отправлено 17 апреля 2011 - 20:30
Ну для разных типов приложений, для разных объектов по разному..
Гдето можно воспользоваться методом ClickItem() (Например, panel.ClickItem(1) - кликает по второму элементу панели)
Гдето можно воспользоваться методом Click(x,y) , где x,y - координаты кнопки внутри панели (например в Java-приложении для объекта SWTObject("CTabFolder", "") чтобы перейти на 3-ю вкладку я использовал именно этот метод,а координаты находил так - x = tab.items.Item(2).x , y = tab.items.Items(2).y )
Это не подходит, хотелось бы не наобум тыкаться в свойства надеясь найти эту кнопку, а быстро получить доступ к нужному элементу, не тратя времени на поиск. Я использую объектную модель Tree, в обекте SideBar (панель, где находится кнопка) кнопка закопана глубоко через ещё каких-то несколько посреднических объектов (их там десятки, и у них ещё дочек десятки, а у них, в свою очередь - внучек). Вручную искать её перебирая все свойства подряд, уходя в глубь по этим объектам, чтобы встретить что-то похожее на "Item" - дело неблагодарное, на это уходит достаточно времени. Например, я потратил порядка часа, чтобы вручную найти кнопку и кликнуть по ней путь к ней получился такой:
ICClient.pnlContainer.pnlMain.pnlBody.FrmDataImporterSettings.TdxDockControl.TdxBarControl.ItemLinks.AvailableItems(0).Click();
Именно поэтому я и задал этот вопрос - как можно отыскать функцию по известному значению свойства, например, тексту на кнопке.
Сейчас я таким макаром не могу найти другую кнопку на другой панели, т.к. она немного другая. А ведь есть ещё куча других управляющих элементов. На каждый убить по часу? Нет, спасибо :) Интересует именно как такие задачи решаются профессионалами, т.е. алгоритм, подходящий для любых ситуаций любой закопанности элемента управления на сколько угодно уровней и любого названия свойства текста, а не поиск вручную "наобум".
Ещё хуже, если у кнопки даже текста нет (и хинт забыли поставить). Как тогда её вообще найти? Ума не приложу.. Ведь теперь в этом разветвлённом дереве уже не поймёшь какой из этих объектов вообще кнопка... Есть ли универсальные рекомендации?
Для начала нужно узнать на каком языке написано приложение
Если компонент не распознает тесткомплит, то можно попробывать другие тулы...
И посмотреть нужное свойство.
Приложение написано на Delphi. Какие тулзы можно попробовать?
Если у вас Delphi-приложение, то попробуйте откомпилировать его с дебажной информацией, как описано в документации к TC. В этом случае вероятность успешной работы с нопками внутри панели будет больше.
Оно откомпилировано с дебажной информацией, которая извлечена в TDS-файлы и TestComplete их использует, открывая доступ к свойствам и методам панели
#6
Отправлено 18 апреля 2011 - 06:58
И никакого наобум там тоже ничего нет, все логично и понятно)
Прям универсального метода на все случаи жизни нет
Как программисты закопали кнопку..так и придется ее доставать
У меня например вообще была ситуация - панель с кнопками была полностью рисованная..то есть ни к какой кнопке никак не было возможности подкопаться
точно!приходилось пользоваться методом Click(x,y) ..но программисты выдали мне все размеры в пикселях каждой кнопки и всяких там расстояний, т.е. кликнуть по тому чему надо все таки удалось)
#7
Отправлено 18 апреля 2011 - 18:20
Ну кто ж знал что у вас там так все устроено и вам не подходит этот метод. Нужно было в самом начале поконкретнее описывать проблему
И никакого наобум там тоже ничего нет, все логично и понятно)
Прям универсального метода на все случаи жизни нет
Как программисты закопали кнопку..так и придется ее доставать
Иными словами, метода достать кнопку автоматически по значению кнопки не существует, если я правильно интерпретировал этот Ваш абзац :) Ладно, придётся, видимо, копаться, если ещё кто чего не подскажет по дополнительным способам по решению такого рода задач) Все равно всем спасибо.
Не хотелось бы конечно использовать OCR и средства работы с картинками, только лишь как крайний вариант последнего шанса)
#8
Отправлено 19 апреля 2011 - 08:05
Ну кто ж знал что у вас там так все устроено и вам не подходит этот метод. Нужно было в самом начале поконкретнее описывать проблему
И никакого наобум там тоже ничего нет, все логично и понятно)
Прям универсального метода на все случаи жизни нет
Как программисты закопали кнопку..так и придется ее доставать
Иными словами, метода достать кнопку автоматически по значению кнопки не существует, если я правильно интерпретировал этот Ваш абзац :) Ладно, придётся, видимо, копаться, если ещё кто чего не подскажет по дополнительным способам по решению такого рода задач) Все равно всем спасибо.
Не хотелось бы конечно использовать OCR и средства работы с картинками, только лишь как крайний вариант последнего шанса)
Если на кнопке есть надпись, то можно ее идентифицировать с помощью TextObject()
Зайдите в свойства проекта (правой кнопкой на проекте Edit|Properties) . Перейдите в меню Open Applications|Text Recognition
Нажмите Add и введите значение свойства WndClass вашей панели. Поставте галочку и сохраните.
Теперь все текстовые элементы вашей панели должны быть доступны
Если чтото не так то почитайте про TextObject()
Надеюсь поможет
Мне не помогло, потому что все кнопки панелей задач не содержат названий, одни картинки
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных