2009-09-01 2 views
26

iPhoneアプリケーションのUIを変更するたびに新しいスクリーンショットを撮るのがうんざりです。シミュレータでバイナリを読み込むためにスクリプト/プログラム/何でも実行できたら、スクリーンショットをいくつか取ることができます。iPhone Simulatorでスクリーンショットを自動化しますか?

解決策は任意の言語にすることができます...それは私にとって重要ではありません。

ありがとうございます!

+2

私はデバイスからこれを行うための答えも聞きたいと思います。 –

答えて

24

iPhone SDK 4では、GUIテストを自動化でき、スクリーンショットを取ることができます。

基本的には、Javascriptスクリプトを作成し、Instrument(Automationテンプレートを使用)をデバイス上で実行してUIをテストし、データ、スクリーンショットなどを記録したり、壊れた場合に警告することができます。

参考資料は見つかりませんでしたが、UIA*クラス(UIAElementなど)のSDK参照ライブラリを検索しました。 WWDC、iPhoneシミュレータ内部セッション306

+1

Appleの参考資料:https:/ /developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Built-InInstruments/Built-InInstruments.html#//apple_ref/doc/uid/TP40004652-CH6-SW75 –

6

プライベート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の内側にそれを包むようにしてください。

+0

メソッドUIGetScreenImageを動作させることができませんでした。 –

+0

エラーは何ですか? – rpetrich

+0

UIGetScreenImageがシミュレータで動作しなくなったようです:(最後に2.xを試してみました)手動の画面キャプチャの基本を含むようにコードを更新しました...ポートレートウィンドウではうまく動作しているようですあなたがそれを改善したら、私の答えを更新してください:) – rpetrich

12

私は同じ希望を持っています。すべての手動作業を必要とせずに、アプリ内のいくつかの画面からスクリーンショットを保存できるようにしたい。私はまだそこにいませんが、私は始めました。

考え方はtail /var/log/system.logです。ここではNSLogステートメントの出力が表示されます。出力をPythonプログラムにパイプします。 pythonプログラムはstdinからすべての行を読み込み、その行が特定のパターンと一致するとscreencaptureを呼び出します。

「XX。MAINMENU YY.png」という名前のスクリーンショットは、それが呼び出されるたびに作成されるようになります
NSLog(@"screenshot mainmenu.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. あなたはgrab.pyプログラム

  4. を始めた場所

  5. が現れてスクリーンショットを見てください、あなたのアプリで遊んでみてくださいSimulatorであなたのiPhoneアプリを起動し

グラブ。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 Simulator Cropper(http://www.curioustimes.de/iphonesimulatorcropper/index.html)は、コマンドラインから動作します。だから代わりにスクリーンキャプチャを使用して、代わりにダウンロードして使用してください。これでプロセスは完全に自動化されました。

+2

このテクニックの大きな問題の1つは、仕事をするにはレンタルスクリーンが必要だということです。私は自分の開発を外部モニターなしで15インチのMBPで行います。このツールはiPadサイズのスクリーンショットをキャプチャできません。画面を大きくすることなくこれを自動化する方法についてのアドバイス – radven

7

からこれをデモ動画もあります

、「コピー画面」のメニュー項目があります。コントロールを押したままにすると、編集メニューの[コピー]メニュー項目が置き換えられます。 キーストロークは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 

あなたはそれを取得しない場合は、コメントしてください...

0

あなたはまたにアプリケーションをキャプチャするいくつかの画面を使用する場合がありますSimulatorの画面でビデオをキャプチャします。

私はJingアプリをたくさん使用しています。

あなたはシミュレータ言語と、自動的にデバイスの種類を変更自動化に興味があるなら私も...クライアントにアプリケーションを提示したビデオを送信するために

関連する問題