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

Фотография

Работа со всплывающими окнами WPF приложений.


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

#1 ikolesoo

ikolesoo

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

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Илья

Отправлено 08 июня 2015 - 14:21

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

Среда: TC10.6, C# Script, приложение на Visual C#

Возникла проблема при распознавании всплывающих окон (напр. окно появляющееся при нажатии на стрелку выбора размера шрифта в ворде), в дереве процесса их не видно, т.к. они не активны, при попытке найти объект через Object Spy привязка происходит к какому-то абстрактному объекту, который потом недоступен. Если не привязывать объекты до процесса записи теста, то ТС корректно привязывает первые несколько окон, но на 4 или 5 начинает путаться между привязанными окнами, в итоге при запуске теста ТС либо не находит окно, либо выбирает не тот пункт меню. Есть подозрение, что ТС пока не умеет корректно работать со всплывающими окнами.


  • 0

#2 ksena

ksena

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

  • Members
  • PipPip
  • 99 сообщений
  • Город:Харьков


Отправлено 13 июля 2015 - 10:56

Да, он плохо работает с виндосовскими приложениями(и не только он). Чтобы это обойти можно либо пользоваться комбинациями клавиш, либо спец тулом, например AutoIt.


  • 0

#3 alk2alk

alk2alk

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

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

Отправлено 14 июля 2015 - 12:51

Да, он плохо работает с виндосовскими приложениями [...]

На самом деле, это не так и TestComplete прекрасно работает с приложениями Windows. Тут проблема именно с тем, как разработчики используют WPF и как WPF генерирует UI интерфейс. (Из практического опыта - трех- или четырех-летней давности проект на версии TestComplete того времени прекрасно работал именно с WPF приложением.)

Подход - стандартный: нельзя использовать и полагаться на автоматический NameMapping, а создавать его вручную, активно рассматривая при этом такие его (NameMapping-га) возможности как Required Children и Conditional Mapping.

В случае "ручного" поиска (.FindChild() и иже с ним) - скорее всего тоже потребуется многошаговый подход (нашли, например, все панели внутри данного окна, потом посмотрели, какая из найденных - видима, потом внутри нее нашли таблицу (grid) с которой потом и работаем).

Очень рекомендую поизучать структуру приложения в Object Browser и посмотреть, что и как меняется при открытии того или иного элемента тестируемого приложения и как вновь открытый (или переоткрытый) элемент может быть уникально идентифицирован.

Наилучший случай - это когда разработчики сразу дают требуемым элементам уникальные идентификаторы, но, т.к. это требует дополнительной работы и часто не вписывается в их концепции разработки следующие тем или иным шаблонам, идут на такие шаги они далеко не всегда. (А вы за это платите сложностью написания тестов, нестабильностью их работы и производительностью тестового кода.)


  • 1

--
Regards,
    Alex

    [Community Expert Group]
____

[Community Expert Group] members are not employed by SmartBear Software but
are just volunteers who have some experience with the tools by SmartBear Software
and a desire to help others. Postings made by [Community Expert Group] members
may differ from the official policies of SmartBear Software and should be treated
as the own private opinion of their authors and under no circumstances as an
official answer from SmartBear Software.
[Community Expert Group] signature is used with permission by SmartBear Software.
http://smartbear.com...munity-experts/
================================


#4 ksena

ksena

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

  • Members
  • PipPip
  • 99 сообщений
  • Город:Харьков


Отправлено 15 июля 2015 - 15:39

Наилучший случай - это когда разработчики сразу дают требуемым элементам уникальные идентификаторы

 

Предлагаете попросить разработчиков Word проидентифицировать элементы поудобнее?! Ну-ну, давайте попросим, посмотрим что с этого получится )) А еще чтобы они его компилировали особым образом, дабы ТС видел все свойства объектов :)


  • 0

#5 modbear

modbear

    Специалист

  • Members
  • PipPipPipPipPip
  • 548 сообщений

Отправлено 15 июля 2015 - 16:11

 

Наилучший случай - это когда разработчики сразу дают требуемым элементам уникальные идентификаторы

Предлагаете попросить разработчиков Word проидентифицировать элементы поудобнее?! Ну-ну, давайте попросим, посмотрим что с этого получится )) А еще чтобы они его компилировали особым образом, дабы ТС видел все свойства объектов :)

 

 

А какие именно проблемы с Word, если не секрет? Если имеется ввиду риббон, то достаточно в TestComplete распознавание с помощью MSAA. А с самими документами удобнее работать по COM (через объект Word.Automation).


  • 0

#6 ksena

ksena

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

  • Members
  • PipPip
  • 99 сообщений
  • Город:Харьков


Отправлено 15 июля 2015 - 16:21

 

 

 

А какие именно проблемы с Word, если не секрет? Если имеется ввиду риббон, то достаточно в TestComplete распознавание с помощью MSAA. А с самими документами удобнее работать по COM (через объект Word.Automation).

 

Автор писал 

 

..напр. окно появляющееся при нажатии на стрелку выбора размера шрифта в ворде...

Любое стороннее, неоткомпилированное приложение вызывает подобные трудности. 

 

 

 

 

 

А какие именно проблемы с Word, если не секрет? Если имеется ввиду риббон, то достаточно в TestComplete распознавание с помощью MSAA. А с самими документами удобнее работать по COM (через объект Word.Automation).

 

С какой версии это работает, если не секрет?


  • 0

#7 modbear

modbear

    Специалист

  • Members
  • PipPipPipPipPip
  • 548 сообщений

Отправлено 15 июля 2015 - 17:34

..напр. окно появляющееся при нажатии на стрелку выбора размера шрифта в ворде...

Джедайский способ изменить размер шрифта для выделенного текста:
Sys.OleObject("Word.Application").Selection.Font.Size = 10;
Или если обязательно надо через GUI:
function Test1()
{
  var word = Sys.Process("WINWORD");
  var doc = word.Form("* - Microsoft Word");
  var ribbon = doc.Panel("MsoDockTop").ToolBar("Ribbon");

  var btn = ribbon.Window("MsoWorkPane", "Ribbon", 1).Window("NUIPane", "", 1).PropertyPage("Ribbon").Pane("Lower Ribbon").Client(0).PropertyPage("Home").ToolBar("Font").ComboBox("Font Size:").Button("Open");
  btn.Click();

  var fontList = word.Window("Net UI Tool Window").Panel("Font Size:").List("Font Size:");
  fontList.Client(0).ListItem("10").Click();
}
Прикрепленный файл  msaa-settings.png   13,57К   0 Количество загрузок: Прикрепленный файл  word-toolbars.png   18,16К   0 Количество загрузок: Прикрепленный файл  word-font-combo.png   28,86К   0 Количество загрузок:
 

Любое стороннее, неоткомпилированное приложение вызывает подобные трудности.

Смотря что за приложение. .NET и Java, например, компилить не надо - там все внутренности сразу видны. C++/Delphi - уже сложнее. Но для таких случаев как раз есть MSAA, Text Recognition, в крайнем случае поиск на основе картинок. 
 

С какой версии это работает, если не секрет?

MSAA? Всегда было, насколько я помню.
  • 1

#8 ikolesoo

ikolesoo

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

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Илья

Отправлено 16 июля 2015 - 05:41

Все, в целом, уперлось в отсутствие статичных идентификаторов у объектов. В тех же элементах списков любое изменение их иерархии приводило к несовпадению сбою в привязке, т.к. объект был привязан к номеру ячейке в списке, а при изменении иерархии в списке номера ячеек не менялись, менялось их содержимое (текст). Если вместо номера ячейки пытаться привязаться к тексту в ячейке, то ТС уже не мог найти эту ячейку. Та же проблема была с выпадающим списком, т.к. как он формируется не совсем понятно и ТС видел разные списки как один и тот же. С таблицами та же проблема - количество ячеек формировалось исходя из того, что видно на экране в данный момент, и ячейка с номером 1 - это всегда верхняя ячейка.

Соответственно, как я понял, чтобы ТС корректно работал с приложением, необходимо иметь предельно четкое и статичное дерево объектов. 


  • 0

#9 alk2alk

alk2alk

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

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

Отправлено 16 июля 2015 - 08:26

Все, в целом, уперлось в отсутствие статичных идентификаторов у объектов. В тех же элементах списков любое изменение их иерархии приводило к несовпадению сбою в привязке, т.к. объект был привязан к номеру ячейке в списке, а при изменении иерархии в списке номера ячеек не менялись, менялось их содержимое (текст). Если вместо номера ячейки пытаться привязаться к тексту в ячейке, то ТС уже не мог найти эту ячейку. Та же проблема была с выпадающим списком, т.к. как он формируется не совсем понятно и ТС видел разные списки как один и тот же. С таблицами та же проблема - количество ячеек формировалось исходя из того, что видно на экране в данный момент, и ячейка с номером 1 - это всегда верхняя ячейка.

Соответственно, как я понял, чтобы ТС корректно работал с приложением, необходимо иметь предельно четкое и статичное дерево объектов. 

Судя по всему - вы оказались "жертвой" одной из методологий разработки, когда объект генерируется "на лету" динамически, никак уникально не идентифицируется (только некий идентификатор, уникальный для данной сессии существования объекта данного типа) и с внешним миром общается путем отправки сообщений, которые обрабатываются кем-то, кто вполне может не иметь ни малейшего представления от кого он получил сообщение и кому он отвечает.

Возможно, что это и удобно при разработке, но при тестировании это вызывает отмеченные существенные проблемы идентификации целевого объекта тестирования. И это - не проблема TestComplete, а общая проблема, которая будет при использовании любого инструмента тестирования. Что можно сделать, например, если веб-страница постоянно перегенерирует таблицу? Как найти ее требуемую ячейку, если у нее нет определенного и уникального идентификатора? Только либо по известному значению данных в ней, либо по известному ее положению относительно иных стабильных объектов (например, вторая ячейка вниз и на столбец правее от ячейки, в которой находится кнопка "Сохранить").

 

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

 

P.S. По хорошему - такая ситуация должна быть доведена до руководства и осознаваться им. По сути, вы являетесь разработчиком, которому для работы предоставлена среда (тестируемое приложение), которая не предоставляет достаточно информации о своем состоянии. Наверное, аналогичный пример, это если-бы при сохранении файла ОС не сохраняла-бы его по определенному и постоянному пути, а, например, где-то, в пределах данного диска. Т.е. даем команду записать файл - ОС отвечает: "записала на диск с:". А как найти? А как хочешь: то-ли сканируй все каталоги, то-ли еще как... Нашли файл. Поменяли в нем что-то. Снова командуем сохранить. ОС отвечает: "сохранила. Но сейчас - на диске d:. А тот, что был на с: - стерла". И снова ищи...


  • 2

--
Regards,
    Alex

    [Community Expert Group]
____

[Community Expert Group] members are not employed by SmartBear Software but
are just volunteers who have some experience with the tools by SmartBear Software
and a desire to help others. Postings made by [Community Expert Group] members
may differ from the official policies of SmartBear Software and should be treated
as the own private opinion of their authors and under no circumstances as an
official answer from SmartBear Software.
[Community Expert Group] signature is used with permission by SmartBear Software.
http://smartbear.com...munity-experts/
================================


#10 ikolesoo

ikolesoo

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

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Илья

Отправлено 16 июля 2015 - 08:32

...

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

...

 

Спасибо за развернутый ответ! Сейчас находимся в процессе выбора инструмента тестирования, возможно уйдем от интерфейса ближе к коду.


  • 0

#11 ksena

ksena

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

  • Members
  • PipPip
  • 99 сообщений
  • Город:Харьков


Отправлено 16 июля 2015 - 11:23

возможно уйдем от интерфейса ближе к коду.

 

Ну это не выход из положения. GUI  своего приложения тестировать нужно, это не обязывает вас тестировать word и иже с ним взятые. Можно попытаться как-то обойти всяческие настройки во внешних приложениях, не касающиеся функционала своего приложения.


  • 0

#12 ikolesoo

ikolesoo

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

  • Members
  • Pip
  • 4 сообщений
  • ФИО:Илья

Отправлено 16 июля 2015 - 11:31

 

возможно уйдем от интерфейса ближе к коду.

 

Ну это не выход из положения. GUI  своего приложения тестировать нужно, это не обязывает вас тестировать word и иже с ним взятые. Можно попытаться как-то обойти всяческие настройки во внешних приложениях, не касающиеся функционала своего приложения.

 

Тут скорее надо тестировать привязку впфа к бизнес логике, тогда. И если в этой связке ничего не меняется, то и тестировать ни к чему. А если будет ошибка в коде, то она будет видна и из тестов бизнес логики и из тестов через интерфейс. Вопрос в том, что проще и быстрее.


  • 0


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

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