Автоматизировать Снимки экрана на iPhone Simulator?

Некоторое время я работал на проект распределенных вычислений PEATE, который разрабатывал систему для вычисления крупного масштаба, большой объем атмосферные данные. Система имела три части к нему: менеджер данных, планировщик и компонент осуществления алгоритма. Могло быть любое количество любого из этих компонентов, все сделанные через веб-сервисы, но что оно допускало, был, чтобы различные исследователи выполнили произвольные задания против произвольных данных и также позволили, чтобы различные механизмы планирования были включены как измененные требования.

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

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

27
задан JP Richardson 1 September 2009 в 04:40
поделиться

5 ответов

С помощью iPhone SDK 4 вы можете автоматизировать тесты графического интерфейса пользователя и делать снимки экрана за вас.

По сути, вы пишете сценарий Javascript, а затем инструменты (с использованием шаблона автоматизации) могут запускать его на устройстве для тестирования пользовательского интерфейса и могут регистрировать данные, снимки экрана и т. Д., А также могут предупреждать, если что-то сломано.

Мне не удалось найти справочное руководство по нему, но в справочной библиотеке SDK найдите классы UIA * (например, UIAElement ).

Есть также видео, демонстрирующее это с WWDC, сеанс 306.

25
ответ дан 28 November 2019 в 05:06
поделиться

Частный UIGetScreenImage (void) API может использоваться для захвата содержимого экрана:

CGImageRef UIGetScreenImage();
void SaveScreenImage(NSString *path)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    CGImageRef cgImage = UIGetScreenImage();
    void *imageBytes = NULL;
    if (cgImage == NULL) {
        CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
        imageBytes = malloc(320 * 480 * 4);
        CGContextRef context = CGBitmapContextCreate(imageBytes, 320, 480, 8, 320 * 4, colorspace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Big);
        CGColorSpaceRelease(colorspace);
        for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
            CGRect bounds = [window bounds];
            CALayer *layer = [window layer];
            CGContextSaveGState(context);
            if ([layer contentsAreFlipped]) {
                CGContextTranslateCTM(context, 0.0f, bounds.size.height);
                CGContextScaleCTM(context, 1.0f, -1.0f);
            }
            [layer renderInContext:(CGContextRef)context];
            CGContextRestoreGState(context);
        }
        cgImage = CGBitmapContextCreateImage(context);
        CGContextRelease(context);
    }
    NSData *pngData = UIImagePNGRepresentation([UIImage imageWithCGImage:cgImage]);
    CGImageRelease(cgImage);
    if (imageBytes)
        free(imageBytes);
    [pngData writeToFile:path atomically:YES];
    [pool release];
}

Обязательно заключите его в #ifdef , поэтому он не появляется в сборке выпуска.

6
ответ дан 28 November 2019 в 05:06
поделиться

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

Идея состоит в том, чтобы отслеживать /var/log/system.log, куда помещаются выходные данные операторов NSLog. Я передаю вывод в программу на Python. Программа python считывает все строки из стандартного ввода и, когда строка соответствует определенному шаблону, вызывает снимок экрана.

NSLog(@"screenshot mainmenu.png");

Это приведет к созданию снимка экрана с именем «XX. Mainmenu YY.png» при каждом его вызове. XX - номер скриншота с момента запуска программы. YY - номер скриншота главного меню.

Я даже добавил несколько ненужных функций:

NSLog(@"screenshot -once mainmenu.png");

Это сохранит "XX. Mainmenu.png" только один раз.

NSLog(@"screenshot -T 4 mainmenu.png");

Это сделает снимок экрана с задержкой в ​​4 секунды.

После запуска приложения с правильным ведением журнала могли быть созданы снимки экрана со следующими именами:

00. SplashScreen.png
01. MainMenu 01.png
03. StartLevel 01.png
04. GameOver 01.png
05. MainMenu 02.png

Попробуйте:

  1. Добавьте несколько операторов NSLog в свой код

  2. $ tail -f -n0 / var / log / system.log | ./grab.py

  3. Запустите приложение iPhone в Симуляторе

  4. Поэкспериментируйте с приложением

  5. Посмотрите на снимки экрана, показывающие, где вы запустили программу grab.py

grab.py:

#!/usr/bin/python

import re
import os
from collections import defaultdict

def screenshot(filename, select_window=False, delay_s=0):
    flags = []
    if select_window:
        flags.append('-w')
    if delay_s:
        flags.append('-T %d' % delay_s)
    command_line = 'screencapture %s "%s"' % (' '.join(flags), filename)
    #print command_line
    os.system(command_line)

def handle_line(line, count=defaultdict(int)):
    params = parse_line(line)
    if params:
        filebase, fileextension, once, delay_s = params
        if once and count[filebase] == 1:
            print 'Skipping taking %s screenshot, already done once' % filebase
        else:
            count[filebase] += 1
            number = count[filebase]
            count[None] += 1
            global_count = count[None]
            file_count_string = (' %02d' % number) if not once else ''

            filename = '%02d. %s%s.%s' % (global_count, filebase, file_count_string, fileextension)
            print 'Taking screenshot: %s%s' % (filename, '' if delay_s == 0 else (' in %d seconds' % delay_s))
            screenshot(filename, select_window=False, delay_s=delay_s)

def parse_line(line):
    expression = r'.*screenshot\s*(?P<once>-once)?\s*(-delay\s*(?P<delay_s>\d+))?\s*(?P<filebase>\w+)?.?(?P<fileextension>\w+)?'
    m = re.match(expression, line)
    if m:
        params = m.groupdict()
        #print params
        filebase = params['filebase'] or 'screenshot'
        fileextension = params['fileextension'] or 'png'
        once = params['once'] is not None
        delay_s = int(params['delay_s'] or 0)
        return filebase, fileextension, once, delay_s
    else:
        #print 'Ignore: %s' % line
        return None

def main():
    try:
        while True:
            handle_line(raw_input())
    except (EOFError, KeyboardInterrupt):
        pass

if __name__ == '__main__':
    main()

Проблемы с этой версией:

Если вы хотите сделать снимок экрана только окна симулятора iPhone, вы должны щелкать окно симулятора iPhone для каждого снимка экрана. screencapture отказывается захватывать отдельные окна, если вы не желаете с ним взаимодействовать, - странное дизайнерское решение для инструмента командной строки.

Обновление: Теперь обрезка симулятора iPhone (на http://www.curioustimes.de/iphonesimulatorcropper/index. html ) работает из командной строки. Поэтому вместо использования встроенного снимка экрана скачайте и используйте его. Так что теперь процесс полностью автоматический.

12
ответ дан 28 November 2019 в 05:06
поделиться

Внутри iPhone Simulator есть пункт меню «Копировать экран». Он заменяет пункт меню «Копировать» в меню редактирования, когда вы удерживаете нажатой клавишу «Control». Нажатие клавиши - Ctrl-Cmd-C. Простой AppleScript может скопировать снимок экрана и сохранить его. Что-то вроде (у меня это сработало, даже если оно взломано):

tell application "iPhone Simulator" to activate
tell application "System Events"
    keystroke "c" using {command down, control down}
end tell
tell application "Preview" to activate
tell application "System Events"
    keystroke "n" using {command down}
    keystroke "w" using {command down}
    delay 1
    keystroke return
    delay 1
    keystroke "File Name"
    keystroke return
end tell

Если вы не поняли, прокомментируйте ...

7
ответ дан 28 November 2019 в 05:06
поделиться

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

Я часто использую приложение Jing.

Я даже использую его для отправки видео, которое представляет приложение клиентам ...

0
ответ дан 28 November 2019 в 05:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: