нулевой корневой узел, возвращаемый UiTestAutomationBridge с помощью uiautomator

У меня проблема с запуском uiautomator в моем скрипте Python (аналогичный скрипт оболочки работает нормально). Я использую следующий метод для удобства:

    import subprocess

    def host_exec(cmd):
      p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
      out= p.communicate()
      return out

затем я использую комбинацию

    host_exec("path_to_adb shell uiautomator dump /sdcard/dump.xml")
    host_exec("path_to_adb pull /sdcard/dump.xml ./dump.xml")
    --read file here--
    host_exec("path_to_adb shell rm /sdcard/dump.xml")
    host_exec("rm ./dump.xml")

Я часто использую это, и первые 1-2 прогона обычно работают, после чего, похоже, время от времени происходит сбой в строке 1 (создание dump.xml), что дает код ошибки.

    ERROR: null root node returned by UiTestAutomationBridge.

Я просмотрел UiTestAutomationBridge.java (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/accessibilityservice/UiTestAutomationBridge.java) и мне кажется, что причина в том, что таймаут, который разработчики поставили на строку 65, то есть то достаточный, то недостаточный для корректного формирования бриджа. (поправьте меня если я ошибаюсь.

Что меня действительно беспокоит, так это то, что я использую один и тот же код почти неделю, и я впервые получил ошибку только сегодня утром, а теперь это происходит почти каждый раз. Я проверил, закрываю ли файл после его прочтения, удаляю файлы перед сбросом и копированием новых файлов, и я пытался использовать time.sleep(10) до и после каждой команды, но все равно не идет. Я запустил команду «время» из командной строки для своего сценария оболочки, который еще не дал сбоев ни разу, и весь процесс занимает около 2 секунд, поэтому 10 секунд должно быть достаточно для всего, что увязает в разобраться.


person MishaP    schedule 04.06.2013    source источник


Ответы (2)


Я столкнулся с почти такой же проблемой, когда отлаживал https://github.com/xiaocong/uiautomator. Я не знаю, почему я всегда получал исключение после того, как я несколько раз запускал и убивал uiautomator, даже перезагрузка устройства не могла решить эту проблему.

Единственный способ решить эту проблему, который я пробовал, - это сбросить устройство до заводских настроек в настройках.

person Xiaocong    schedule 26.08.2013

Проблема часто проявляется между диалогами при загрузке (возможно, когда появляется диалоговое окно «приложение перестало отвечать»). Другие, на которые следует обратить внимание, это could not get idle state и просто closed.

Все это указывает на неидеальное состояние пользовательского интерфейса телефона, которое часто можно решить только неинтуитивными методами. Возможно, быстро обновляющийся textView не позволяет пользовательскому интерфейсу заблокировать состояние простоя 1000 мс, и вам нужно убить приложение или щелкнуть в том месте, где, как вы знаете, находится стрелка вверх, без явной ссылки на дамп XML на этот раз.

В любом случае это требует, чтобы вы сделали шаг назад и подумали. Я могу сказать вам, что обычно нулевой корневой узел разрешается сам по мере загрузки активности, поэтому вам нужно только ввести цикл while, пока не будет выполнено какое-то условие (как это в конечном итоге достаточно надежно). Это условие, как я предлагаю вам сделать, состоит в том, что выходная строка начинается с UI hierchary dumped to:

Точно так же xml не всегда идеален, может отсутствовать знак равенства, кавычка или скобка, но опять же применяется тот же принцип. Возьмите новый дамп, и все будет хорошо.

person gamesguru    schedule 22.05.2018