iPhoneアプリケーションのUIを変更するたびに新しいスクリーンショットを撮るのがうんざりです。シミュレータでバイナリを読み込むためにスクリプト/プログラム/何でも実行できたら、スクリーンショットをいくつか取ることができます。iPhone Simulatorでスクリーンショットを自動化しますか?
解決策は任意の言語にすることができます...それは私にとって重要ではありません。
ありがとうございます!
iPhoneアプリケーションのUIを変更するたびに新しいスクリーンショットを撮るのがうんざりです。シミュレータでバイナリを読み込むためにスクリプト/プログラム/何でも実行できたら、スクリーンショットをいくつか取ることができます。iPhone Simulatorでスクリーンショットを自動化しますか?
解決策は任意の言語にすることができます...それは私にとって重要ではありません。
ありがとうございます!
iPhone SDK 4では、GUIテストを自動化でき、スクリーンショットを取ることができます。
基本的には、Javascriptスクリプトを作成し、Instrument(Automationテンプレートを使用)をデバイス上で実行してUIをテストし、データ、スクリーンショットなどを記録したり、壊れた場合に警告することができます。
参考資料は見つかりませんでしたが、UIA*
クラス(UIAElement
など)のSDK参照ライブラリを検索しました。 WWDC、iPhoneシミュレータ内部セッション306
Appleの参考資料:https:/ /developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Built-InInstruments/Built-InInstruments.html#//apple_ref/doc/uid/TP40004652-CH6-SW75 –
プライベート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
の内側にそれを包むようにしてください。
私は同じ希望を持っています。すべての手動作業を必要とせずに、アプリ内のいくつかの画面からスクリーンショットを保存できるようにしたい。私はまだそこにいませんが、私は始めました。
考え方は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
はそれを試してみる:
はあなたのコード
にいくつかのNSLog文を追加します。$ tail -f -n0 /var/log/system.log | ./grab.py
あなたはgrab.pyプログラム
が現れてスクリーンショットを見てください、あなたのアプリで遊んでみてください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)は、コマンドラインから動作します。だから代わりにスクリーンキャプチャを使用して、代わりにダウンロードして使用してください。これでプロセスは完全に自動化されました。
このテクニックの大きな問題の1つは、仕事をするにはレンタルスクリーンが必要だということです。私は自分の開発を外部モニターなしで15インチのMBPで行います。このツールはiPadサイズのスクリーンショットをキャプチャできません。画面を大きくすることなくこれを自動化する方法についてのアドバイス – radven
からこれをデモ動画もあります
、「コピー画面」のメニュー項目があります。コントロールを押したままにすると、編集メニューの[コピー]メニュー項目が置き換えられます。 キーストロークは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
あなたはそれを取得しない場合は、コメントしてください...
あなたはまたにアプリケーションをキャプチャするいくつかの画面を使用する場合がありますSimulatorの画面でビデオをキャプチャします。
私はJingアプリをたくさん使用しています。
あなたはシミュレータ言語と、自動的にデバイスの種類を変更自動化に興味があるなら私も...クライアントにアプリケーションを提示したビデオを送信するために
を、それを使用し、私はそれを行ういくつかのスクリプトを開発しました:http://github.com/toursprung/iOS-Screenshot-Automator
私はデバイスからこれを行うための答えも聞きたいと思います。 –