| Назад: 11 Другие возможности | Содержание | Дальше: 13 Пользовательские формы |
Прежде, чем начать эту главу, напомним, что любые операции с картинками в автоматизации тестирования нужно производить только в случае крайней необходимости (например, в случае тестирования графического редактора или когда нет никакой другой возможности работать с объектом), так как операции сравнения изображений:
- во-первых, производятся долго по сравнению с другими операциями
- во-вторых, требуют частого обновления тестовых скриптов
Это происходит потому, что обычно даже самые незначительные изменения в приложении, незаметные для пользователя, сразу же отражаются на результатах проверок, отчего в логах появляются ошибки, которые на самом деле ошибками приложения не являются, а являются лишь недоработкой или плохой реализацией проверок. Поэтому, прежде чем начинать использовать графические возможности TestComplete, убедитесь, что вы рассмотрели все прочие возможности и они действительно вам не подходят.
В отличие от многих других инструментов, предназначенных для автоматизации тестирования, TestComplete обладает огромным количеством встроенных средств для работы с изображениями. Ниже мы вкратце рассмотрим наиболее полезные из них.
Захват изображения и вывод его в лог
У любого видимого объекта в TestComplete есть метод Picture(), который позволяет захватить изображение элемента управления для дальнейшей работы с ним. Этот метод возвращает объект типа Picture. Например:
function TestImages()
{
var wPaint = Sys.Process(“mspaint”).Window(“MSPaintApp”, “*”);
wPaint.Activate();
var myPicture = wPaint.Picture();
}
В этом примере мы сохраняем изображение окна MS Paint в переменной myPicture.
Для веб-страниц также можно использовать метод PagePicture(), который позволяет сохранить в изображении всю страницу, даже если она выходит за видимые пределы экрана. При этом TestComplete сам прокрутит страницу и склеит куски изображения в одну картинку.
У метода Picture() есть несколько параметров, позволяющие захватить не всё изображение, а только его часть. При этом нам необходимо задать координаты начала (X и Y), а также ширину и высоту захватываемого изображения. Например, в следующем примере мы захватим не все окно Paint, а «обрежем» его на 10 пикселей с каждой стороны.
function TestImages()
{
var wPaint = Sys.Process(“mspaint”).Window(“MSPaintApp”, “*”);
wPaint.Activate();
var myPicture = wPaint.Picture(30, 30, wPaint.Width-60, wPaint.Height-60);
}
Для вывода изображения в лог предназначен медот Log.Picture, в который передаются собственно изображение и его описание. Например, если в предыдущий пример дописать следующую строку
Log.Picture(myPicture, “MS Paint cut picture”);
То в результате мы получим следующий лог:

При выделении соответствующей строки лога, в его правой нижней части появляется панель с изображением, которое мы поместили в лог. На этой панели есть несколько кнопок, с помощью которых изображение можно открыть в новом окне, перемещать, изменять его масштаб и т.п.
Кроме метода Log.Picture(), можно поместить изображение в лог и при логгировании ошибок или предупреждений. Например, вы можете захотеть поместить в лог скриншот экрана во время возникновении ошибки. Для этого можно использовать следующий код:
Log.Error(“Ошибка”, “Описание ошибки”, undefined, undefined, Sys.Desktop.Picture());
Результат:

Загрузка и выгрузка изображений
Захваченное изображение можно сохранить в файл или поместить в буфер обмена, а также сделать обратные операции. В следующем примере мы захватим картинку окна, сохраним ее в файл и поместим в буфер обмена, а затем вычитаем в другие переменные из файла и буфера обмена.
function TestImages2()
{
var wPaint = Sys.Process(“mspaint”).Window(“MSPaintApp”, “*”);
wPaint.Activate();
var myPicture = wPaint.Picture();
myPicture.SaveToFile(“c:\\1.png”);
Sys.Clipboard = myPicture;
var Pic1 = Utils.Picture;
Pic1.LoadFromFile(“c:\\1.png”);
var Pic2 = Sys.Clipboard;
Log.Picture(Pic1);
Log.Picture(Pic2);
}
Обратите внимание на то, как с помощью метода Utils.Picture мы создали пустую переменную типа Picture (var Pic1 = Utils.Picture;).
Параметры изображений и их модификация
У объекта Picture есть несколько полезных свойств и методов, предназначенных для работы с самим изображением:
- свойство Size позволяет получать и задавать размеры изображения
- свойство Pixels позволяет получить или установить значение цвета для заданного пиксела в изображении
- метод Stretch – позволяет масштабировать изображение
В следующем примере мы захватим изображение окна MS Paint, затем с помощью масштабирования (метод Stretch) уменьшим его в 4 раза, затем с помощью свойства Size оставим от полученной картинки только верхнюю левую часть, а в заключении с помощью свойства Pixels нарисуем в изображении черную линию.
function TestImages3()
{
var wPaint = Sys.Process(“mspaint”).Window(“MSPaintApp”, “*”);
wPaint.Activate();
var myPicture = wPaint.Picture();
// масштабируем
myPicture.Stretch(myPicture.Size.Width/2, myPicture.Size.Height/2);
Log.Picture(myPicture);
// обрезаем
myPicture.Size.Width = myPicture.Size.Width/2;
myPicture.Size.Height = myPicture.Size.Height/2;
Log.Picture(myPicture);
// рисуем горизонтальную линию черного цвета длиной 99 пикселей
for(i = 1; i < 100; i++)
{
myPicture.Pixels(i, 10) = 0x000000;
}
Log.Picture(myPicture);
}
Сравнение изображений
Сравнение изображений – это, пожалуй, самая важная часть этого раздела, так как именно для сравнения обычно и приходится их захватывать.
Сравнивать изображения можно двумя способами:
- используя объект Picture
- с помощью объекта Regions
Так как эти два подхода похожи и дают в принципе одинаковые результаты, мы рассмотрим подробно только первый из них, а второй оставим на рассмотрение читателям, перечислив лишь основные методы объекта Regions.
Существует 2 способа сравнения изображений:
- прямое сравнение двух картинок
- поиск области внутри картинки
Для прямого сравнения картинок используется метод Difference объекта типа Picture. Этот метод сравнивает изображение, для которого вызывается метод, с другим изображением, которое передается методу в параметрах. Метод Difference возвращает null, если сравнение прошло успешно, и картинку-разницу, в случае если картинки неодинаковые. Картинка-разница – это изображение, на котором белым цветом отмечаются одинаковые места из двух сравниваемых изображений, а красным – различия между ними.
В следующем примере мы сохраним изображение поля ввода Калькулятора (когда в нем находится цифра 0), затем ввдеем цифру 9 и сравним первое изображение с полученным, а результат сравнения выведем в лог.
function TestImages4()
{
var pic1, pic2, pic3;
var wCalc = Sys.Process(“CalcPlus”).Window(“SciCalc”, “Calculator Plus”);
var wEdit = wCalc.Window(“Edit”);
wCalc.Activate();
pic1 = wEdit.Picture();
wCalc.Keys(“9”);
pic2 = wEdit.Picture();
pic3 = pic1.Difference(pic2);
if(pic3 != null)
{
Log.Error(“Картинки не одинаковые!”, undefined, undefined, undefined, pic3)
}
}
Результат работы функции:

В некоторых случаях при сравнении картинок разница будет всегда. Например, если вы сравниваете окно, в котором присутствует текущая дата, то каждый день дата будет разной, а значит каждый день необходимо обновлять картинку. Чтобы этого не делать, метод Difference предоставляет 2 параметра:
- Transparent – позволяет отметить на рисунке область, которую TestComplete будет считать «прозрачной» и пропустит при сравнении. Для того, чтобы указать такой цвет, необходимо открыть сохраненную картинку в любом редакторе и отметить каким-то одним цветом (например, красным) самый первый пиксель (верхний левый) и всю область, которую следует пропускать при сравнении, после чего установить параметр Transparent в true. В нашем примере необходимо будет таким образом закрасить всё поле ввода. Первый пиксель необходимо закрашивать потому, что именно по нему TestComplete определяет «прозрачный» цвет при сравнении
- Tolerance – позволяет указать максимальное количество пикселей, которое может быть разным при сравнении и это не будет считаться ошибкой. Этот параметр может оказаться полезным в случае, когда элементы управления помещаются в окно динамически и их размеры могут иногда отличаться на 1-2 пикселя, однако при этом всё остальное остается неизменным. Учтите, что использование этого параметра может замедлить работу метода Difference.
Следующий пример будет сложным. В нём мы продемонстрируем работу обоих параметров. Для этого мы во время работы скрипта динамически закрасим красным цветом первый пиксель и всю область, где находится цифра (в правой части), а затем рассчитаем значение Tolerance, исходя из размеров поля ввода.
function TestImages5()
{
var pic1, pic2, pic3;
var wCalc = Sys.Process(“CalcPlus”).Window(“SciCalc”, “Calculator Plus”);
var wEdit = wCalc.Window(“Edit”);
wCalc.Activate();
wCalc.Keys(“[Esc]”);
pic1 = wEdit.Picture();
wCalc.Keys(“9”);
pic2 = wEdit.Picture();
// закрашиваем первый пиксель и всю область возле первой цифры поля ввода
pic1.Pixels(0, 0) = 0x0000FF;
for(var i = 440; i <= 450; i++)
{
for(var j = 3; j <= 19; j++)
{
pic1.Pixels(i, j) = 0x0000FF;
}
}
// рассчитываем значение Tolerance
var iTol = wEdit.Height*2 + wEdit.Width*2;
pic3 = pic1.Difference(pic2, true, iTol);
if(pic3 != null)
{
Log.Error(“Картинки не одинаковые!”, undefined, undefined, undefined, pic3)
}
}
Для поиска области внутри имеющейся картинки используется метод Find объекта Picture. В качестве параметра ему необходимо передать другой объект типа Picture, который мы хотим найти внутри данной картинки. Кроме этого параметра можно задать координаты X и Y, начиная с которых будет осуществляться поиск, а также уже известные нам параметры Transparent и Tolerance. Метод Find возвращает объект типа Rect, из которого можно узнать координаты искомой картинки, или null если изображение не найдено. Естественно, искомое изображение должно быть меньше, чем изображение, в котором производится поиск.
В примере ниже мы покажем, как внутри картинки Калькулятора найти картинку, соответствующую кнопке 9.
function TestImages6()
{
var pic1, pic2;
var wCalc = Sys.Process(“CalcPlus”).Window(“SciCalc”, “Calculator Plus”);
var wEdit = wCalc.Window(“Edit”);
wCalc.Activate();
wCalc.Keys(“[Esc]”);
pic1 = wCalc.Picture();
pic2 = wCalc.Window(“Button”, “9”).Picture();
var rect = pic1.Find(pic2);
if(rect == null)
{
Log.Error(“Картинка кнопки 9 не найдена внутри картинки Калькулятора”);
}
else
{
Log.Message(“Параметры найденного изображения”, rect.Left + “, ” + rect.Right);
}
}

Использование Regions
Если вы используете в своем проекте объект Regions, вы можете использовать его методы для сравнения изображений. Например, метод Compare сравнивает объект, хранящийся в Regions с другим изображением, а для поиска используются методы Find и FindRegion (эти методы одинаковы, разница лишь в порядке передаваемых параметров). Преимущество использования, например, метода Compare в том, что в случае, когда сравнение закончилось неудачей, TestComplete сам помещает в лог 3 картинки: две сравниваемых картинки и картинку-разницу, что существенно облегчает как написание скриптов, так и последующее чтение логов. Однако некоторые вещи (например, масштабирование) выполнить с помощью Regions не удастся.
Прочие особенности
При захвате изображений и сравнении картинок есть еще один параметр, который мы не рассматривали, – Mouse. Этот параметр позволяет при захвате и сравнении изображений учитывать также и курсор мыши (который по умолчанию игнорируется).
Кроме того, обратите внимание на то, что TestComplete поддерживает 4 формата изображений: BMP, GIF, JPG и PNG. В случае использования последних трех форматов при сравнении изображений TestComplete преобразует их к формату BMP. Для большинства случаев мы рекомендуем использовать формат PNG с установленным Compression level = 0. Этот формат сохраняет максимальную точность изображений и при этом занимает сравнительно немного места. Установить нужный формат можно в разделе Tools – Options – General.
Еще один важный момент: изображения рекомендуется захватывать и сохранять либо с помощью самого TestComplete, либо с помощью клавиши PrtScr и программы MS Paint. В случае использования любых других сторонних приложений возможны различия в сохраненных изображениях с теми, которые делает TestComplete.
| Назад: 11 Другие возможности | Содержание | Дальше: 13 Пользовательские формы |