2011-05-23 54 views
2

我從源代碼構建SDK。 我想用下面的腳本:monkeyrunner問題。 java.lang.ClassCastException:當使用sameAs()方法

img=MonkeyRunner.loadImageFromFile(path='/home/alsu/monkeyrunner/device.png') 
img_1=device.takeSnapshot() 

img_1.sameAs(img, 1) 

但出現此錯誤:

File "/home/semc/monkey/out/host/linux-x86/sdk/android-sdk_eng.semc_linux-x86/tools/test.py", line 23, in <module> 
    if img_1.sameAs(img,1): 
    at com.android.monkeyrunner.MonkeyImage.sameAs(MonkeyImage.java:138) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 

java.lang.ClassCastException: java.lang.ClassCastException: org.python.core.PySingleton cannot be cast to com.android.monkeyrunner.core.IMonkeyImage 

請幫助。

+0

如果您使用Android SDK中的monkeyrunner運行腳本,該怎麼辦? – 2011-05-24 00:22:00

+0

我在SDKTools修訂版本12中使用monkeyrunner時遇到了同樣的錯誤。在調用之前,我打印每個對象並將它們分別標識爲MonkeyImages。 – cdhabecker 2011-08-10 03:31:50

回答

2

MonkeyImage.sameAs()剛剛壞掉 - 無論你傳遞給它什麼都沒關係,你會得到那個錯誤。

解決方法:使用convertToBytes():

new_snap = device.takeSnapshot() 
old_snap = MonkeyRunner.loadImageFromFile(control_dir + '/' + test_name + '.png') 
#if new_snap.sameAs(old_snap) == True: 
new_bytes = new_snap.convertToBytes('png') 
old_bytes = old_snap.convertToBytes('png') 
if new_bytes == old_bytes: 
    print 'Test ' + test_name + ' PASSED' 
else: 
    print 'Test ' + test_name + ' FAILED' 

更新:2011年10月27日:快照

的比較部分按kaciula的評論,這是代碼刪除狀態從快照欄中刪除:

device = MonkeyRunner.waitForConnection(emulator) 
width = int(device.getProperty('display.width')) 
height = int(device.getProperty('display.height')) 
density = device.getProperty('display.density') 
if density == .75: 
    density_dir = 'ldpi' 
    snap_rect = 0, 19, width, height - 19 
elif density == 1.5: 
    density_dir = 'hdpi' 
    snap_rect = 0, 38, width, height - 38 
elif density == 2.0: 
    density_dir = 'xhdpi' 
    snap_rect = 0, 50, width, height - 50 
else: 
    density_dir = 'mdpi' 
    snap_rect = 0, 25, width, height - 25 
new_snap = device.takeSnapshot() 
new_snap = new_snap.getSubImage(snap_rect) 
+0

2個截圖很少相同。例如,時鐘值改變。你對我們如何使用這種解決方法有相似性百分比有任何想法嗎? – 2011-10-24 07:09:54

+1

@kaciula添加代碼以刪除狀態欄。投票並告訴你的朋友。 :-) – cdhabecker 2011-10-28 06:31:58

0

我在其他地方也有類似的問題。而不是img_1.sameAs(img,1)試試img_1.sameAs(img,1.0)。 sameAs()函數採用浮點值。它不應該的問題,因爲它是蟒蛇...但它是Jython的 - 一切最壞的在一個地方;-)

1

Python和Java都遵守SDKTools修訂12.

更新到SDKTools同樣的問題第15版爲我解決了這個問題。

0

sameAs工作得很好,直到您將圖像文件移動到不同的文件夾並再次加載。奇怪的bug ...

後來編輯: 我想我已經到了這個底部。問題似乎是MonkeyRunner.loadImageFromFile()在文件名不是有效的時候沒有提供錯誤。

例如,像MonkeyRunner.loadImageFromFile("d:\p.png")這樣的東西可以正常工作,但是像MonkeyRunner.loadImageFromFile("d:\t.png")這樣的東西將不起作用。原因很簡單:\t是一個特殊的序列。

解決方法是使用\\\/作爲文件夾分隔符。

0

我在使用sameAs()時也遇到了類似的問題。我的問題是由三個原因造成的:

  1. 兩個圖像是不同的分辨率,所以在運行時sameAs功能中斷。

  2. 圖片路徑錯誤。即使我使用了錯誤的路徑,loadImageFromFile()也從未向我們提及過。所以我們應該確定這條路是否正確。

  3. 可憐的SDK版本。就我而言,我使用了SDK_r23。