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

Koqpe

Client
Joined
Dec 23, 2014
Messages
1,099
Reaction score
648
Points
113
Исходя из этого, интересно мнение других участников форума.
Ну если тебя не устроил завуалированный ответ и ты хочешь услышать например мое не завуалированное мнение, то:
Весь мир театр, а люди в нем актеры
 
  • Thank you
Reactions: westruk

Sib

Новичок
Joined
Apr 19, 2021
Messages
24
Reaction score
2
Points
3
Ну если тебя не устроил завуалированный ответ и ты хочешь услышать например мое не завуалированное мнение, то:
Эмммм, даже не знаю... наверно: Спасибо, Кэп?
 

radv

Client
Joined
May 11, 2015
Messages
3,854
Reaction score
2,084
Points
113
Полезной информации в ответе не нашел.
Интересно, какой ответ хотите услышать? И заметьте, я предложил разные варианты, а не реклама у меня и так в подписи стоит, люди уже тестируют без оплаты, некоторые уже даже оплатили лицензию.
 

Phoenix78

Client
Read only
Joined
Nov 6, 2018
Messages
11,789
Reaction score
5,726
Points
113
Полезной информации в ответе не нашел. Только завуалированная реклама своих продуктов.

Исходя из этого, интересно мнение других участников форума.
вряд ли будут другие ответы. тебе разжевали всю инфу до состояния каши. добавить нечего.
 
  • Thank you
Reactions: westruk and radv

SuperMinion

Client
Joined
Mar 4, 2021
Messages
21
Reaction score
4
Points
3
Всем привет! Возникла такая проблема. После запуска приложения youtube пишет об ошибке 400 (проблема с сетью).

после прописывания в cmd adb start-server пишет вот такое

adb server version (36) doesn't match this client (41); killing...
* daemon started successfully
List of devices attached

Что это может быть и что делать?) Спасибо!)
 

SuperMinion

Client
Joined
Mar 4, 2021
Messages
21
Reaction score
4
Points
3
Теперь ясно, попробуй делать автоматизацию на старых версиях Nox, их adb не перебивают adb от SDK. Например 6.6.0.5.
Подскажите пожалуйста, в чем может быть проблема. Открывается ютуб и там где должны быть видосики пишет, "Проблема с сетью. Код ошибки 400"
 

morfeus

Client
Joined
Feb 23, 2012
Messages
183
Reaction score
30
Points
28
Никак не могу разобраться как получить текст элемента в переменную - это вообще возможно ?

79662
 

devffy

Client
Joined
Mar 16, 2019
Messages
541
Reaction score
188
Points
43
Никак не могу разобраться как получить текст элемента в переменную - это вообще возможно ?

View attachment 79662
+-вот так. но я через аппиум
C#:
project.Variables["get_text"].Value = driver.FindElementByXPath("//android.widget.TextView[@index='2']").GetAttribute("text");
 
Last edited:
  • Thank you
Reactions: morfeus

morfeus

Client
Joined
Feb 23, 2012
Messages
183
Reaction score
30
Points
28
+-вот так. но я через аппиум
C#:
project.Variables["get_text"].Value = driver.FindElementByXPath("//android.widget.TextView[@index='2']").GetAttribute("text");
Пишет что нет переменной driver, я так понял что нужно прикрутить appium но что то пока не получилось... А где можно посмотреть весь список команд или методов (не силен в кодинге) незнаю как они называются, все вот эти функции: напр Click (), Wait () и ДР..?
 

SuperMinion

Client
Joined
Mar 4, 2021
Messages
21
Reaction score
4
Points
3
Пишет что нет переменной driver, я так понял что нужно прикрутить appium но что то пока не получилось... А где можно посмотреть весь список команд или методов (не силен в кодинге) незнаю как они называются, все вот эти функции: напр Click (), Wait () и ДР..?


Но там уже многое устарело, возникают определенные сложности.
 
  • Thank you
Reactions: morfeus

SuperMinion

Client
Joined
Mar 4, 2021
Messages
21
Reaction score
4
Points
3
Пишет что нет переменной driver, я так понял что нужно прикрутить appium но что то пока не получилось... А где можно посмотреть весь список команд или методов (не силен в кодинге) незнаю как они называются, все вот эти функции: напр Click (), Wait () и ДР..?
Может это еще поможет: https://appium.io/docs/en/about-appium/api/
 
  • Thank you
Reactions: morfeus

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
569
Points
93
Подскажите пожалуйста, в чем может быть проблема. Открывается ютуб и там где должны быть видосики пишет, "Проблема с сетью. Код ошибки 400"
Не знаю, к сожалению.

Никак не могу разобраться как получить текст элемента в переменную - это вообще возможно ?

View attachment 79662
Есть кубик Parse для этого в статье.
 
  • Thank you
Reactions: morfeus

SuperMinion

Client
Joined
Mar 4, 2021
Messages
21
Reaction score
4
Points
3
Не знаю, к сожалению.


Есть кубик Parse для этого в статье.
С этим вроде разобрался, просто обновив версию приложения, но осталась другая проблема)

после прописывания в cmd adb start-server пишет вот такое

adb server version (36) doesn't match this client (41); killing...
* daemon started successfully
List of devices attached

Или пишет:

* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *

Из такой штуки есть вообще выход?)))
 

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
569
Points
93
С этим вроде разобрался, просто обновив версию приложения, но осталась другая проблема)

после прописывания в cmd adb start-server пишет вот такое

adb server version (36) doesn't match this client (41); killing...
* daemon started successfully
List of devices attached

Или пишет:

* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *

Из такой штуки есть вообще выход?)))
Конфликтует с другим adb
 

morfeus

Client
Joined
Feb 23, 2012
Messages
183
Reaction score
30
Points
28
Подскажите пожалуйста, в чем может быть проблема. Открывается ютуб и там где должны быть видосики пишет, "Проблема с сетью. Код ошибки 400"
У меня та же ошибка, я так понял что APK старое ... перекачай попробуй с посл версией APK...

пс я с этим заморачиваться не стал т к нужную мне APK запустил...
 

morfeus

Client
Joined
Feb 23, 2012
Messages
183
Reaction score
30
Points
28
С этим вроде разобрался, просто обновив версию приложения, но осталась другая проблема)

после прописывания в cmd adb start-server пишет вот такое

adb server version (36) doesn't match this client (41); killing...
* daemon started successfully
List of devices attached

Или пишет:

* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *

Из такой штуки есть вообще выход?)))
Тут я заметил, что вроде как порт чтоли занят бывает к которому подключен Automator
В общем я делаю как 1) запускаю AutomatorViewerи затем выполняю шаб... если шаб стопорится на деиствии конект (не может найти порт), то перезапускаю эмулятор...
 

radv

Client
Joined
May 11, 2015
Messages
3,854
Reaction score
2,084
Points
113

jkarsak37428

Client
Joined
Dec 20, 2015
Messages
137
Reaction score
11
Points
18
Подскажите, как запустить конкретный эмулятор (Nox), сабж
C#:
var proc = System.Diagnostics.Process.Start(project.Variables["settings_nox"].Value, Regex.Match(project.Variables["start_cmd"].Value, "-clone:.*").ToString());
просто разворачивает окно первого запущенного эмуля, а должно ведь свободный по идее запускать если первый работает?
 

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
569
Points
93
Подскажите, как запустить конкретный эмулятор (Nox), сабж
C#:
var proc = System.Diagnostics.Process.Start(project.Variables["settings_nox"].Value, Regex.Match(project.Variables["start_cmd"].Value, "-clone:.*").ToString());
просто разворачивает окно первого запущенного эмуля, а должно ведь свободный по идее запускать если первый работает?
Этот код запускает .exe файл с параметрами указанными после запятой. В данном случае в переменной start_cmd обычно хранится хвост запущенного эмулятора Nox.
 

morfeus

Client
Joined
Feb 23, 2012
Messages
183
Reaction score
30
Points
28
А не подскажете где можно узнать все функции объекта ну вот например Wait(), Click() встроенные я так понимаю может есть какие то функции парсинга с экрана в общем как узнать весь список что умеет...

Пробовал смотреть

adb helpтаких функции там нет, за то они есть в СSharp но СSharp овая функция FindElementByAttribute() пишет

"Компиляция кода Ошибка в действии "CS0103" "The name 'FindElementByAttribute' does not exist in the current context". [Строка: 8; Cтолбец: 37]"

C#:
a.Wait("//node[@text='Start Messaging' and @class='android.widget.TextView']", 0, 10); //XPath, Index, Секунды
C#:
a.Click("//node[@text='Start Messaging' and @class='android.widget.TextView']", 0, 10); //XPath, Index, Секунды
Варианты что попробовал ошибка примерно всегда одна и таже=))


C#:
//project.Variables["msg_tg"].AddRange(a.Parse("//node[@class='android.widget.TextView']", "text", 3, 5)); //XPath, какой аттрибут парсить, Index, Секунды
//project.Variables["msg_tg"].Value = driver.FindElementByXPath("//android.widget.TextView[@index='2']").GetAttribute("text");
//project.Variables["msg_tg"].Value = a.Parse("//@class='android.widget.TextView']", 1, 10).GetAttribute("text");
//project.Variables["msg_tg"].Value = a.FindElementByXPath("//@class='android.widget.TextView']", "text", 0, 5).GetAttribute("text");
//project.Variables["msg_tg"].ValueAddRange(a.Parse("//node[@class='android.widget.TextView']", "text", 3, 5)); //XPath, какой аттрибут парсить, Index, Секунды
project.Variables["msg_tg"].Value = FindElementByAttribute("class='android.widget.TextView'","index=3","NZDating","regexp",3);
//project.Variables["msg_tg"].Value = findElement("android.widget.TextView");

//project.Variables["msg_tg"].Value = Instance.FindElementByXPath("//android.widget.TextView[@index='3']");
//project.Variables["msg_tg"].Value = a.Parse("//node[@class='android.widget.TextView']", "text", 0, 3);
 

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
569
Points
93
А не подскажете где можно узнать все функции объекта ну вот например Wait(), Click() встроенные я так понимаю может есть какие то функции парсинга с экрана в общем как узнать весь список что умеет...

Пробовал смотреть

adb helpтаких функции там нет, за то они есть в СSharp но СSharp овая функция FindElementByAttribute() пишет

"Компиляция кода Ошибка в действии "CS0103" "The name 'FindElementByAttribute' does not exist in the current context". [Строка: 8; Cтолбец: 37]"

C#:
a.Wait("//node[@text='Start Messaging' and @class='android.widget.TextView']", 0, 10); //XPath, Index, Секунды
C#:
a.Click("//node[@text='Start Messaging' and @class='android.widget.TextView']", 0, 10); //XPath, Index, Секунды
Варианты что попробовал ошибка примерно всегда одна и таже=))


C#:
//project.Variables["msg_tg"].AddRange(a.Parse("//node[@class='android.widget.TextView']", "text", 3, 5)); //XPath, какой аттрибут парсить, Index, Секунды
//project.Variables["msg_tg"].Value = driver.FindElementByXPath("//android.widget.TextView[@index='2']").GetAttribute("text");
//project.Variables["msg_tg"].Value = a.Parse("//@class='android.widget.TextView']", 1, 10).GetAttribute("text");
//project.Variables["msg_tg"].Value = a.FindElementByXPath("//@class='android.widget.TextView']", "text", 0, 5).GetAttribute("text");
//project.Variables["msg_tg"].ValueAddRange(a.Parse("//node[@class='android.widget.TextView']", "text", 3, 5)); //XPath, какой аттрибут парсить, Index, Секунды
project.Variables["msg_tg"].Value = FindElementByAttribute("class='android.widget.TextView'","index=3","NZDating","regexp",3);
//project.Variables["msg_tg"].Value = findElement("android.widget.TextView");

//project.Variables["msg_tg"].Value = Instance.FindElementByXPath("//android.widget.TextView[@index='3']");
//project.Variables["msg_tg"].Value = a.Parse("//node[@class='android.widget.TextView']", "text", 0, 3);
FindElementByAttribute - не из этой статьи. Все методы, что я писал, я описал в статье и их можно найти в общем коде.
 

radv

Client
Joined
May 11, 2015
Messages
3,854
Reaction score
2,084
Points
113
"Компиляция кода Ошибка в действии "CS0103" "The name 'FindElementByAttribute' does not exist in the current context".
Это скорее всего метод из аппиума, а не из adb. Впрочем вы можете создать свои аналоги для использования через adb по примерам из статьи.
 

maksimk26

Client
Joined
Aug 19, 2020
Messages
6
Reaction score
12
Points
3
Листал очень долго всю тему разбирался, может уже кто-то писал, но продублирую, чтобы такие же новички как я не мучились. Решение проблемы, когда нужно найти элемент по XPath через текст на кириллице следующее:

В общем коде создал небольшой класс

public class Encoding_Text
{
public static string Encoding_Text_String (string text)
{
Encoding utf8 = Encoding.GetEncoding("ISO-8859-1");
Encoding win1251 = Encoding.GetEncoding("UTF-8");
byte[] utf8Bytes = win1251.GetBytes(text);
byte[] win1251Bytes = Encoding.Convert(utf8, win1251, utf8Bytes);
text = win1251.GetString(win1251Bytes);
return text;
}
}

в кубике C# в зеннопостер добавляю такой код:

string my_text = Encoding_Text.Encoding_Text_String("Здесь пишем текст по которому нужно совершить поиск");
a.Click("//node[contains(@text, '" + my_text + "') and @class='android.widget.TextView']", 0, 1); //XPath, Index, Секунды

Таким образом можно искать элементы по XPath по тексту на кириллице. Может дублирую, но мне так не хватало такого поста, полдня проковырялся, думаю однозначно кому-то поможет)))
 

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
569
Points
93
Листал очень долго всю тему разбирался, может уже кто-то писал, но продублирую, чтобы такие же новички как я не мучились. Решение проблемы, когда нужно найти элемент по XPath через текст на кириллице следующее:

В общем коде создал небольшой класс

public class Encoding_Text
{
public static string Encoding_Text_String (string text)
{
Encoding utf8 = Encoding.GetEncoding("ISO-8859-1");
Encoding win1251 = Encoding.GetEncoding("UTF-8");
byte[] utf8Bytes = win1251.GetBytes(text);
byte[] win1251Bytes = Encoding.Convert(utf8, win1251, utf8Bytes);
text = win1251.GetString(win1251Bytes);
return text;
}
}

в кубике C# в зеннопостер добавляю такой код:

string my_text = Encoding_Text.Encoding_Text_String("Здесь пишем текст по которому нужно совершить поиск");
a.Click("//node[contains(@text, '" + my_text + "') and @class='android.widget.TextView']", 0, 1); //XPath, Index, Секунды

Таким образом можно искать элементы по XPath по тексту на кириллице. Может дублирую, но мне так не хватало такого поста, полдня проковырялся, думаю однозначно кому-то поможет)))
Спасибо большое. Также я выкладывал обновлённую библиотеку для работы с кириллицой в "Автоматизация Android без посредников. Часть 2"
 
  • Thank you
Reactions: maksimk26

SteedLoL

Client
Joined
Dec 21, 2019
Messages
29
Reaction score
20
Points
3
может кто-нибудь на пальцах объяснить, как запустить приложение?
где и как прописать эту команду?
C#:
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
79922


UPD. Спасибо, разобрался сам))
если кому вдруг поможет, то запускаем CMD из каталога NOX,
прописываем:
Code:
adb shell dumpsys window windows
и вуаля
79923
 
Last edited:
  • Thank you
Reactions: Nightgarm and WLDN

morfeus

Client
Joined
Feb 23, 2012
Messages
183
Reaction score
30
Points
28
Ура разобрался!

Вот как получать данные может кому пригодится:

C#:
List<string> ls = a.Parse("//node[@resource-id='' and @class='android.widget.TextView']", "text", 3, 5);
project.Variables["msg_tg"].Value = ls[3];
Если бы сразу общий код внимательно осмотрел... эх неделю читал как оно работает =)))
 

WLDN

Client
Joined
Jul 9, 2015
Messages
357
Reaction score
569
Points
93
может кто-нибудь на пальцах объяснить, как запустить приложение?
где и как прописать эту команду?
C#:
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
View attachment 79922

UPD. Спасибо, разобрался сам))
если кому вдруг поможет, то запускаем CMD из каталога NOX,
прописываем:
Code:
adb shell dumpsys window windows
и вуаля
View attachment 79923
Нужно сначала запустить терминал adb shell, а затем ввести остальную команду
 
  • Thank you
Reactions: SteedLoL

Ilshakin

Client
Joined
Feb 14, 2017
Messages
645
Reaction score
589
Points
93
если кто то работает с эмуляторами по их индексу и задается вопросом, как выстроить логику,
для многопотока, когда вы руками закрыли какую то копию эмулятора,
назрело у меня решение без использования глобалок:
у каждого эмулятора есть возможность получить полный список всех созданных эмуляторов
я использую ldplayer, для него команда будет "list", для других эмуляторов - другая команда
сам код:
C#:
    System.Diagnostics.ProcessStartInfo startInfo1 = new System.Diagnostics.ProcessStartInfo();
    startInfo1.FileName = @"Путь до консоли эмулятора";
    startInfo1.Arguments = @"list"; // команда для показа списка всех индексов
    startInfo1.CreateNoWindow = true;
    startInfo1.UseShellExecute = false;
    startInfo1.RedirectStandardInput = true;
    startInfo1.RedirectStandardOutput = true;
    System.Diagnostics.Process process = System.Diagnostics.Process.Start(startInfo1);
    process = System.Diagnostics.Process.Start(startInfo1);
    process.WaitForExit();
    string emulator_list = process.StandardOutput.ReadToEnd(); // получим в переменную все созданные эмуляторы
    int[] array = emulator_list.Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToArray();  // занесем в массив индексы всех наших эмуляторов
    int res = ( (array.Length + 1) * array.Length /2 - array.Sum()); // найдем пропущенное число, если такого нет - вернет последний индекс + 1
    project.Variables["device_index"].Value = res.ToString(); // положим в переменную индекс эмулятора, который нужно создать

собственно теперь мы имеем актуальный индекс девайса, который нам нужно клонировать и запустить
неважно, закрывали мы руками до этого какой то эмулятор (с удалением) или просто хотим клонировать новый



UPD:
потестив свой же код пришел к выводу, что он не совсем корректен, потому что, если во время работы мы удалим сразу несколько
эмуляторов, то формула поиска недостающего индекса сработает неверно
к примеру, у меня в работе 5 эмуляторов:
80017


и в какой то момент решил удалить сразу парочку, ну либо они зависли и автоматически удалились:
80018


тогда используем новый код:

C#:
    System.Diagnostics.ProcessStartInfo startInfo1 = new System.Diagnostics.ProcessStartInfo();
    startInfo1.FileName = dnconsole_path;
    startInfo1.Arguments = @"list2";
    startInfo1.CreateNoWindow = true;
    startInfo1.UseShellExecute = false;
    startInfo1.RedirectStandardInput = true;
    startInfo1.RedirectStandardOutput = true;
    System.Diagnostics.Process process = System.Diagnostics.Process.Start(startInfo1);
    process = System.Diagnostics.Process.Start(startInfo1);
    process.WaitForExit();
    string emulator_list = process.StandardOutput.ReadToEnd();
    var lst = emulator_list.Split(new[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Split(',')[0]).Select(x => int.Parse(x)).ToList();
    try {
        var missing = Enumerable.Range(0,lst.Count).Except(lst).ToList();
        project.Variables["device_index"].Value = missing[0].ToString();
    } catch {
        project.Variables["device_index"].Value = lst.Count.ToString();
    }

в результате, новые потоки поднимут девайсы под индексами 2 и 4
80019
 
Last edited:

morfeus

Client
Joined
Feb 23, 2012
Messages
183
Reaction score
30
Points
28
Не вводится русский текст командой

C#:
a.Text(name); //ввод текста
вместо него => ????????

Английские буквы и цыфры вводятся норм...

Пробовал эту команду, она ничего не вводит...

C#:
var sv = project.Variables["device"].Value;
var text = project.Variables["Nazvanie"].Value;
//sv это серийник устройства для многопотока вида 127.0.0.1:21521

ProcessStartInfo startInfo1 = new ProcessStartInfo();
startInfo1.FileName = "adb.exe";
startInfo1.Arguments = "-s "+sv+" shell am broadcast -a ADB_INPUT_TEXT --es msg 'Text'";
startInfo1.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(startInfo1).WaitForExit();
Помогите разобраться плз...
 

baracuda

Client
Joined
Jun 19, 2013
Messages
856
Reaction score
294
Points
63
Может кто то реализовывал ? долгое нажатие + свайп вниз.
Задача банальная нажать и "потянуть" вниз по координатам.
С какой стороны зайти к данному вопросу?
80363
 

Users Who Are Viewing This Thread (Total: 3, Members: 0, Guests: 3)