Что делать, если TestComplete не распознаёт элементы в приложении?

Иногда на форумах проскакивает вопрос “TestComplete не распознаёт ничего внутри моего приложения” или “Не видны внутренние элементы сложного элемента управления”. TestComplete поддерживает огромное количество различных сред разработки и элементов управления, однако не всегда начинающие (и даже опытные) пользователи могут сходу разобраться, что и как необходимо настраивать для максимально эффективной работы.

В этой статье я попытаюсь дать общий алгоритм решения подобных проблем.

1. Remote Desktop/Virtual Machines

Начнём с элементарного. Может быть вы подключаетесь к удалённому компьютеру с помощью Remote Desktop или любой программы для работы с виртуальными машинами (Virtual PC, VMWare, VirtualBox, Citrix) и пытаетесь распознать внутри них элементы с помощью TestComplete, который установлен на локальной машине? У вас ничего не выйдет. Эти программы всего лишь передают изображение, картинку. TestComplete нужно устанавливать на удалённую машину.

2. Поддерживает ли TestComplete среду разработки, в которой написано ваше приложение, или используемые элементы управления?

Прежде всего убедитесь, что TestComplete поддерживает ваш тип приложения (или тип контролов, которые в нём используются). Сделать это можно, просто поискав в гугле по ключевым словам. Если приложение поддерживается — внимательно почитайте документацию в TestComplete, так как некоторые приложения необходимо предварительно подготовить, чтобы TestComplete видел все их внутренние свойства и методы. Например, некоторые приложения необходимо компилировать с дополнительными опциями компилятора (что не делается для обычных билдов), для тестирования других приложений необходимо включить дополнительные опции в самом TestComplete, в операционной системе и т.п.

Также имеет значение версия TestComplete и версия компилятора (или сторонних компонентов), используемые в тестируемом приложении. В некоторых случаях (например, работа с браузерами Chrome и Mozilla, а также при работе с некоторыми контролами типа Qt) для TestComplete одной версии могут выпускаться новые версии плагинов (Extensions), которые необходимо вручную скачивать с сайта SmartBear. Опять-таки, обо всём этом можно прочитать во встроенной документации (или в её online-версии).

3. А что если так и должно быть?

Предположим, вы сделали всё, что описано в предыдущем параграфе, но TestComplete по-прежнему не распознаёт элементы вашего приложения или неправильно записывает скрипт с помощью Record. В этом случае есть вероятность, что на самом деле всё работает, как нужно, а вы просто ожидаете чего-то не того.

Например, если вы работали с гридами WPF или Qt, то замечали, что Object Spy подсвечивает каждую ячейку отдельно, однако в гриде WinFormsObject невозможно так же подсветить отдельную ячейку. Для доступа к ячейкам в таких гридах используются либо специальные методы, предоставляемые TestComplete-ом, либо .NET свойства и методы, при этом запись может работать неправильно (записывать обычный Click с координатами, хотя TestComplete предоставляет методы вроде ClickCell).

На этом примере видно, что хотя отдельные ячейки в гриде не распознаются, мы всё равно можем пользоваться TestComplete-методами или .NET-методами для работы с отдельными ячейками.

В таких случаях необходимо сначала почитать документацию TestComplete по вашему контролу, а если необходимого метода нет — изучать доступные свойства и методы приложения и вызывать их. Пример такого изучения можно посмотреть в этом видео.

4. Object Mapping

В некоторых случаях, если в вашем приложении есть кастомные элементы управления, которые унаследованы от стандартных, можно научить TestComplete работать с ними, как с обычными. Это не позволит полностью использовать все возможности, ради которых создавалась кастомизация, но зачастую это и не нужно.

Для этого в TestComplete выберите пункт меню Tools | Current Project Properties и кликните на элементе Object Mapping.

Здесь вы можете добавить для любого существующего класса новый элемент управления, причём сделать это можно как вручную (Add Class Name), так и выбрав контрол на экране (Add From Screen).

Этот подход обычно хорошо срабатывает с простыми элементами управления (текстовые поля, списки, кнопки, чекбоксы), однако для сложных элементов типа гридов он вряд ли сработает (однако попробовать всё равно стоит).

5. MSAA/UI Automation

Эти две технологии используются в различных приложениях для того, чтобы упростить доступ к своим элементам сторонним программам. Мы можем добавить имена классов (свойство WndClass) необходимых нам элементов управления, и, если они поддерживают эту технологию, в Object Browser-e появится много дополнительных объектов. Находятся эти опции там же, где Object Mapping (меню Tools | Current Project Properties).

Вот как в Object Browser-e выглядит панель инструментов приложения Excel до и после подключения UI Automation для класса NetUIHWND:

В именах классов можно использовать символы групповой автозамены (* и ?), если у вас много классов с похожими названиями, однако не стоит включать класс, у которого в качестве имени указана лишь звёздочка, так как в этом случае TestComplete будет пытаться искать указанную технологию во всех элементах управления, что существенно замедлит обновление дерева объектов. Тем не менее, если вы не знаете, какие из ваших контролов поддерживают одну из этих технологий, можно временно включить этот элемент, найти все необходимые объекты, а затем добавить их в список, не забыв при этом отключить элемент *.

6. Text Recognition

Если ничего из вышеперечисленного не помогло, можно попробовать ещё один простой способ: Text Recognition, который позволяет в некоторых случаях получить текст из элементов управления. В тех же настройках проекта (Tools | Current Project Properties) выберите раздел TextRecognition и добавьте туда имена классов (здесь также можно использовать символы групповой замены * и ?). В результате в дереве объектов вы увидите новые элементы:

Обязательно обратите внимание на эту возможность, если вы работаете с Delphi-приложениями, с ними обычно этот подход сочетается хорошо.

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

7. OCR — распознавание текста

Распознавание текста поможет вам получить текст из любых элементов управления на экране, независимо от того, поддерживает работу с ними TestComplete или нет. Это значит, что можно получить текст даже из картинки, если есть такая необходимость. У этого метода есть ограничения (например, распознаются только буквы латинского алфавита и похожие на них; для корректной работы OCR необходимо отключать сглаживание экранных шрифтов в Windows), а также он работает достаточно медленно, поэтому либо старайтесь использовать его пореже, либо вообще исключите из автоматизации тесты, требующие распознавания текста.

8. Image-Based Testing

Image-Based Testing — это такой подход в автоматизации, при котором любые операции с приложением делаются с использованием изображений. То есть вместо того, чтобы распознавать контролы и работать с их свойствами и методами, мы просто всегда работаем со скриншотами приложения или отдельных элементов управления. У этого подхода есть важное преимущество: он работает с любыми типами приложений, всегда. Но есть и важный недостаток: такой подход работает очень медленно, так как инструменту автоматизации приходится постоянно осуществлять поиск и сравнение изображений, а это весьма сложная и долгая процедура.

Если вы в конце концов остановились на этом подходе, вам необходимо обязательно внимательно изучить документацию TestComplete по работе с изображениями, так как в этом инструменте есть всё, что нужно для работы с изображениями (сравнение, поиск одной картинки внутри другой, допуски при сравнении – tolerance, игнорирование областей при сравнении, возможность игнорирования определённого цвета при сравнении и др.). Также имейте ввиду, что изображения могут отличаться на разных версиях операционных систем, поэтому подобная автоматизация может существенно усложняться.

И напоследок…

1. Если ваше приложение обфусцировано, то работать с ним нормально не получится. Вам необходимо либо работать с необфусцированной версией приложения, либо использовать сложные подходы типа OCR/Image-Based Testing.

2. Все вышеперечисленные подходы можно и нужно комбинировать. В тестируемом приложении могут встречаться разные типы контролов, каждый из которых будет требовать отдельного подхода. Ваша задача заключается в том, чтобы найти нужный подход для каждого из них.

3. Если вы столкнулись с невероятно сложной задачей автоматизации, которую сложно реализовать и сложно поддерживать — это повод отказаться от автоматизации этой задачи вообще. Некоторые вещи лучше, проще и быстрее тестировать вручную, чем постоянно чинить автотесты.