20 Часто задаваемые вопросы (FAQ)
Хотите добавить сюда свой вопрос? Пришлите его мне по почте (genka@alpaev.com)и мы посмотрим, что можно сделать!
В.: Я пытаюсь проверить, существует ли объект, с помощью свойства Exists, однако в лог мне пишется ошибка «Cannot obtain the window…». Почему?
О.: В TestComplete для того, чтобы проверить, существует ли объект, необходимо воспользоваться методами Wait, которые для каждого класса называются по-своему (например, WaitWindow для класса Window, WaitWinFormsObject для класса WinFormsObject и т.д.). Учтите, что методы Wait возвращают объект, а не логическое значение. Подробнее об использовании методов Wait можно прочитать в главе 3.5 Синхронизация выполнения скриптов.
В.: Во время тестирования мне нужно поставить задержку, однако каждый раз при выполнении задержка может быть разной. Как быть, чтобы каждый раз не использовать очень длинную (максимальную) задержку?
О.: В подобных случаях необходимо привязываться к каким-либо свойствам приложения, которые позволят точно сказать, закончилась ли операция. Например, ждать пока существует окно, или пока элемент управления не станет активным, или пока не появится определенное сообщение и т.п. В каждом конкретном случае это разные события и зависят исключительно от тестируемого приложения. Для отслеживания подобных событий используются методы Wait, о которых можно прочитать в главе 3.5 Синхронизация выполнения скриптов. И только в самых крайних случаях можно пользоваться функцией aqUtils.Delay(), которая вставляет задержку на определенное время независимо ни от чего.
В.: Во время работы скриптов TestComplete выводит ошибку «Объект не найден», однако я вижу этот объект в Object Browser. Почему TestComplete его не видит?
О.: Иногда в результате работы скриптов приложение обновляется (целиком или какая-то его часть). В результате скрипты пытаются работать с устаревшими объектами, которые уже не существую, хотя называются они точно так же. Обычно это происходит при использовании переменных, например:
var wCalc = Sys.Process(“calc”).Window(“SciCalc”);
// какие-то действия, в результате которых объект Window(“SciCalc”) обновляется
wCalc.Window(“Button”, “1”).Click(); // <-- ОШИБКА! wCalc уже не существует!
Чтобы решить эту проблему, необходимо либо заново проинициализировать переменную, либо обновить дерево объектов с помощью метода Refresh(). Метод Refresh() определен для любого объекта. Например, все следующие примеры корректны:
Sys.Refresh();
Sys.Process(“calc”).Refresh();
Sys.Process(“calc”).Window(“SciCalc”).Refresh();
Sys.Process(“calc”).Window(“SciCalc”).Window(“Button”, “1”).Refresh();
В.: Я поставил в скрипте breakpoint, однако TestComplete не останавливает выполнение скриптов в этом месте. Почему?
О.: Убедитесь, что:
- Установлен MS Script Debugger
- Включена опция Debug – Enable Debugging в TestComplete
- Используется самая последняя версия TestComplete (в некоторых версиях наблюдалась эта проблема, но была быстро устранена в следующих версиях)
- Текущий пользователь системы имеет права Администратора или Отладчика
- TestComplete не запущен в «тихом» режиме (Silent Mode, см. главу 11.2 Запуск TestComplete из командной строки)
- В параметрах интернета включена опция отладки (Start – Control Panel – Internet Options – Advanced, галочки Disable script debugging... в разделе Browsing)

- Если ничего выше не помогло — перезапустите TestComplete и/или компьютер
В.: TestComplete работает медленно (во время записи или воспроизведения). Что можно сделать?
О.: Есть несколько причин (кроме очевидной: слабый компьютер), которые могут влиять на скорость работы TestComplete во время записи/воспроизведения. Вот несколько советов, которые могут вам помочь:
- Отключите Visualizer. Если он включен, то во время записи/воспроизведения создаются скриншоты объектов, что, естественно, замедляет работу
- Отключите неиспользуемые Extension-ы (меню File - Install Extensions). Например, если вы не тестируете .NET приложения, то и плагин ".NET Open Applications Support" вам ни к чему
- Используйте фильтр процессов в Object Browser-e. Начиная с версии 6, TestComplete позволяет отображать в Object Browser-e не все процессы, а только выбранные. Рекомендуется включить отображение только тех процессов, с которыми работают ваши скрипты. Это ускорит обновление дерева объектов в Object Browser-e
- Если вы уверены, что причина медленной работы в тестируемом приложении - попробуйте поменять Object Tree Model и/или Web Tree Model
- В некоторых случаях стандартные методы TestComplete работают медленно (яркий пример - метод Keys в Internet Explorer 7 и выше). Попробуйте другие методы работы с такими элементами управления (например, присваивайие значения текстовым полям напрямую через свойство value вместо использования метода Keys)
- Убедитесь, что задержки при выполнении определенных операций (ввод текста, движение мыши и т.д.) выставлены на минимум (правый щелчок на имени проекта, Edit - Properties - Playback, группа опций "Delqy...")
- Также убедитесь, что методы Wait и Delay используются разумно во всем проекте, так как их частое использование может приводить к существенным задержкам при воспроизведении скриптов
- Отключите Debug Agent, если он вам не нужен
Более полный список улучшений можно прочитать в статье Automated Test Performance Tips (на английском языке).
В.: Как в TestComplete запустить программу (или досовскую команду)?
О.: Для запуска любой программы в TestComplete есть как минимум 3 способа. Предположим, мы работаем с программой notepad.exe, которая находится в папке C:\WINDOWS. Вот эти способы:
- Добавить программу в TestedApps и запустить с помощью команды
TestedApps.notepad.Run();
Обратите внимание, что добавить приложение в TestedApps можно также динамически с помощью метода TestedApps.Add() - Использовать WScript.Shell
Sys.OleObject("WScript.Shell").Run("C:\\Windows\\notepad.exe", SW_SHOWNORMAL); - Использовать WinAPI
Win32API.WinExec("C:\\Windows\\notepad.exe", SW_SHOWNORMAL);
Для выполнения команды DOS необходимо в качестве вызываемой программы указать CMD.EXE, затем передать ей параметр "/c" и необходимую команду. Например, следующая команда удаляет все файлы из папки Windows:
Sys.OleObject("WScript.Shell").Run("cmd.exe /c del /q /s C:\\WINDOWS", 0);