3

我从源代码构建 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

请帮忙。

4

6 回答 6

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)
于 2011-08-10T17:25:46.650 回答
1

SDKTools Revision 12 有同样的问题。

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

于 2011-11-04T09:49:59.933 回答
0

sameAs工作正常,直到您将图像文件移动到不同的文件夹并再次加载它。奇怪的虫子...

后来编辑: 我想我已经深入了解了。问题似乎MonkeyRunner.loadImageFromFile()是当文件名无效时没有给出错误。

例如,类似的东西MonkeyRunner.loadImageFromFile("d:\p.png")可以正常工作,但类似的东西MonkeyRunner.loadImageFromFile("d:\t.png")不起作用。原因很简单:\t就是一个特殊的序列。

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

于 2012-02-14T17:23:35.100 回答
0

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

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

于 2011-08-22T17:32:03.863 回答
0

我在其他地方也有类似的问题。代替 img_1.sameAs(img, 1) 尝试 img_1.sameAs(img, 1.0)。sameAs() 函数采用浮点值。没关系,因为它是 python ......但它是 Jython - 一个地方最糟糕的 python 和 java ;-)

于 2011-08-30T15:09:12.787 回答
0

我在使用的时候也遇到了类似的问题sameAs()。我的问题是由三个原因引起的:

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

  2. 图片路径不对。即使我走错了路,loadImageFromFile()也从来没有向我们提起过。所以我们应该判断这条路径是否正确。

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

于 2015-02-01T06:11:46.383 回答