проблема обезьяны. java.lang.ClassCastException: при использовании метода sameAs () - PullRequest
3 голосов
/ 23 мая 2011

Я строю 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 ]

3 голосов
/ 10 августа 2011

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'

Обновление: 27 октября 2011 г .: сравнение части снимка

Согласно комментарию Кациулы, это код для удаления строки состояния из снимка:

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 голос
/ 04 ноября 2011

У меня та же проблема с SDKTools Revision 12.

Обновление до SDKTools Revision 15 решило эту проблему для меня.

0 голосов
/ 01 февраля 2015

Я также столкнулся с подобной проблемой, когда использовал sameAs().Моя проблема вызвана тремя причинами:

  1. Два изображения имеют разное разрешение, поэтому функция sameAs прерывается во время выполнения.

  2. путь изображения неправильный.Несмотря на то, что я использовал неправильный путь, loadImageFromFile() никогда не упоминает его нам.Поэтому мы должны определить, является ли этот путь правильным или нет.

  3. Плохая версия SDK.В моем случае я использовал SDK_r23.

0 голосов
/ 14 февраля 2012

sameAs работает нормально, пока вы не переместите файл изображения в другую папку и не загрузите его снова. Странная ошибка ...

Позднее редактировать: Я думаю, что я дошел до сути этого. Кажется, проблема в том, что MonkeyRunner.loadImageFromFile() не выдает ошибку, если имя файла не является допустимым.

Например, что-то вроде MonkeyRunner.loadImageFromFile("d:\p.png") будет работать нормально, а что-то вроде MonkeyRunner.loadImageFromFile("d:\t.png") не будет работать. Причина довольно проста: \t - это особая последовательность.

Решение заключается в использовании \\\ или / в качестве разделителей папок.

0 голосов
/ 30 августа 2011

У меня была похожая проблема в другом месте.Вместо img_1.sameAs (img, 1) попробуйте img_1.sameAs (img, 1.0).Функция sameAs () принимает значение с плавающей запятой.Это не должно иметь значения, поскольку это Python ... но это Jython - все худшее из Python и Java в одном месте; -)

0 голосов
/ 22 августа 2011

Извините за вопрос. Это изменение должно решить проблему:

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

...