Pull to refresh

Частный случай использования Sikuli для решения проблемы в Facebook

Reading time 3 min
Views 6K
Некоторое время назад Facebook стал использовать решение основанное на NFS для хранения фотографий пользователей. Оно помогает справляться с напором в около 220 миллионов новых файлов занимающих 25TB каждую неделю и в часы пик раздающее более 550 тысяч изображений в секунду [1]. Максимальное количество файлов загружаемых в один альбом было увеличено с 60 до 200 на радость пользователям.

Наличие настроек приватности и то обстоятельство, что свободное место на Picasa благополучно было съедено шедеврами прошлых лет, подтолкнуло меня и некоторых знакомых к попытке использования Facebook в качестве фотохранилища.

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


Суть проблемы


Replication scenario был таким:
  • Используя форму загрузки с помощью drag-and-drop вбрасываем фотографии в новый альбом в количестве превышающем 200.
  • После загрузки двух сотен фотографий процесс прерывается сообщением об ошибке.
  • Попытка удалить альбом через «Edit Album»-«Delete Album» завершается ошибкой.
  • Удаление фотографии через «Edit Album»-«Edit Photos»-«Delete»-«Save changes» также не работает.

Bug Report был отправлен более месяца тому назад, и на момент написания статьи еще не потерял своей актуальности, судя по опыту других пользователей.

Поиск решения и реализация


Единственным найденным методом удаления фотографий из альбома в вышеописанном состоянии оказалось использование ссылки «Delete This Photo» в окне просмотра. Удалять вручную 200 фотографий таким образом — занятие не из веселых.

Хорошие статьи zodiak [2] и KL7 [3] вдохновили на использование Sikuli.

Кратко Sikuli можно описать как визуальную технологию для автоматизации графических пользовательских интерфейсов с использованием изображений (снимков экрана). Текущая реализация Sikuli включает Sikuli Script — API визальных сценариев для Jython и Sikuli IDE — интегрированную среду разработки для написания скриптов с использованием скриншотов. С помощью Sikuli Script можно автоматизировать все что вы видите на экране без использования внутренних API. Можно программно контролировать web страницы, приложения запущенные в Windows/Linux/Mac OS X и даже приложения iPhone запущенные в эмуляторе.

Неожиданно простой скрипт автоматизации действий был «собран» и отлажен в Sikuli GUI в течение 15 минут, большая часть из которых ушла на ознакомление с документацией и поиски оптимальных визуальных паттернов уникально характеризующих элементы web страниц Facebook.

Source Code Screenshot

Скриншот приведен из-за своебразности синтаксиса Sikuli, включающего графику в исходниках.

Обратите внимание на 11 строку в которой имеется верхняя часть рамки картинки и пустое место слева, присутствующее только на фотографиях альбома, расположенных слева. Следует отметить, что поиск и распознавание паттернов на экране Sikuli осуществляет начиная с верхнего левого угла, таким образом в нашем случае в альбоме выбирается первая верхняя картинка слева.

Функция щелчка мыши на найденном изображение click() осуществляет нажатие в геометрическом центре заданной области. Увеличивая площадь искомого паттерна в скрипте можно снизить вероятность ошибочных распознований на схожих элементах интерфейса.

Документация также подсказывает, что для увеличения быстродействия скрипта можно ипользовать точную настройку параметра MinTargetSize:

from org.sikuli.script.natives import Vision

Vision.setParameter("MinTargetSize", 6) # Меньшее значение, например, 6 - увеличивает скорость обработки.
Vision.setParameter("MinTargetSize", 18) # Большее значиение,  например 18 - увеличивает надежность.


Демонстрация работы



Английские титры вставлены ради людей не владеющих великим и могучим.

Скачать скрипт можно тут.
NB! Скорее всего, придется изменить имя браузера, сочетания клавиш и время ожидания между коммандами под вашу среду.

Интересно, из GUI скрипты на диск сохраняются в папках или zip-архивах (при экспорте в исполняемый формат) с вложенными *.png картинками, исходником на python и html-страницей со встроенным CSS для подсветки кода, при открытии которой в броузере отображается код со вложенной графикой.

Заключение


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

Узнать больше, скачать и установить Sikuli для Linux, Windows и Mac OS X можно на официальном сайте проекта http://sikuli.org.
Tags:
Hubs:
+28
Comments 5
Comments Comments 5

Articles