Я запускаю автоматическое тестирование с использованием эмулятора Android, управляющего приложением с помощью сценария Monkey, написанного на Python. Сценарий копирует файлы на эмулятор, нажимает кнопки в приложении и реагирует в зависимости от действий, которые запускает программное обеспечение во время его работы. Сценарий должен запускать цикл несколько тысяч раз, поэтому у меня есть это в цикле, чтобы запустить инструмент adb, чтобы скопировать файлы, запустить действия и посмотреть, как реагирует программное обеспечение, вызвав метод getProperty на устройстве с помощью параметр «am.current.comp.class». Так вот это очень упрощенная версия моего сценария:Android MonkeyRunner иногда выдает исключения
for target in targets:
androidSDK.copyFile(emulatorName, target, '/mnt/sdcard')
# Runs the component
device.startActivity(component='com.myPackage/com.myPackage.myactivity')
while 1:
if device.getProperty('am.current.comp.class') == 'com.myPackage.anotheractivity':
time.sleep(1) # to allow the scree to display the new activity before I click on it
device.touch(100, 100, 'DOWN_AND_UP')
# Log the result of the operation somewhere
break
time.sleep(0.1)
(androidSDK небольшой класс я написал, что оборачивает некоторые вспомогательные функции для копирования и удаления файлов с помощью ADB инструмента).
В случаях сценарий аварий с одним из ряда исключений, например (я уезжаю из полной трассировки стека)
[com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnresponsiveException
или
[com.android.chimpchat.adb.AdbChimpDevice] Unable to get variable: am.current.comp.class
[com.android.chimpchat.adb.AdbChimpDevice]java.net.SocketException: Software caused connectionabort: socket write error
Я прочитал, что иногда подключение сокета к устройству становится нестабильным и может потребоваться перезапуск (полезный сервер запуска и сервер adb kill-server).
Проблема, с которой я сталкиваюсь, заключается в том, что инструменты бросают исключения Java (Monkey работает в Jython), но я не уверен, как они могут быть захвачены из моего сценария Python. Я хотел бы иметь возможность определить точную причину сбоя внутри сценария и восстановить ситуацию, чтобы я мог продолжить свои итерации (например, восстановить соединение, например, повторить инициализацию моего устройства с помощью другого вызова для MonkeyRunner.waitForConnection достаточно?).
Любые идеи?
Большое спасибо, Alberto
EDIT. Я думал, что я упомяну, что я обнаружил, что можно поймать Java-специфических исключений в сценарии Jython, если кто-нибудь это нужно:
from java.net import SocketException
...
try:
...
except(SocketException):
...
Не уверен, точное как это происходит в Jython, но в Python возможно переопределить sys.excepthook и получить информацию о неперехваченных исключениях. Дайте мне знать, если это будет полезно в вашем случае, и я отправлю его в качестве ответа. http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python/6234491#6234491 – Jacinda
Это звучит очень интересно, хотя я не работаю над этой областью кода уже несколько месяцев, ve забыли все это :-) –
Прохладный. Дайте мне знать, работает ли поведение переопределения аналогично CPython или нет. – Jacinda