У меня проблема с запуском 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 секунд должно быть достаточно для всего, что увязает в разобраться.