monkeyrunner问题。 java.lang.ClassCastException:当使用sameAs()方法时

时间:2011-05-23 11:14:10

标签: monkeyrunner

我从源代码构建SDK。 我想使用以下脚本:

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

请帮忙。

6 个答案:

答案 0 :(得分:3)

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)

答案 1 :(得分:1)

SDKTools Revision 12存在同样的问题。

更新到SDKTools第15版为我解决了这个问题。

答案 2 :(得分:0)

抱歉这个问题。此更改应解决问题:

https://review.source.android.com/#/c/25618/

答案 3 :(得分:0)

我在其他地方遇到过类似的问题。而不是img_1.sameAs(img,1)尝试img_1.sameAs(img,1.0)。 sameAs()函数采用浮点值。它应该没关系,因为它是python ...但它是Jython - 一切都是最糟糕的python和java在一个地方; - )

答案 4 :(得分:0)

sameAs工作正常,直到您将图像文件移动到其他文件夹并再次加载它。奇怪的错误......

稍后编辑: 我想我已经到底了。问题似乎是MonkeyRunner.loadImageFromFile()在文件名不是有效文件名时没有给出错误。

例如,MonkeyRunner.loadImageFromFile("d:\p.png")之类的内容可以正常使用,但MonkeyRunner.loadImageFromFile("d:\t.png")之类的内容无效。原因很简单:\t是一个特殊的序列。

解决方案是使用\\\/作为文件夹分隔符。

答案 5 :(得分:0)

当我使用sameAs()时,我也遇到了类似的问题。我的问题是由三个原因造成的:

  1. 两个图像的分辨率不同,因此sameAs函数在运行时会中断。

  2. 图片路径错误。即使我使用了错误的路径,loadImageFromFile()也从未向我们提及过。所以我们应该确定这条路是否正确。

  3. SDK版本不佳。就我而言,我使用了SDK_r23。