2 место Автоматизация Android без посредников. Часть 1.

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Добрый день.
Не подскажете,в чём может быть проблема (на скрине - ошибка).Всё установил,настроил- и вот-застрял.

Посмотреть вложение 59903
Вот здесь у тебя должен отобразиться порт, если всё ок. Он не может подключиться, потому что не видит порта для подключения.
59924
 
  • Спасибо
Реакции: dsertr21

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
Посмотреть вложение 59923

Надеюсь у тебя порт определялся изначально. Вообще я бы перезагрузил зенку и попробовал заново запустить.
Спасибо! Действительно-элементарно! ))
Разобрался я с этим всем делом.А проблема была до смешного банальна)-так торопился посмотреть как-что работает,что попросту забыл включить сначала Nox...))
Скажу честно-это одна из тех лучших и полезных (и достаточно простых для понимания) статей на форуме! Браво!
Спасибо за помощь!
 
  • Спасибо
Реакции: dsertr21 и WLDN

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
У меня возник вопрос поповоду поиска данных по resource-id (на скрине обведено). Установил-запустил Телеграм. вошёл в аккаунт-перепонажимал все кнопки-resource-id ничего не выдало (на скрине-пусто).Как в таком случае быть?
Screenshot_2.jpg
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
У меня возник вопрос поповоду поиска данных по resource-id (на скрине обведено). Установил-запустил Телеграм. вошёл в аккаунт-перепонажимал все кнопки-resource-id ничего не выдало (на скрине-пусто).Как в таком случае быть?
Посмотреть вложение 59954
В таком случае необходимо собирать дерево XPath. То есть, к примеру:

//node/node[@index='0']/node[@index='0' and class='android.widget.FrameLayout']

Чем длиннее дерево и подробнее нода, тем с большей вероятностью код найдет необходимые координаты.
Синтаксис можешь посмотреть в моей статье, там есть ссылка.

Альтернативный вариант поставить другую версию Телеграм, где прописаны resource-id
 
  • Спасибо
Реакции: bas2006, dsertr21 и Szerzs

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
В таком случае необходимо собирать дерево XPath. То есть, к примеру:

//node/node[@index='0']/node[@index='0' and class='android.widget.FrameLayout']

Чем длиннее дерево и подробнее нода, тем с большей вероятностью код найдет необходимые координаты.
Синтаксис можешь посмотреть в моей статье, там есть ссылка.

Альтернативный вариант поставить другую версию Телеграм, где прописаны resource-id
Не получается именно запустить Телеграм-нету resource-id .Кстати,при наводке на youtube тоже не показывает resource-id .Когда сам вручную запущу телеграм,resource-id уже при кликах на элементы показываются.Вот который из них выбрать,чтобы запустился телеграм? И если како-то из них подходит-как это записать? На худой конец-подошёл бы клик по координатам,но запись
var a = project.Context["ADB"];
adb shell input x y //тапнуть по координатам
не хочет запускать телеграм)
 

Вложения

Последнее редактирование:

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Вот который из них выбрать,чтобы запустился телеграм?
Внимательно изучи статью и тестовый шаблон. Там объясняется как запускать пакеты приложений через Activity.
 

morgansho

Client
Регистрация
18.11.2018
Сообщения
16
Благодарностей
4
Баллы
3
подскажите, может кто сталкивался с таким моментом, когда в UI Automator по тексту приложения кликаешь, то его UI Automator не видит (в строке text пусто). В одних приложениях всё видит, в других ничего ничего (речь конкретно о словах или тексте в приложении). Это какие-то защиты приложений или есть какое-то решение?
в моем понимании, если текст видно физически на экране, то его можно как-то спарсить)
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 820
Благодарностей
2 030
Баллы
113
Вот который из них выбрать,чтобы запустился телеграм?
через resource-id можно искать элементы на экране для клика например. Запустить приложение через него нельзя. Читайте статью внимательнее.
 
  • Спасибо
Реакции: WLDN

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
подскажите, может кто сталкивался с таким моментом, когда в UI Automator по тексту приложения кликаешь, то его UI Automator не видит (в строке text пусто). В одних приложениях всё видит, в других ничего ничего (речь конкретно о словах или тексте в приложении). Это какие-то защиты приложений или есть какое-то решение?
в моем понимании, если текст видно физически на экране, то его можно как-то спарсить)
Привет, я думаю проблема в русском тексте. Дампается XML с иероглифами из-за неподходящей кодировки. Об этой проблеме есть выше в комментариях и вариантах решения.
 

morgansho

Client
Регистрация
18.11.2018
Сообщения
16
Благодарностей
4
Баллы
3
Привет, я думаю проблема в русском тексте. Дампается XML с иероглифами из-за неподходящей кодировки. Об этой проблеме есть выше в комментариях и вариантах решения.
привет, спасибо, думал тоже об этом, но нет, английский и тд тоже не видит и не парсит.

как я понял дампать xml нужно командой "adb shell uiautomator dump /dev/tty" , в консоле мне выбивает в ответ "adb server version (36) doesn't match this client (41);". почитал за это, пишут, что связано возможно с путями "~/.android-sdk/platform-tools ".

а как пример моей проблемы с текстом, можете открыть тот же fb, который стандартный в ноксе сразу есть, там даже на первой странице UI Automator ничего не видит в плане какого-то текста.
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
привет, спасибо, думал тоже об этом, но нет, английский и тд тоже не видит и не парсит.

как я понял дампать xml нужно командой "adb shell uiautomator dump /dev/tty" , в консоле мне выбивает в ответ "adb server version (36) doesn't match this client (41);". почитал за это, пишут, что связано возможно с путями "~/.android-sdk/platform-tools ".

а как пример моей проблемы с текстом, можете открыть тот же fb, который стандартный в ноксе сразу есть, там даже на первой странице UI Automator ничего не видит в плане какого-то текста.
Теперь ясно, попробуй делать автоматизацию на старых версиях Nox, их adb не перебивают adb от SDK. Например 6.6.0.5.
 

dsertr21

Client
Регистрация
20.06.2016
Сообщения
17
Благодарностей
7
Баллы
3
Подскажите пожалуйста, как ввести больше одного слова в этой конструкции:
var a = project.Context["ADB"];

a.Text("ZennoLab"); //ввод текста
a.KeyEvent("66"); //Enter

Одно слово ZennoLab вводит в Ютуб, а два слова ZennoLab pro не вводит уже
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Подскажите пожалуйста, как ввести больше одного слова в этой конструкции:
var a = project.Context["ADB"];

a.Text("ZennoLab"); //ввод текста
a.KeyEvent("66"); //Enter

Одно слово ZennoLab вводит в Ютуб, а два слова ZennoLab pro не вводит уже
%s вместо пробела

можно сделать типо того: a.Text("ZennoLab pro").Replace(" ",@"%s");
 
  • Спасибо
Реакции: dsertr21

dsertr21

Client
Регистрация
20.06.2016
Сообщения
17
Благодарностей
7
Баллы
3
%s вместо пробела

можно сделать типо того: a.Text("ZennoLab pro").Replace(" ",@"%s");
Благодарю, работает, а вот такой символ "; )" как заменить? и где брать такие замены?) или это у вас в библиотеке так прописано?)
 
  • Спасибо
Реакции: WLDN

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Благодарю, работает, а вот такой символ "; )" как заменить? и где брать такие замены?) или это у вас в библиотеке так прописано?)
Имеется в виду вставка смайла?
Можно экранировать. Тоже самое для удобства использовать Replace

\;%s\)
 
  • Спасибо
Реакции: dsertr21

dsertr21

Client
Регистрация
20.06.2016
Сообщения
17
Благодарностей
7
Баллы
3
Также можно спарсить что-нибудь. Спарсим длительность видимых роликов (результат появится в списке шаблона):
Подскажите пожалуйста, как спарсить данные не в список, а в переменную?
 

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
3-й день пытаюсь запустить приложение) Всё получается,а вот с запуском затык).Нашёл я MainActivity и другие Activity-все перепробовал-срабатывает-но не запускает) Помогите пожалуйста разобраться).Самый лучший вариант был бы тап по координатам.Вот activity приложения (больше нет никаких):
org.thunderdog.challegram.MainActivity
org.thunderdog.challegram.ManageSpaceActivity
А вот скрины ui automator viewer :
 

Вложения

  • 121,5 КБ Просмотры: 235
  • 121,1 КБ Просмотры: 230

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Подскажите пожалуйста, как спарсить данные не в список, а в переменную?
Из списка кидать в переменную, если допустим список list, то элемент из списка list[0], где 0 - номер (индекс) элемента
 
  • Спасибо
Реакции: dsertr21

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
3-й день пытаюсь запустить приложение) Всё получается,а вот с запуском затык).Нашёл я MainActivity и другие Activity-все перепробовал-срабатывает-но не запускает) Помогите пожалуйста разобраться).Самый лучший вариант был бы тап по координатам.Вот activity приложения (больше нет никаких):
org.thunderdog.challegram.MainActivity
org.thunderdog.challegram.ManageSpaceActivity
А вот скрины ui automator viewer :
C#:
var a = project.Context["ADB"];

a.StartApp("org.thunderdog.challegram/org.thunderdog.challegram.MainActivity"); //запуск приложения

//a.StartApp("org.telegram.messenger/org.telegram.ui.LaunchActivity"); //запуск приложения
// в CMD получить наименование текущего окна, которое нужно вставить в этот запрос
// adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
 

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
Господи! Заработало ). Я точно этот же код ставил,но без 5-й строки-не запускало.
Преогромное спасибо!
 
  • Спасибо
Реакции: WLDN

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Подскажите пожалуйста, как спарсить данные не в список, а в переменную?
project.Variables["переменная"].Value = a.Parse("//node[@resource-id='com.google.android.youtube:id/duration' and @class='android.widget.TextView']", "text", 0, 5)[0];

Может быть что-то типо того, я уже не помню точно.
 
  • Спасибо
Реакции: dsertr21

ezotonal

Client
Регистрация
13.01.2014
Сообщения
819
Благодарностей
231
Баллы
43
При запуске приложения mail ru не работает uiautomatorviewer. То есть не удается сделать скрин )
 
Последнее редактирование:

radv

Client
Регистрация
11.05.2015
Сообщения
3 820
Благодарностей
2 030
Баллы
113

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93

ezotonal

Client
Регистрация
13.01.2014
Сообщения
819
Благодарностей
231
Баллы
43
При работе через либу в ответе получаю вместо русских букв кракозябры типа text="ÐгноÑиÑоваÑÑ Ð°Ð´ÑеÑа"
При этом если выполняю эту команду вручную через консоль, то получаю ответ в читаемом виде с русскими буквами.

Может какие то настройки нужно задать?

Пробовал задавать разную кодировку через параметр
AdbClient.Instance.ExecuteRemoteCommand(command, device, receiver, Encoding.GetEncoding(1251));
Русские буквы все равно не читаются.
В чем может быть причина?

C#:
string text = project.Variables["test"].Value; // в переменной Text
Encoding utf8 = Encoding.GetEncoding("ISO-8859-1");
Encoding win1251 = Encoding.GetEncoding("UTF-8");
byte[] utf8Bytes = win1251.GetBytes(text);
byte[] win1251Bytes = Encoding.Convert(win1251, utf8, utf8Bytes);
return win1251.GetString(win1251Bytes); //

Решил вопрос только последующей конвертацией
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
C#:
string text = project.Variables["test"].Value; // в переменной Text
Encoding utf8 = Encoding.GetEncoding("ISO-8859-1");
Encoding win1251 = Encoding.GetEncoding("UTF-8");
byte[] utf8Bytes = win1251.GetBytes(text);
byte[] win1251Bytes = Encoding.Convert(win1251, utf8, utf8Bytes);
return win1251.GetString(win1251Bytes); //

Решил вопрос только последующей конвертацией
Красавичк! Самый крутой мужик с бородой :ay: :az:
 
  • Спасибо
Реакции: dsertr21 и ezotonal

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
812
Благодарностей
140
Баллы
43
@WLDN мне стало интересно, зачем понадобилось везде в шаблоне использовать контекст? a.Context(); - это же довольно-таки не удобная штука. Куда лучше инициализировать в каждом кубике
ZennoLab.OwnCode.ADB ADB = new ZennoLab.OwnCode.ADB(project);
, и затем уже вызывать нужные методы через ADB.нужный метод (тут после точки и список методов появится, и аргументы для каждого метода, что сильно упрощает работу с ними и чего не происходит при работе с контекстом). И кроме того, также минус контекста в том, что изменения, сделанные в общем коде, не применятся для контекстной переменной, пока заново не передать содержимое общего кода в неё.
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
@WLDN мне стало интересно, зачем понадобилось везде в шаблоне использовать контекст? a.Context(); - это же довольно-таки не удобная штука. Куда лучше инициализировать в каждом кубике
ZennoLab.OwnCode.ADB ADB = new ZennoLab.OwnCode.ADB(project);
, и затем уже вызывать нужные методы через ADB.нужный метод (тут после точки и список методов появится, и аргументы для каждого метода, что сильно упрощает работу с ними и чего не происходит при работе с контекстом). И кроме того, также минус контекста в том, что изменения, сделанные в общем коде, не применятся для контекстной переменной, пока заново не передать содержимое общего кода в неё.
Я всегда работаю через контекст, мне так удобнее. Все готовые методы прописываю в общем коде, потом уже в паре строчек кода вызываю в сниппете то, что мне нужно.

Если тебе удобно работать другим образом, я не возражаю. :D

P.S. Также при создании нового объекта все ранее созданные переменные обнуляются.
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
@WLDN мне стало интересно, зачем понадобилось везде в шаблоне использовать контекст? a.Context(); - это же довольно-таки не удобная штука. Куда лучше инициализировать в каждом кубике
ZennoLab.OwnCode.ADB ADB = new ZennoLab.OwnCode.ADB(project);
, и затем уже вызывать нужные методы через ADB.нужный метод (тут после точки и список методов появится, и аргументы для каждого метода, что сильно упрощает работу с ними и чего не происходит при работе с контекстом). И кроме того, также минус контекста в том, что изменения, сделанные в общем коде, не применятся для контекстной переменной, пока заново не передать содержимое общего кода в неё.
Не сразу понял твой вопрос, сори, бегло прочитал (как обычно).
"Также при создании нового объекта все ранее созданные переменные обнуляются." - вот ответ. Если будешь постоянно создавать новый объект, то проще говоря значения и связи, которые уже установились в объекте, который ты гоняешь в контексте, просто обнулятся и у тебя начнутся проблемы если не в однопотоке, то в многопотоке.
 

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
На многих ресурсах просят указать возраст (как на скрине ниже).Не подскажете,как это реализовать? Пробовал скрол-не работает.Там ведь его нужно с нажатой клавишей делать по координатам.

Screenshot_4.jpg
 
  • Спасибо
Реакции: udder

Кто просматривает тему: (Всего: 10, Пользователи: 0, Гости: 10)