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

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43

Cthutq899

Client
Регистрация
03.09.2019
Сообщения
168
Благодарностей
45
Баллы
28
  • Спасибо
Реакции: udder

WLDN

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

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43
Есть способ удобно дампить при такой ошибке, возможно в след конкурсе покажу как.
Есть способ удобно дампить при такой ошибке, возможно в след конкурсе покажу как.
15 конкурс статей как раз :-) Будет круто, т.к вы прекрасно и доступно пишите. Я пока аппиум инспектор установлю.
Попробуй другой эмулятор или версию Андройда
Возможно, я пробовал MEMU 7 Android и свой физический смарт с Android 11
 
  • Спасибо
Реакции: WLDN

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43
@WLDN Скажите, пожалуйста, как кликать когда нет resouce-id
75975


Пробовал так

a.Click("//node[@text='Start Messaging' and @class='android.widget.TextView']", 0, 10);
Элемент не находит
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
@WLDN Скажите, пожалуйста, как кликать когда нет resouce-id
Посмотреть вложение 75975

Пробовал так

a.Click("//node[@text='Start Messaging' and @class='android.widget.TextView']", 0, 10);
Элемент не находит
Попробовать без Class. Вообще должен находить.
Может там пробел какой-то другой, хз.

a.Click("//node[contains(@text,'Messaging')]", 0, 10);
 
  • Спасибо
Реакции: PUNKOFFYA и udder

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43
Попробовать без Class. Вообще должен находить.
Может там пробел какой-то другой, хз.

a.Click("//node[contains(@text,'Messaging')]", 0, 10);
Работает, несколько часов пытался прожать кнопку, ваш код сработал. Теперь по аналогии много элементов сделал таким образом. В процессе возник вопрос, как в индекс поставить переменную?

Такой вариант не сработал
C#:
var a = project.Context["ADB"];
a.Click("//node[contains(@text,'Photo')]", project.Variables["rnd"].Value, 10);
еще так попробовал.
C#:
var a = project.Context["ADB"];
a.Click("//node[contains(@text,'Photo')]", 'project.Variables["rnd"].Value', 10);
 
Последнее редактирование:

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43
ответил в личке
C#:
List<string> ls = a.Parse("//node[@resource-id='com.google.android.youtube:id/duration' and @class='android.widget.TextView']", "text", 0, 5);
project.Variables["likes"] = ls[0];
Любопытно, тоже понадобился парсинг не в список а в переменную, если не затруднит, то как изменить код?
 

WLDN

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

Такой вариант не сработал
C#:
var a = project.Context["ADB"];
a.Click("//node[contains(@text,'Photo')]", project.Variables["rnd"].Value, 10);
еще так попробовал.
C#:
var a = project.Context["ADB"];
a.Click("//node[contains(@text,'Photo')]", 'project.Variables["rnd"].Value', 10);
Если речь о "глобальном" индексе:
C#:
var a = project.Context["ADB"];
a.Click("//node[contains(@text,'Photo')]", int.Parse(project.Variables["rnd"].Value), 10);
Если индекс из атрибутов, то:
C#:
var a = project.Context["ADB"];
a.Click(String.Format("//node[contains(@text,'Photo') and @index='{0}']", project.Variables["rnd"].Value), 0, 10);
 
  • Спасибо
Реакции: udder

WLDN

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

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43
@WLDN
Выполнение действия CSharp OwnCode: Установка APK. Значение не может быть неопределенным.
Имя параметра: device"

Не удается установить APK из директории проекта.

В переменной deivce IP и порт эмулятора.

UPD
У меня несколько копий эмуля, подключался к другому порту.. Код отработал, но Telegram не установился.


C#:
var a = project.Context["ADB"];
var device = a.Device();

SharpAdbClient.DeviceCommands.PackageManager manager = new SharpAdbClient.DeviceCommands.PackageManager(device);
try {
manager.UninstallPackage("org.telegram.messenger"); //удаление пакета
} catch (Exception e) {}
manager.InstallPackage(project.Directory + @"\telegram.apk", reinstall: false); //установка apk
Проблем была в том, что имя пакета указано неверно. У tg есть две версии: для Google Play с именем пакета org.telegram.messenger и версия APK с их офф сайта с именем пакета org.telegram.messenger.web



Я пошел путем установки APK, потому что не смог прожать кнопку "Установить" в Google Play, т.к элемент не могу найти.



76037


Варианты такие:


a.Click("//node[contains(@text,'Установить')]", 0, 10);
 
Последнее редактирование:

biohacker01

Client
Регистрация
30.10.2019
Сообщения
62
Благодарностей
45
Баллы
18
@WLDN
Выполнение действия CSharp OwnCode: Установка APK. Значение не может быть неопределенным.
Имя параметра: device"

Не удается установить APK из директории проекта.

В переменной deivce IP и порт эмулятора.

UPD
У меня несколько копий эмуля, подключался к другому порту.. Код отработал, но Telegram не установился.


C#:
var a = project.Context["ADB"];
var device = a.Device();

SharpAdbClient.DeviceCommands.PackageManager manager = new SharpAdbClient.DeviceCommands.PackageManager(device);
try {
manager.UninstallPackage("org.telegram.messenger"); //удаление пакета
} catch (Exception e) {}
manager.InstallPackage(project.Directory + @"\telegram.apk", reinstall: false); //установка apk
Проблем была в том, что имя пакета указано неверно. У tg есть две версии: для Google Play с именем пакета org.telegram.messenger и версия APK с их офф сайта с именем пакета org.telegram.messenger.web



Я пошел путем установки APK, потому что не смог прожать кнопку "Установить" в Google Play, т.к элемент не могу найти.



Посмотреть вложение 76037

Варианты такие:


a.Click("//node[contains(@text,'Установить')]", 0, 10);
Так тут видно же resource-id если он есть то прям по нему и клик делаем 100% должно срабатывать.
Бывает ток что ресурс находится не в поле видимости(не экрана, а сам парсинг считает что не в поле видимости) , помогает скорлл немного вниз, немного вверх.
 
  • Спасибо
Реакции: udder

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
@WLDN
Выполнение действия CSharp OwnCode: Установка APK. Значение не может быть неопределенным.
Имя параметра: device"

Не удается установить APK из директории проекта.

В переменной deivce IP и порт эмулятора.

UPD
У меня несколько копий эмуля, подключался к другому порту.. Код отработал, но Telegram не установился.


C#:
var a = project.Context["ADB"];
var device = a.Device();

SharpAdbClient.DeviceCommands.PackageManager manager = new SharpAdbClient.DeviceCommands.PackageManager(device);
try {
manager.UninstallPackage("org.telegram.messenger"); //удаление пакета
} catch (Exception e) {}
manager.InstallPackage(project.Directory + @"\telegram.apk", reinstall: false); //установка apk
Проблем была в том, что имя пакета указано неверно. У tg есть две версии: для Google Play с именем пакета org.telegram.messenger и версия APK с их офф сайта с именем пакета org.telegram.messenger.web



Я пошел путем установки APK, потому что не смог прожать кнопку "Установить" в Google Play, т.к элемент не могу найти.



Посмотреть вложение 76037

Варианты такие:


a.Click("//node[contains(@text,'Установить')]", 0, 10);
Он не видит device. Не знаю в чем проблема. Если не удаётся установить через PacketManager, то можно устанавливать через cmd. В след статье выложу сниппет.
 
  • Спасибо
Реакции: udder

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43
Он не видит device. Не знаю в чем проблема. Если не удаётся установить через PacketManager, то можно устанавливать через cmd. В след статье выложу сниппет.
Я в посте уже написал ниже причину.
var a = project.Context["ADB"];
var device = a.Device();

SharpAdbClient.DeviceCommands.PackageManager manager = new SharpAdbClient.DeviceCommands.PackageManager(device);
try {
manager.UninstallPackage("org.telegram.messenger"); //удаление пакета
} catch (Exception e) {}
manager.InstallPackage(project.Directory + @"\telegram.apk", reinstall: false); //установка apk


имя пакета не соответствовал имени пакета APK. Поэтому была ошибка.
 
  • Спасибо
Реакции: WLDN

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43
Интересует как устанавливать прокси, особенно интересна установка прокси с авторизацией.
Я тестировал со своей мобильной локальной http проксей. В браузера на ПК работает.
При установки на эмуляторе пропадает интернет в браузере на эмуляторе, но Google Play работает, можно скачивать. Я скачал приложение для проверки IP, выдает IP моего ПК, не прокси
var a = project.Context["ADB"];

a.Command("settings put global http_proxy 127.0.0.1:3097", false);


Помогает отключение прокси

var a = project.Context["ADB"];

a.Command("settings put global http_proxy :0", false);


Все-таки без прокси не вариант работать, интересует как наладить коннект.
 

biohacker01

Client
Регистрация
30.10.2019
Сообщения
62
Благодарностей
45
Баллы
18
Интересует как устанавливать прокси, особенно интересна установка прокси с авторизацией.
Я тестировал со своей мобильной локальной http проксей. В браузера на ПК работает.
При установки на эмуляторе пропадает интернет в браузере на эмуляторе, но Google Play работает, можно скачивать. Я скачал приложение для проверки IP, выдает IP моего ПК, не прокси
var a = project.Context["ADB"];

a.Command("settings put global http_proxy 127.0.0.1:3097", false);


Помогает отключение прокси

var a = project.Context["ADB"];

a.Command("settings put global http_proxy :0", false);


Все-таки без прокси не вариант работать, интересует как наладить коннект.
По моим испытания что я смотрел или root доступ нужен на тлф, или чтоб сам телефон поддерживал проксю на таком уровне, некоторые телефоны не сохраняют логин пароль... Легче всего для меня оказалось купить дешевые роутеры и каждый тлф к своему роутеру прикрепить а роутер уже повесить проксю.
 
  • Спасибо
Реакции: udder

qweqwe5435

Client
Регистрация
12.02.2017
Сообщения
71
Благодарностей
39
Баллы
18
Подскажите, пожалуйста, у меня такая проблема:

Есть клик по кнопке, время ожидания в коде указано 10 секунд. Но если ее не находит, то почему-то инстанс висит намного больше указанного времени (где-то минуту). В чем может быть дело?
Так происходит со всеми элементами, которые не находятся.
 
Последнее редактирование:

udder

Client
Регистрация
28.03.2017
Сообщения
618
Благодарностей
128
Баллы
43
Подскажите, пожалуйста, у меня такая проблема:

Есть клик по кнопке, время ожидания в коде указано 10 секунд. Но если ее не находит, то почему-то инстанс висит намного больше указанного времени (где-то минуту). В чем может быть дело?
Так происходит со всеми элементами, которые не находятся.
Подтверждаю, у меня так же. При дебаге уходит много времени))
 

WLDN

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

Есть клик по кнопке, время ожидания в коде указано 10 секунд. Но если ее не находит, то почему-то инстанс висит намного больше указанного времени (где-то минуту). В чем может быть дело?
Так происходит со всеми элементами, которые не находятся.
Не минуту обычно, а секунд 30. 10 секунд это условное время ожидания. На самом деле там 10 запросов с промежутком в 1 секунду, я об этом отмечал в статье, емнип. Решение: использовать для дебага 1-2 секунды или стопать кубик в новых версиях зенки, он будет вылетать на ошибку.
 
  • Спасибо
Реакции: qweqwe5435 и udder

qweqwe5435

Client
Регистрация
12.02.2017
Сообщения
71
Благодарностей
39
Баллы
18
Не минуту обычно, а секунд 30. 10 секунд это условное время ожидания. На самом деле там 10 запросов с промежутком в 1 секунду, я об этом отмечал в статье, емнип. Решение: использовать для дебага 1-2 секунды или стопать кубик в новых версиях зенки, он будет вылетать на ошибку.
Спасибо) Теперь понятна логика работы. Действительно, в видео об этом рассказываете, но я упустил этот момент.
 
Последнее редактирование:
  • Спасибо
Реакции: WLDN

WLDN

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


В общем коде для всех методов можно сделать так, тогда паузы не будет, а лишь время на дамп xml
 
  • Спасибо
Реакции: qweqwe5435

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
На своем пк всё гуд установилось, на RDP почему-то не запускается uiautomatorviewer, в чем может быть проблема? Спасибо
Все верно установил, переменные среды так-же прописал, перезагружался, всё равно не запустилось. Батник открывается и буквально спустя момент закрывается сам.
 

ruthless

Client
Регистрация
13.02.2017
Сообщения
226
Благодарностей
67
Баллы
28
Выполнение действия CSharp OwnCode: 1. The device '127.0.0.1:21513' was not found.

Очень часто теряется коннект с адб, в чем может быть дело?
 

Mandyson

Client
Регистрация
03.06.2012
Сообщения
410
Благодарностей
84
Баллы
28
На своем пк всё гуд установилось, на RDP почему-то не запускается uiautomatorviewer, в чем может быть проблема? Спасибо
Все верно установил, переменные среды так-же прописал, перезагружался, всё равно не запустилось. Батник открывается и буквально спустя момент закрывается сам.
батник открой через cmd тогда не будет закрываться
Выполнение действия CSharp OwnCode: 1. The device '127.0.0.1:21513' was not found.

Очень часто теряется коннект с адб, в чем может быть дело?
вот такая же проблема, у меня конфликтует адб через консоль иногда и килит коннект, хотя мему продолжает работать, но это не особо мешает работает я бы сказал в целом
 

Mandyson

Client
Регистрация
03.06.2012
Сообщения
410
Благодарностей
84
Баллы
28
Подскажите кто писал или пишет регеры, сейчас куча защит антифрода, только зарегил акк и он сразу в бан.
Какие шаги вы предпринимали кроме уникализации версий, имеи, разных прокси и т.д.?
Готов оплатить инфу.
 

qweqwe5435

Client
Регистрация
12.02.2017
Сообщения
71
Благодарностей
39
Баллы
18
А как можно получить дамп в переменную? :bw:
 

Nikitos

Client
Регистрация
15.09.2016
Сообщения
46
Благодарностей
6
Баллы
8
Подскажите характеристики сервера, что бы тянул работу шаблона в 10-15 потоков
 

LifeIsCool

Client
Регистрация
12.12.2015
Сообщения
44
Благодарностей
4
Баллы
8
@WLDN подскажите пожалуйста. Уже второй день не могу составить правильный xPath чтобы кликал на кнопку (тестирую с кубиком wait, но не находит, с click тоже не работает)

77925

Из последнего пробовал так:
C#:
a.Wait("//node[@text='Start 7-Day Free Trial' and @resource-id='com.expressvpn.vpn:id/startTrialButton' and @class='android.widget.Button' and @package='com.expressvpn.vpn' and @clickable='true']", 3, 10);
и так:
C#:
a.Wait("//node[@index='0' and @class='android.widget.FrameLayout']/node[@index='0' and class='android.widget.LinearLayout']/node[@index='0' and class='android.widget.FrameLayout']/node[@index='0' and @resource-id='com.expressvpn.vpn:id/action_bar_root' and class='android.widget.LinearLayout']/node[@index='0' and @resource-id='android:id/content' and class='android.widget.FrameLayout']/node[@index='0' and @resource-id='com.expressvpn.vpn:id/welcome_screen_root' and class='android.view.ViewGroup']/node[@resource-id='com.expressvpn.vpn:id/startTrialButton' and @class='android.widget.Button' and @package='com.expressvpn.vpn' and @clickable='true']", 3, 10);
Что я делаю не так и будет ли эмулятор работать с впн?

П.С. проблему решил тапом по координатам, но интересно разобраться в моём конкретном случае почему не находит элемент.

В логе выводит следующее:
Выполнение действия CSharp OwnCode: Wait. Can't find element
 
Последнее редактирование:

radv

Client
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113
  • Спасибо
Реакции: LifeIsCool

LifeIsCool

Client
Регистрация
12.12.2015
Сообщения
44
Благодарностей
4
Баллы
8
Используйте значение из resource-id
//*[@resource-id = 'айди элемента']
Я его и использую, только добавляю дополнительные параметры поиска. Только что попробовал только resource-id, всё равно не ищет.

Столкнулся ещё с одной проблемой - uiautomatorviewer не может получить скриншот девайса в этом же приложении в следующем окне после тапа по кнопке. Было у кого такое? При этом

C:\WINDOWS\system32>adb connect 127.0.0.1:62001
already connected to 127.0.0.1:62001

77926
 

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