Sikuli: обертки и свернутые сессии
Из ленты: OpenQuality.ru
Добрый день.
Тема Sikuli (инструмент для автоматизации действий в графическом интерфейсе) поднималась в блоге два года назад (запуск в среде Linux). Рассмотрим обертки вокруг базовых методов Sikuli и запуск тестов в свернутой RDP-сессии в среде Windows.
Обертки вокруг базовых методов Sikuli
При работе автотеста с Sikuli порой приходится ожидать или нажимать на элемент графического интерфейса, который может видоизменяться от запуска к запуску: на разных машинах, в разных браузерах, при разных исходных данных. К примеру, у элемента может различаться фон (белый, матовый, серый), форма представления (прямые или закругленные углы), шрифт текста (Times New Roman или Calibri). Еще один пример: интересующий нас элемент может частично перекрываться другим элементом при малом разрешении экрана или появлении неожидаемых окон. И при всем при этом нам нужно кликнуть на этот элемент вне зависимости от подобных отклонений. Как поступать в таких случаях?
Вариант в лоб: выделить ту часть элемента, которая не подвержена отклонениям. Если различается фон, то ориентироваться на кусок, на котором нет фона. Если различаются углы, то исключить углы из паттерна. Если элемент иногда перекрывается, то ориентироваться на кусок, который точно не перекроется и т.п. Вариант простой, но не всегда надежный. Порой не удается выделить “чистый” кусок элемента, который “ну уж точно не изменится”.
В таких случаях можно подготовить различные представления паттернов (картинок) в соответствии с вариациями элемента UI и воспользоваться простыми обертками вокруг методов wait и click. Вот два примера для wait без претензий на красоту кода:
1) В качестве параметра метода выступает список картинок, разделенных точкой с запятой. Для простоты изложения время ожидания каждой картинки зашито внутри метода (30 секунд). Что происходит в случае трех картинок (трех модификаций элемента): ждем первую картинку 30 секунд, затем вторую картинку 30 секунд, затем третью картинку 30 секунд. При нахождении любой из картинок выходим с Success.
public boolean SWaitMultiple(String Args) throws Exception { String[] Argz = Args.split(";"); Boolean Result = false; String cwd = new File(".").getCanonicalPath(); for (int i = 0; i < Argz.length; i++) { Result = true; String Path = cwd + this.Images + Argz[i]; System.out.println("Sikuli wait: " + Path); Screen S = Sikuli.getScreen(); try { S.wait(Path, 30); } catch (FindFailed e) { System.out.println(e.toString()); Result = false; } if (Result) { return Result; // true } } return Result; // false }
2) В качестве первого параметра задается общее время ожидания картинок (скажем, 60 секунд). В течение этого времени ждем по 5 секунд каждую картинку по очереди. В случае трех картинок: ждем первую картинку 5 секунд, потом вторую 5 секунд, потом третью 5 секунд. И так 4 цикла (3*5*4=60). При нахождении любой из картинок выходим с Success.
public boolean SWaitMultipleV2(String Args) throws Exception { String[] Argz = Args.split(";"); int WaitTotal = Integer.parseInt(Argz[0]); int NumberOfImages = Argz.length - 1; int WaitImage = 5; // how many seconds we are going to wait each image in every iteration. int HowMuchLoop = (int) WaitTotal/(NumberOfImages*WaitImage); Boolean Result = false; String cwd = new File(".").getCanonicalPath(); System.out.println("WaitTotal: no more than " + WaitTotal + " sec."); System.out.println("Wait each image " + WaitImage + " sec for " + HowMuchLoop + " times."); for (int j = 0; j < HowMuchLoop; j++) { for (int i = 1; i <= NumberOfImages; i++) { Result = true; String Path = cwd + this.Images + Argz[i]; System.out.println("Sikuli wait: " + Path); Screen S = Sikuli.getScreen(); try { S.wait(Path, WaitImage); } catch (FindFailed e) { System.out.println(e.toString()); Result = false; } if (Result) { return Result; // true } } } return Result; // false }
Подобные обертки можно сделать и для click.
Запуск тестов в свернутой RDP-сессии
При запуске автотестов в свернутой RDP-сесии движок Sikuli “перестает” находить элементы графического интерфейса, поскольку при сворачивании сессии операционная система переходит в “неграфический” режим. Чтобы избежать такого перехода и работать с UI в полный рост, нужно на машине, с которой открывается RDP-сессия, добавить в ключ реестра HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client или HKEY_LOCAL_MACHINE\Software\Microsoft\Terminal Server Client DWORD-значение RemoteDesktop_SuppressWhenMinimized, равное 2 (подробности).
Всего доброго.