12. Работа с графическими объектами

Назад: 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 Пользовательские формы