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

Здесь мы видим три проблемы, которые могут быть связаны, а могут и не быть. Поэтому начинать необходимо всегда с решения первой проблемы, так как ее исправление может автоматически исправить и все остальные. С другой стороны, попытка исправить более поздние ошибки скорее всего ни к чему не приведет, так что мы зря потратим время.
Теперь приступим собственно к решению проблемы:
- Если сообщение об ошибке ни о чем вам не говорит, щелкните на нем один раз мышью и посмотрите на панель Remarks (в TestComplete 8 и более поздних она называется Additional Info). Обычно там находится более подробная информация о проблеме.
- Если при создании ошибки был сгенерирован скриншот — посмотрите на него тоже (панель Picture).
- Если до сих пор причина неясна — дважды щелкните на ошибке в логе, в результате вы перейдете к строке кода, в которой возникла проблема. Посмотрите внимательно на код и попытайтесь понять, что именно в этом коде могло привести к подобной ошибке (обращение к несуществующему окну, попытка использования необъявленной переменной, выход за границу массива и т.п.).
- Если причина до сих пор непонятна — пора отлаживать. Ставьте брекпоинт на строке, где возникла ошибка (для этого нужно нажать F9, предварительно поставив в эту строку курсор) и запускайте тест. Выполнение теста будет остановлено и мы получим возможность внимательно изучить состояние всех объектов в данный момент:
- проверьте, что все переменные инициализированы и содержат правильные значения (особое внимание уделяйте значениям типа null и undefined, так как зачастую с ними связаны проблемы работы с переменными)
- проверьте, что все окна и элементы управления, используемые в этой строке, существуют и видны на экране – свойства Enabled, Exists, Focused, Visible, VisibleOnScreen (прочитайте в справочной системе о разнице между свойствами Visible и VisibleOnScreen, если еще этого не знаете)
- проверьте, что вызываемый метод поддерживается объектом (IsSupported)
Для просмотра значений переменных у нас есть сразу несколько способов: панели Watch List и Locals, а также окошко Evaluate (вызывается нажатием на кнопку с изображением калькулятора на панели инструментов), в котором можно присвоить переменным новые значения в случае надобности.
- Если на этом этапе вам неясно, почему переменные имеют такие значения, а не ожидаемые, останавливайте воспроизведение и ставьте брекпоинт раньше, после чего выполняйте скрипт шаг за шагом (выполнить одну строку кода можно с помощью клавиши F10, а зайти внутрь функции — с помощью клавиши F11).
Какие бывают ошибки?
Теперь рассмотрим примеры ошибок и способы их решения.
The test run has stopped because the Stop on Error (Warning) setting is enabled
Эта ошибка появляется в том случае, если перед этим возникла другая ошибка и в настройках проекта указано останавливать выполнение тестов в случае возникновения ошибки. Решить ее довольно просто:
- Откройте свойства проекта (правый щелчок на имени проекта, Edit – Properties).
- Откройте группу опций Playback.
- Отключите флажки Stop on error/Stop on warning
Incomplete Keyboard Input
- Эта ошибка обычно появляется в том случае, если в метод Keys была передана неправильная последовательность символов. Для метода Keys символы !, ^, ~ и [ имеют специальные значения (эмуляция нажатия клавиш-модификаторов типа Ctrl и Shift), поэтому чтобы ввести такой символ, его нужно просто продублировать. Самый простой способ создать правильную последовательность вводимого текста — записать его с помощью Record Script.
- Еще одна возможная причина ошибки — отсутствие нужной раскладки клавиатуры (если используется не английский текст) или нужных компонентов ОС (в случае с азиатским текстом).
- Кроме того, в Windows XP и Server 2003 может быть выключена опция Extend support of advanced text services to all programs.
Unexpected window
Эта ошибка появляется в том случае, если во время работы с тестовым приложением на экране появилось модальное окно, мешающее TestComplete’у. Есть 2 способа решить эту проблему:
- автоматически: в настройках проекта в группе опций Playback указать TestComplete’у, как поступать с такими окнами (закрывать, нажимать на фокусированный элемент управления и т.п.)
- вручную: создать обработчик события OnUnexpectedWindow, где явно прописать необходимые действия.
Второй способ обычно используется в специфических случаях с нестандартными окнами.
Есть похожая проблема с Overlapping Windows (перекрывающими окнами). Разница между ними в том, что Overlapping Window не мешает работе TestComplete. Их можно игнорировать (все в тех же настройках проекта) или обрабатывать с помощью события OnUnexpectedWindow.
Object Does Not Exist
Объект, с которым скрипт пытается работать, не существует. Вот список наиболее частых причин этой ошибки:
- неправильная идентификация объекта (заданный набор свойств и их значений не совпадает с реальным объектом)
- изменилось положение объекта в иерархии объектов (чаще бывает при использовании модели объектов Tree)
- не найден один из родительских объектов (или же под описание родительского объекта попадает сразу несколько объектов)
Решение проблемы: с помощью Object Spy (в TestComplete 7 – Object Properties) выяснить полное имя и новые значения свойств и обновить скрипты или NameMapping.
Unable to Find the Object
Прежде чем выполнять какие-то действия с любым объектом (окно, процесс, элемент управления), TestComplete сначала проверяет его существование. Если объект не существует, в логе появляется ошибка «Unable to Find the Object». Чаще всего это происходит в том случае, если объект был присвоен переменной, после чего сам объект перестал существовать, а скрипт пытается работать с переменной (которая соответствует уже несуществующему объекту).
Решение проблемы: заново инициализировать переменную тем же объектом.
Cannot Obtain the Window…
Попытка обращения к окну или элементу управления, которого не существует. Наиболее частая причина: неправильное написание заголовка, класса или неверный индекс элемента.
Решение проблемы: исправить неправильное свойство. Это может быть следствием изменений в тестируемом приложении.
Ambiguous Recognition of the Tested Object
Неоднозначное определение окна: описанию окна или элемента управления соответствует несколько объектов. Основных причин может быть две:
- неверно выбран набор свойств, используемых для идентификации объекта (например, их слишком мало)
- неверное использование символов групповой замены (wildcards, * и ?).
Решение проблемы: определить новый набор свойств для уникальной идентификации объектов или использовать менее универсальные замены с помощью символов * и ?.
The alias refers to a mapped object that is not in the NameMapping project item
Alias ссылается на несуществующий элемент NameMapping. Это может происходить в том случае, если элемент был удален из NameMapping, но соответствующий ему Alias остался.
Решение проблемы: удалить Alias и переписать скрипты в соответствии с изменениями.
Заключение
Конечно, каждую проблему необходимо решать отдельно, так как причины в каждом случае могут быть совершенно разные. Однако столкнувшись несколько раз с той или иной проблемой и решив ее, вы с каждым разом будете делать это все быстрее, а в дальнейшем будете писать код, менее склонный к подобным ошибкам.
Также следует упомянуть, что в некоторых случаях решение проблемы может оказаться более сложным, чем в описанных здесь случаях. Например, если для создания тестов вы используете объектно-ориентированный подход с использованием языковых возможностей JScript или VBScript, найти причину может оказаться гораздо сложнее, так как TestComplete не поддерживает переходы внутрь методов по клику в логе.
Еще более проблематичным может оказаться работа с такими объектами, которые невозможно «словить» с помощью Object Spy (например, меню). В этом случае придется писать дополнительно небольшие функции, которые будут в лог выводить список доступных свойств и методов (с помощью методов aqObject.GetProperties и aqObject.GetMethods).
Подробнее почитать обо всех рассмотренных ошибках можно в официальном руководстве по TestComplete (на английском языке).