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

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
Спасибо, годная статья. Как раз ждал про андроид.
В использовании эмуляторов конечно есть и минус, что некоторые приложения не хотят там работать. Например алиэкспресс у меня так и не получилось запустить на эмуляторе.
 
  • Спасибо
Реакции: Earthshaker и WLDN

andrey-ka

Client
Регистрация
03.06.2018
Сообщения
853
Благодарностей
246
Баллы
43
Думаю вместо прокси можно использовать реальный мобильный интернет. Включение/выключение авирежима сменит IP и вуаля.
Остаются вопросы с анонимностью - deviceid и прочими.
 

lzlmrf

Client
Регистрация
14.08.2015
Сообщения
488
Благодарностей
149
Баллы
43
(В этом способе есть один минус. Если вы прерываете работу шаблона вручную, то pid не удаляется. Буду рад вашим идеям решения этой проблемы в комментариях.)
предлогаю обратить внимание на https://github.com/Ricky310711/CoolADB

ADBClient MyClient = new ADBClient();
var devices=MyClient.Devices()[0];
project.SendInfoToLog(devices);
string port= Regex.Match(devices,@"(?<=:-).*").Value;
project.SendInfoToLog(port);


не надо будет мучиться с глобалками и с pid
 
  • Спасибо
Реакции: Dmitrij и WLDN

Djuli1337

Client
Регистрация
28.09.2019
Сообщения
61
Благодарностей
9
Баллы
8
Статья огонь!
Как кликнуть по элементу, если нет resource-id и content-desc?
Есть только класс "android.widget.Button" и text "Смотреть"
Пробовал так, не получается
a.Click("//android.widget.Button[contains(@text, 'Смотреть видео')]", 0, 10);
a.Click("//android.widget.Button[@text='Смотреть']", 0, 10);
a.Click("//node[@text='Смотреть видео' and @class='android.widget.Button']", 0, 10);
 
Последнее редактирование:
  • Спасибо
Реакции: udder и WLDN

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Статья огонь!
Как кликнуть по элементу, если нет resource-id и content-desc?
Есть только класс "android.widget.Button" и text "Смотреть"
Пробовал так, не получается
a.Click("//android.widget.Button[@text='Смотреть']", 0, 10); //XPath, Index, Секунды
a.Click("//node[@text='Смотреть видео' and @class='android.widget.Button']", 0, 10); //XPath, Index, Секунды
Привет, как вариант можно попробовать исправить "Смотреть видео" на смотреть.
a.Click("//node[@text='Смотреть' and @class='android.widget.Button']", 0, 10); //XPath, Index, Секунды

Можешь прислать скрин окна и атрибутов с UIAutomator сюда, я попробую помочь.
 

sergio197675

Client
Регистрация
21.09.2019
Сообщения
360
Благодарностей
318
Баллы
63
Думаю вместо прокси можно использовать реальный мобильный интернет. Включение/выключение авирежима сменит IP и вуаля.
Остаются вопросы с анонимностью - deviceid и прочими.
это на эмуляторе так можно ip менять ?
 

Nemesisxxx

Client
Регистрация
16.03.2020
Сообщения
16
Благодарностей
6
Баллы
3

radv

Client
Регистрация
11.05.2015
Сообщения
3 823
Благодарностей
2 034
Баллы
113
Думаю вместо прокси можно использовать реальный мобильный интернет. Включение/выключение авирежима сменит IP и вуаля.
с реальными устройствами это можно пробовать, только нужны симки на каждое устройство. А вот с эмуляторами, такое не прокатит.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 823
Благодарностей
2 034
Баллы
113
Привет, как вариант можно попробовать исправить "Смотреть видео" на смотреть.
a.Click("//node[@text='Смотреть' and @class='android.widget.Button']", 0, 10); //XPath, Index, Секунды
Если текст = "Смотреть видео" то чтобы использовать только одно слово "Смотреть" в выражении xpath нужно использовать contains, так как text='Смотреть' не найдет, его там просто нет, ищется точное совпадение.
 
Последнее редактирование:

radv

Client
Регистрация
11.05.2015
Сообщения
3 823
Благодарностей
2 034
Баллы
113
Так можно и с 3G модемом - выткнул-воткнул и нате новый IP.
опять же, айпишник модема один на все соединение и если вручную его вытаскивать/вставлять то смысл автоматизации пропадает.
 

sergio197675

Client
Регистрация
21.09.2019
Сообщения
360
Благодарностей
318
Баллы
63
с реальными устройствами это можно пробовать, только нужны симки на каждое устройство. А вот с эмуляторами, такое не прокатит.
с реальными устройствами есть нюансики, один из них - не нашёл возможности одновременной работы устройства в режиме adb и usb модема , пришлось добовлять перефирии, или как это у вас проггеров- костыль из железа))
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 823
Благодарностей
2 034
Баллы
113
с реальными устройствами есть нюансики
Вот и я про это. :-) Нюансики есть везде, и при работе с xpath, и при работе с аппиумом, и при работе с adb (неважно через dll или напрямую)
 

sergio197675

Client
Регистрация
21.09.2019
Сообщения
360
Благодарностей
318
Баллы
63
был бы конкурс для новичков, что то типа "песочницы на кубиках", выложил бы наработки с реальными устройствами...а то зайдешь , почитаешь и как в меме- " да ну его на..."))
 
  • Спасибо
Реакции: Sib, 606 и nit_off

radv

Client
Регистрация
11.05.2015
Сообщения
3 823
Благодарностей
2 034
Баллы
113
был бы конкурс для новичков, что то типа "песочницы на кубиках", выложил бы наработки с реальными устройствами...а то зайдешь , почитаешь и как в меме- " да ну его на..."))
А почему нет? Ведь новичков тоже много на форуме. :ay: Есть еще раздел с внеконкурсными статьями. А если напишите в начале своей статьи, что Вы новичок, то все нормально будет. Опытные пользователи, тоже когда то новичками были. :az:
 
  • Спасибо
Реакции: fedorgen и sergio197675

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
был бы конкурс для новичков, что то типа "песочницы на кубиках", выложил бы наработки с реальными устройствами...а то зайдешь , почитаешь и как в меме- " да ну его на..."))
Вы ж можете и в этом конкурсе успеть
Напишите, заявки на участие вроде можно подавать до 24 мая,
Будет интересно почитать
 
  • Спасибо
Реакции: sergio197675

limarkximus

Client
Регистрация
01.08.2019
Сообщения
115
Благодарностей
73
Баллы
28
опять же, айпишник модема один на все соединение и если вручную его вытаскивать/вставлять то смысл автоматизации пропадает.
перегруз модема по расписанию
 

nit_off

Client
Регистрация
07.12.2012
Сообщения
37
Благодарностей
14
Баллы
8
был бы конкурс для новичков, что то типа "песочницы на кубиках", выложил бы наработки с реальными устройствами...а то зайдешь , почитаешь и как в меме- " да ну его на..."))
Думаю всем интересно будет изучить любой опыт автоматизации, я так же пишу на кубиках.
 

radv

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

sergio197675

Client
Регистрация
21.09.2019
Сообщения
360
Благодарностей
318
Баллы
63
А почему нет? Ведь новичков тоже много на форуме. :ay: Есть еще раздел с внеконкурсными статьями. А если напишите в начале своей статьи, что Вы новичок, то все нормально будет. Опытные пользователи, тоже когда то новичками были. :az:
Вы ж можете и в этом конкурсе успеть
Напишите, заявки на участие вроде можно подавать до 24 мая,
Будет интересно почитать
Думаю всем интересно будет изучить любой опыт автоматизации, я так же пишу на кубиках.
спасибо , за поддержку подал/одобрили заявку ....ЗЫ извиняюсь перед автором за флуд ,всем удачи!
 
  • Спасибо
Реакции: Manfred, seregakot и radv

Dexio

Client
Регистрация
09.05.2014
Сообщения
1 251
Благодарностей
219
Баллы
63
Если защита слабенькая, то конечно проще будет использовать этот вариант.
А примеры с хорошей защитой можете привести? Любопытства ради) кроме фб и реги гугла)
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 823
Благодарностей
2 034
Баллы
113
Вы получите значения в HEX, преобразуем их в DEC
Для преобразования в коде (без использования сервисов) можно использовать такие варианты
C#:
// Для преобразования из десятичного в шестнадцатеричное
string hexValue = decValue.ToString("X");

// Для преобразования из шестнадцатеричного в десятичный
// Вариант 1
int decValue = int.Parse(hexValue, System.Globalization.NumberStyles.HexNumber);

// Вариант 2
int decValue = Convert.ToInt32(hexValue, 16);
Тапаем с помощью sendevent, подставив номер event'а и координаты (в нашем случае двойной тап не нужен, поэтому я закомментил вторую часть в шаблоне):
C#:
var a = project.Context["ADB"];
string evnt = project.Variables["event"].Value;
string x = project.Variables["x"].Value;
string y = project.Variables["y"].Value;
a.Command(String.Format("sendevent /dev/input/event{0} 1 330 1", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 3 58 1", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 3 53 {1}", evnt, x), false);
a.Command(String.Format("sendevent /dev/input/event{0} 3 54 {1}", evnt, y), false);
a.Command(String.Format("sendevent /dev/input/event{0} 0 2 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 0 0 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 0 2 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 0 0 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 1 330 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 3 58 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 3 53 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 3 54 38", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 0 2 0", evnt), false);
a.Command(String.Format("sendevent /dev/input/event{0} 0 0 0", evnt), false);
Это столько строк ради одного тапа? Есть пояснения по каждой из строк этого примера? Зачем так заморачиваться? Координаты используются только в двух строках.

Может двойной тап, просто повторением одинарного сделать? Чем отличается тап через Click от такаого варианта?
 
  • Спасибо
Реакции: WLDN

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Если текст = "Смотреть видео" то чтобы использовать только одно слово "Смотреть" в выражении xpath нужно использовать contains, так как text='Смотреть' не найдет, его там просто нет, ищется точное совпадение.
Помог человеку. Там другая проблема. Решением было составить длинный XPath и работа с индексами. :-)
Исходил из этой информации при составлении пути. Подумал, вдруг человек ошибся немного. :D
56113

Это столько строк ради одного тапа? Есть пояснения по каждой из строк этого примера? Зачем так заморачиваться? Координаты используются только в двух строках.

Может двойной тап, просто повторением одинарного сделать? Чем отличается тап через Click от такого варианта?
В теории можно, если сделать дамп окна, а затем отправить 2 инпута подряд, но здесь вопрос времени между тапами.
В статье написал как это делал я, и поделился наработками. На их основе можно писать свои собственные методы.
Если кому-то когда-нибудь понадобится sendevent, он может зайти сюда и посмотреть как это делал я.
Не претендую на звание кодера года или на всезнайку, поэтому делитесь своими мыслями, буду только рад. :-)

Более подробную информацию о sendevent можно найти в поисковике:
 
Последнее редактирование:

WLDN

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

На мой взгляд лучше комбинировать запросы и обычную автоматизацию клиентов.
 
Последнее редактирование:
  • Спасибо
Реакции: Dexio

Zedx

Client
Регистрация
12.06.2018
Сообщения
1 366
Благодарностей
920
Баллы
113
был бы конкурс для новичков, что то типа "песочницы на кубиках", выложил бы наработки с реальными устройствами...а то зайдешь , почитаешь и как в меме- " да ну его на..."))
Во всех предыдущих конкурсах есть статьи как для новичков, так и для более продвинутых. Так что можно (и нужно) выкладывать и статьи для начинающих, чтобы у каждого была возможность найти что-то для своего уровня.
 
  • Спасибо
Реакции: WLDN и sergio197675

DenisK

Client
Регистрация
28.06.2016
Сообщения
591
Благодарностей
289
Баллы
63

sergio197675

Client
Регистрация
21.09.2019
Сообщения
360
Благодарностей
318
Баллы
63
Во всех предыдущих конкурсах есть статьи как для новичков, так и для более продвинутых. Так что можно (и нужно) выкладывать и статьи для начинающих, чтобы у каждого была возможность найти что-то для своего уровня.
это понятно, но даже в спорте есть профи ринг , а есть любители , потому и предложил песочницу длч новичков, у кого глаз еще на замылен и идеи плещут) для этаких генераторов идей и схем))
или ещё лучше - номинации
например "лучшая техническая"
а для гуманитариев "лучший способ монетизации" и тд и тп))
 
  • Спасибо
Реакции: WLDN

lybimiy86

Client
Регистрация
29.10.2016
Сообщения
97
Благодарностей
187
Баллы
33
Т.к. я довольно давно занимаюсь авоматизацией мобильных приложений, то хотел бы оставить своё мнение об этой статье.


Если полистать конкурсную статью с 6 конкурса статей: Управление любыми Android приложениями на смартфоне из ZP то на многие вопросы есть ответы и тема с appium достаточно изучена.
Ранее я автоматизировал приложения через Appium, но меня не устраивали батники, запущенные окна cmd и невысокая гибкость всей системы в целом.
Батники и запущенные окна cmd? Запускайте через c# и руководите сами этим окном. Хоть скрыто, хоть свернуто.
C#:
var appium_path = project.Variables["appium_path"].Value;
var appium_js = project.Variables["appium_js"].Value;
var appium_port = project.Variables["appium_port"].Value;
var bootstrap_port = project.Variables["appium_bootstrap_port"].Value;

//Включаем сервер
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @appium_path+"node.exe";
startInfo.Arguments = @appium_js+" -a 127.0.0.1 -p "+appium_port+" -bp "+bootstrap_port+" --command-timeout 500 -cp "+appium_port+" --session-override --suppress-adb-kill-server";
//startInfo.WindowStyle = ProcessWindowStyle.Hidden;// - Запуск в скрытом режиме, без окон вообще
startInfo.WindowStyle = ProcessWindowStyle.Minimized;// - Запуск в свернутом режиме
Process.Start(startInfo);

Вы предлагаете работать с nox_adb? Если бы Вы работали с этим чудом китайской инженерной мысли, то вы бы знали, что это обрезанный adb, с вырезанными и переделенными функциями. И поэтому всегда рекомендуется удалить их adb и заменить оригинальными c platform-tools. Так собственно и обновлять его можно и использовать нововведения.

2 Пункт
Любые команды adb можно отправлять и без appium и без специально добавленных библиотек Можно указать как и прямой путь к adb, так и в переменные среды. Примеров в смежной теме полно. Пример
Так что вообще не вижу смысла во 2-м пункте статьи.
Также пример команды adb с возвратом ответа в переменную.
C#:
Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "adb.exe";
p.StartInfo.Arguments = @"-s "+sn+" shell dumpsys battery | grep 'level'";
p.StartInfo.CreateNoWindow = true;
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
project.Variables["battery_level"].Value = output.Trim();
return output;
Конечно же работу с adb ещё можно оформить и в общий код, чтоб было эстетически приятнее работать с кодом.

3 пункт
Если работаем как в вашем случае с эмуляторами, то порт с нокса (как и у других эмуляторах) вытаскивается с файла конфигурации по пути: Nox\bin\BignoxVMS\Nox_1\Nox_1.vbox (как пример виртуальная машина 1).

Я бы назвал вариант взаимодействия с устройствами из этой статьи - одна из альтернатив Appium, которая очень далеко от Appium. Для сложных проектов точно не подойдет, если как какую-нибудь кликалку или легкую регистрацию в каких-нибудь проектах - пожалуйста.
Судя по темам автора - он может написать гораздо более интересную статью, чего я конечно и желаю в будущем.
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Вы предлагаете работать с nox_adb? Если бы Вы работали с этим чудом китайской инженерной мысли, то вы бы знали, что это обрезанный adb, с вырезанными и переделенными функциями. И поэтому всегда рекомендуется удалить их adb и заменить оригинальными c platform-tools. Так собственно и обновлять его можно и использовать нововведения.
Благодарю за дополнение. :-) Действительно я работаю с оригинальным adb, по скринам это можно увидеть. Но nox_adb в большинстве случаев хватает, чтобы использовать готовую автоматизацию и не устанавливать на все сервера с ботами AndroidSDK. На мой взгляд это очень удобно.

Батники и запущенные окна cmd? Запускайте через c# и руководите сами этим окном. Хоть скрыто, хоть свернуто.

Любые команды adb можно отправлять и без appium и без специально добавленных библиотек Можно указать как и прямой путь к adb, так и в переменные среды. Примеров в смежной теме полно. Пример
Так что вообще не вижу смысла во 2-м пункте статьи.
Также пример команды adb с возвратом ответа в переменную.
Да, подобный вариант я также использовал в 3ей части моей статьи. В момент когда я работал с Appium, я не углублялся в сокрытие cmd окон, потому что это был разовый заказ. Действительно, их не проблема скрыть, но это меня и привело к тому, чтобы более углубиться в тему автоматизации.
Использование библиотеки это был лишь вопрос моего удобства, не более того. В автоматизации множество задач можно решить различными способами, и каждый выбирает то, что ему по душе.

Если работаем как в вашем случае с эмуляторами, то порт с нокса (как и у других эмуляторах) вытаскивается с файла конфигурации по пути: Nox\bin\BignoxVMS\Nox_1\Nox_1.vbox (как пример виртуальная машина 1).
Да, в файле есть некоторая информация о запущенном эмуляторе, в том числе и порт. Но получение PID было очень важно для меня, это было необходимо для выполнения следующей важной задачи по автоматизации. Поэтому я использовал именно этот вариант, возможно он пригодится другим людям для их задач.

Я бы назвал вариант взаимодействия с устройствами из этой статьи - одна из альтернатив Appium, которая очень далеко от Appium. Для сложных проектов точно не подойдет, если как какую-нибудь кликалку или легкую регистрацию в каких-нибудь проектах - пожалуйста.
Судя по темам автора - он может написать гораздо более интересную статью, чего я конечно и желаю в будущем.
Действительно я мог бы раскрыть множество вариантов работы с эмуляторами и приложениями. Но хотели бы вы этого?
Я вижу, что даже этой статьёй очень сильно взбудоражил комьюнити мобильных автоматизаторов, насколько сообщают мне некоторые источники.
И действительно содержание статьи лишь альтернативный способ автоматизации, не более того и каждый выбирает то, что ему будет понятнее и удобнее.
Статьёй не преследовал цели оставить кого-то без хлеба, поэтому и написал то, что и так может Appium.

Спасибо за развернутый отзыв, взаимно.:-)
 
Последнее редактирование:
  • Спасибо
Реакции: maksimk26 и avtostopshik

radv

Client
Регистрация
11.05.2015
Сообщения
3 823
Благодарностей
2 034
Баллы
113
Действительно я мог бы раскрыть множество вариантов работы с эмуляторами и приложениями. Но хотели бы вы этого?
Информация всегда интересна. К тому же она имеет свойство меняться со времением, и не все смогут адаптироваться к таким изменениям. Кому то и описанное в статье по шагам перенести в свои проекты будет не по силам, а кто то просто решит сделать заказ у более опытных товарищей, чтобы сэкономить время и получить более стабильно работающий проект. Я лично знал про эту библиотеку, но не было времени разбираться с ней, и написал много своих похожих методов для работы с адб и эмуляторами. Исходя из своего опыта поддержу своего коллегу, что полностью отказаться от аппиума в пользу адб не получится, они друг друга дополняют. Автор все равно молодец, что поделился своим опытом и написал эту статью.
 

ZennoLab Team

Super Moderator
Команда форума
Регистрация
22.01.2019
Сообщения
1 591
Благодарностей
3 807
Баллы
113
Добавлено видео.
 
  • Спасибо
Реакции: masterLomaster и WLDN

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