Общие сведения

ВступлениеПодготовка к запускуАрхитектура платформы TestoПорядок запускаПолитика запуска тестов

Обучающие материалы по Testo для Hyper-V

Часть 1. Самый первый тестЧасть 2. Устанавливаем Ubuntu ServerЧасть 3. Доступ в Интернет из виртуальной машиныЧасть 4. Гостевые дополненияЧасть 5. ПараметрыЧасть 6. КешированиеЧасть 7. Связываем две машины по сетиЧасть 8. ФлешкиЧасть 9. МакросыЧасть 10. Конструкция ifЧасть 11. No snapshotsЧасть 12. Управление мышкойЧасть 13. Импортирование жёстких дисковЧасть 14. JS-селекторыЧасть 15. Циклы

Обучающие материалы по Testo для QEMU

Часть 1. Самый первый тестЧасть 2. Устанавливаем Ubuntu ServerЧасть 3. Гостевые дополненияЧасть 4. ПараметрыЧасть 5. КешированиеЧасть 6. Доступ в Интернет из виртуальной машиныЧасть 7. Связываем две машины по сетиЧасть 8. ФлешкиЧасть 9. МакросыЧасть 10. Конструкция ifЧасть 11. No snapshotsЧасть 12. Управление мышкойЧасть 13. Импортирование жёстких дисковЧасть 14. JS-селекторыЧасть 15. ЦиклыЧасть 16. Макросы с объявлениями

Спецификация языка

Общая структура скриптовых файловБазовые конструкции языкаOбъявление виртуальной машиныОбъявление виртуального флеш-накопителяОбъявление виртуальной сетиПараметрыОбъявление тестовМакросыДействия с виртуальными машинамиДействия с мышкойПоиск изображений на экранеДействия с виртуальными флеш-накопителямиУсловияЦиклыСписок идентификаторов клавиш

Запросы на языке Javascript

Общая концепция построения JS-селекторовВстроенные глобальные функции JavascriptИсключенияКласс TextTensorКласс ImgTensorКласс Point

Действия с мышкой

Действия с мышкой начинаются с ключевого слова mouse, но в дальнейшем формат команды зависит от уточнения, какое именно действие необходимо выполнить. Практически все команды (за исключением mouse hold и mouse release) связаны с возможностью перемещения курсора мыши в определенное место на экране монитора. Давайте рассмотрим способы определения места на экране, куда можно переместить курсор.

Способы перемещения курсора мыши (destination)

Координаты

Одним из способов перемещения курсора мыши являются координаты. Координаты выражаются в пикселях и представляют собой два числа, разделенные пробелом, в формате X Y. Первое число отвечает за перемещение курсора по горизонтальной оси Х, а второе число - по вертикальной оси Y. Точка с координатами 0 0 находится в левом верхнем углу экрана.

Пример:

100 250 # Точка с координатами 100 по оси Х (100 пикселей от справа от левого края экрана)
        #  и 250 по оси Y (250 пикселей снизу от верхнего края экрана)

Надпись на экране

Также указатель можно перемещать на центр надписи, если она присутствует на экране. В надписи можно использовать значения переменных. Центрирование курсора внутри найденной надписи происходит по обеим осям.

Examples:

"Мой компьютер" # центр надписи "Мой компьютер"
"${pic_name}.png"

Надпись на экране с дополнительными уточнениями

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

Процесс выбора нужного места, в которое надо переместить, можно разделить на 3 этапа

Шаг 1. Выбор нужного экземпляра надписи

В случае, когда искомая надпись присутствует на экране более, чем в одном экземпляре, необходимо уточнить, какой именно экземпляр нас интересует. Для этого существует четыре спецификатора:

  1. from_bottom(N) - выбрать N-ную надпись снизу. from_bottom(0) означает самую нижнюю искомую надпись на экране.
  2. from_top(N) - выбрать N-ную надпись сверху. from_top(0) означает самую верхнюю искомую надпись на экране.
  3. from_left(N) - выбрать N-ную надпись слева. from_left(0) означает самую левую искомую надпись на экране.
  4. from_right(N) - выбрать N-ную надпись справа. from_right(0) означает самую правую искомую надпись на экране.

Вы можете пропустить шаг 1 если искомая надпись присутствует на экране в единственном экземпляре. В этом случае можете переходить срзау к шагу 2 или 3.

Нельзя указывать в качестве N число больше, чем Количество_экземпляров_искомой_надписи_на_экране - 1. В этом случае будет сгенерирована ошибка (в качестве аналогии можно вспомнить попытку указать слишком большой индекс при обращении к элементу массива).

Шаг 1 нельзя выполнять несколько раз. Попытка это сделать приведет к ошибке.

Шаг 2. Позиционирование курсора внутри экземпляра надписи

По умолчанию после нахождения нужной надписи курсор перемещается на геометрический центр этой надписи. Однако, иногда требуется передвинуть указатель в другое место внутри найденного объекта. Для этого существуют следующие спецификаторы:

  1. left_bottom() - переместить указатель в левый нижний угол надписи.
  2. left_center() - переместить указатель в левый край надписи по центру.
  3. left_top() - переместить указатель в левый верхний угол надписи.
  4. center_bottom() - переместить указатель в нижний край надписи по центру.
  5. center() - переместить указатель в геометрический центр надписи (поведение по умолчанию).
  6. center_top() - переместить указатель в верхний край надписи по центру.
  7. right_bottom() - переместить указатель в правый нижний угол надписи.
  8. right_center() - переместить указатель в правый край надписи по центру.
  9. right_top() - переместить указатель в правый верхний угол надписи.

Этот шаг можно пропустить если Вас устраивает позиционирование по центру надписи.

Выполнить этот шаг без предварительно выполненного 1-го шага можно только в том случае, если искомая надпись присуствует на экране в единственном экземпляре.

Шаг 2 нельзя выполнять несколько раз. Попытка это сделать приведет к ошибке.

Шаг 3. Финальное позиционирование

После позиционирования курсора внутри текста существует возможность передвинуть указатель на фиксированное количество пикселей по осям X и Y. Для этого существуют следующие спецификаторы:

  1. move_left(N) - переместить курсор на N пикселей влево.
  2. move_right(N) - переместить курсор на N пикселей вправо.
  3. move_up(N) - переместить курсор на N пикселей вверх.
  4. move_down(N) - переместить курсор на N пикселей вниз.

Этот шаг можно выполнять неограниченное количество раз.

Выполнить этот шаг без предварительно выполненного 1-го шага можно только в том случае, если искомая надпись присуствует на экране в единственном экземпляре.

Если вы опустили шаг 2, то финальное позиционирование начнётся с центра надписи.

Применение спецификаторов

Спецификаторы применяются с помощью точки. Для применения спецификатора к результату поиска строки на экране (который возвращает массив найденных объектов) нужно после искомой строки поставить точку и указать необходимый спецификатор. Например, "Искомая строка".from_top(0). Дальнейшие спецификаторы также необходимо указывать через точку: "Искомая строка".from_top(0).right_bottom().move_left(10).move_up(70).

Изображение на экране

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

img "/path/to/img/file"

где /path/to/img/file - это путь к картинке-шаблону, которую требуется найти на экране. Правила подготовки и использования шаблонов можно найти здесь.

В остальном перемещение курсора к изображению работает точно так же, как перемещение к надписям. В частности, можно использовать все те же спецификаторы (from_top, center_bottom, move_right и так далее).

Результат работы JS-селектора

Наконец, можно указать цель перемещения курсора в виде результата работы скрипта на языке javascript. Скрипт обязательно должен возвращать объект, имеющий числовые свойства "x" и "y".

Внутри JS-селектора можно использовать результат работы встроенных функций find_text и find_img, которые возвращают все найденные на экране строки или изображения. Полученные объекты затем можно фильтровать с помощью различных методов (подробности см. здесь).

В конечном счете, процесс работы со строками в JS-селекторах довольно похож на применение встроенных в язык Testo-lang спецификаторов. Начиная с поиска множества объектов, необходимо с помощью уточняющих действий перейти к формированию конечной точки (объекта с полями x и y), которую и необходимо возвратить в качестве результата работы селектора. Эта точка будет означать место назначения для перемещения курсора.

Примеры:

# передвинуть указатель мыши на центр надписи "Hello world" синего цвета на сером фоне
# Сработает только если такая надпись находится на экране в единственном экземпляре
js "find_text('Hello world').match_color('blue', 'grey').center()"

# передвинуть указатель мыши на 20 пикселей от правого края самой нижней надписи "Hello world"
js "find_text('Hello world').from_bottom(0).right_center().move_right(20)"

#Передвинуть указатель в точку с координатами 200 400
js "{x: 200, y: 400}"

В ряде случаев внутри селектора невозможно определить конечную точку назначения, потому что (пока) не наступило нужное событие. Например, представим ситуацию, когда требуется дождаться наличия именно двух надписей "Hello world", после чего переместить курсор на точку ровно посередине между этими двумя надписями. В этом случае JS-селектор не может вернуть никакую точку пока на экране не появится два экземпляра искомой надписи.

Для решения этой задачи необходимо воспользоваться специальным встроенным исключением ContinueError, которое предписывает прервать выполнение JS-селектора и попробовать выполнить его снова на следующей итерации.

Пример:

js """
  found = find_text('Hello world')
  // Дожидаемся пока на экране не появится ровно два экземпляра надписи Hello world
  if (found.size() != 2) {
    throw ContinueError()
  }

  //Координаты центра нижней надписи
  first = found.from_bottom(0).center()

  //Координаты центра верхней надписи
  second = found.from_bottom(1).center()

  result_x = (first.x + second.x) / 2
  result_y = (first.y + second.y) / 2
  //Возвращаем координаты точки между двумя надписями
  result = {x: result_x, y: result_y}
"""

Исключение ContinueError можно использовать только в JS-селекторах, относящихся к действиям mouse. Эти же исключения недопустимы в действиях wait и check.

Если действие mouse содержит JS-селектор с исключением ContinueError и время выполнения этого действия превышает таймаут, указанный в действии mouse (по умолчанию - 1 минута), то действие завершится с ошибкой Wiat timeout.

mouse move

Передвинуть указатель мыши в место на экране, укзанное в <destination>. В случае, когда качестве destination используется строка или javascript-селектор, интерпретатор попробует дождаться нужной надписи или изображения на экране или будет выполнять javascript до тех пор (но не дольше timeout_interval), пока destination не вернет хотя бы один объект. Если destination при этом возвращает 2 или более объектов, то команда завершается с ошибкой.

mouse move <destination> [timeout timeout_interval]

Аргументы:

  • destination - Указание места на экране, куда нужно переместить курсор мыши.
  • timeout_interval - Тип: спецификатор времени или строка. Максимальное время ожидания подходящего destination. Значение по-умолчанию - одна минута. Значение по умолчанию можно поменять с помощью служебного параметра TESTO_MOUSE_MOVE_CLICK_DEFAULT_TIMEOUT. Подробности см. здесь. В случае, если в качестве аргумента указывается строка, значение выражения внутри строки должно быть приводимым к спецификатору времени. Внутри строки можно использовать обращение к параметрам.

mouse click(lckick, rclick, dclick)

Выполнить нажатие, указанное в click_type. Если указан [destination] - то предварительно будет выполнено перемещение курсора мыши в нужное место на экране. Дополнительную информацию см. в mouse move.

mouse <click_type> [destination] [timeout timeout_interval]

Аргументы:

  • click_type - Тип нажатия на кнопки мыши. click (или lclick) - нажать на левую кнопку мыши, rclick - нажать на правую кнопку мыши, dclick - дважды нажать на левую кнопку мыши.
  • destination - Указание места на экране, куда нужно переместить курсор мыши.
  • timeout_interval - Тип: спецификатор времени или строка. Максимальное время ожидания подходящего destination. Значение по-умолчанию - одна минута. Значение по-умолчанию можно поменять с помощью служебного параметра TESTO_MOUSE_MOVE_CLICK_DEFAULT_TIMEOUT. Подробности см. здесь. В случае, если в качестве аргумента указывается строка, значение выражения внутри строки должно быть приводимым к спецификатору времени. Внутри строки можно использовать обращение к параметрам.

mouse hold

Зажать кнопку мыши, указанную в button.

mouse hold <button>

Аргументы:

  • <button> - Кнопка мыши, которую надо зажать. Возможные значения: lbtn, rbtn.

mouse release

Отпустить текущую зажатую кнопку мыши.

mouse release

Примеры

Простые примеры

#Передвинуть курсор на позицию "Х:400, Y:0"
#Сработает в любом случае
mouse move 400 0

#Выполнить правый клик по надписи "Корзина"
#Сработает только в том случае, если надпись "Корзина" появится на экране
#В единственном экземпляре в течение 10 минут
mouse rclick "Корзина" timeout 10m

#Выполнить двойной клик по самой нижней иконки "Корзина"
#Шаблон для иконки находится в папке ./icons/Корзина.png
mouse dclick img "icons/Корзина.png".from_bottom(0) timeout 10m

Пример 1

Задача: кликнуть на надпись "Установить", выделенную красным цветом

Всего на экране присутствует 3 надписи "установить", поэтому простой запрос mouse click "Установить" не сработает. Однако, мы можем уточнить, какая именно надпись нас интересует, с помощью спецификаторов from. В данном случае удобнее всего воспользоваться спецификатором from_top:

#Кликнуть на вторую сверху надпись "Установить"
mouse click "Установить".from_top(1)

Пример 2

Задача: кликнуть на область, выделенную красным цветом

Для клика на заданную область необходимо отталкиваться от близлежащих к этой области надписей. В данном случае можно использовать надпись "Предпочитаемый DNS-сервер". Однако если выполнить поиск этой надписи, то курсор будет спозиционирован в центр этого объекта. Но для перехода на нужную красную область гораздо удобнее использовать правый край надписи "Предпочитаемый DNS-сервер". Для этого можно применить спецификатор right_center(). Затем, отталкиваясь от правого края надписи "Предпочитаемый DNS-сервер", мы можем сдвинуть указатель на несколько пикселей вправо, чтобы попасть в нужную область.

mouse click "Предпочитаемый DNS-сервер".right_center().move_right(30)