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

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
  • Спасибо
Реакции: westruk

Sib

Новичок
Регистрация
19.04.2021
Сообщения
24
Благодарностей
2
Баллы
3
Ну если тебя не устроил завуалированный ответ и ты хочешь услышать например мое не завуалированное мнение, то:
Эмммм, даже не знаю... наверно: Спасибо, Кэп?
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113
Полезной информации в ответе не нашел.
Интересно, какой ответ хотите услышать? И заметьте, я предложил разные варианты, а не реклама у меня и так в подписи стоит, люди уже тестируют без оплаты, некоторые уже даже оплатили лицензию.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 719
Баллы
113
Полезной информации в ответе не нашел. Только завуалированная реклама своих продуктов.

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

SuperMinion

Client
Регистрация
04.03.2021
Сообщения
21
Благодарностей
4
Баллы
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
Регистрация
04.03.2021
Сообщения
21
Благодарностей
4
Баллы
3
Теперь ясно, попробуй делать автоматизацию на старых версиях Nox, их adb не перебивают adb от SDK. Например 6.6.0.5.
Подскажите пожалуйста, в чем может быть проблема. Открывается ютуб и там где должны быть видосики пишет, "Проблема с сетью. Код ошибки 400"
 

morfeus

Client
Регистрация
23.02.2012
Сообщения
171
Благодарностей
28
Баллы
28
Никак не могу разобраться как получить текст элемента в переменную - это вообще возможно ?

79662
 

devffy

Client
Регистрация
16.03.2019
Сообщения
542
Благодарностей
188
Баллы
43
Последнее редактирование:
  • Спасибо
Реакции: morfeus

morfeus

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

SuperMinion

Client
Регистрация
04.03.2021
Сообщения
21
Благодарностей
4
Баллы
3
Пишет что нет переменной driver, я так понял что нужно прикрутить appium но что то пока не получилось... А где можно посмотреть весь список команд или методов (не силен в кодинге) незнаю как они называются, все вот эти функции: напр Click (), Wait () и ДР..?


Но там уже многое устарело, возникают определенные сложности.
 
  • Спасибо
Реакции: morfeus

SuperMinion

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

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Подскажите пожалуйста, в чем может быть проблема. Открывается ютуб и там где должны быть видосики пишет, "Проблема с сетью. Код ошибки 400"
Не знаю, к сожалению.

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

Посмотреть вложение 79662
Есть кубик Parse для этого в статье.
 
  • Спасибо
Реакции: morfeus

SuperMinion

Client
Регистрация
04.03.2021
Сообщения
21
Благодарностей
4
Баллы
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
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
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
Регистрация
23.02.2012
Сообщения
171
Благодарностей
28
Баллы
28
Подскажите пожалуйста, в чем может быть проблема. Открывается ютуб и там где должны быть видосики пишет, "Проблема с сетью. Код ошибки 400"
У меня та же ошибка, я так понял что APK старое ... перекачай попробуй с посл версией APK...

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

morfeus

Client
Регистрация
23.02.2012
Сообщения
171
Благодарностей
28
Баллы
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
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113

jkarsak37428

Client
Регистрация
20.12.2015
Сообщения
137
Благодарностей
11
Баллы
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
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
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
Регистрация
23.02.2012
Сообщения
171
Благодарностей
28
Баллы
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
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
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
Регистрация
11.05.2015
Сообщения
3 788
Благодарностей
1 952
Баллы
113
"Компиляция кода Ошибка в действии "CS0103" "The name 'FindElementByAttribute' does not exist in the current context".
Это скорее всего метод из аппиума, а не из adb. Впрочем вы можете создать свои аналоги для использования через adb по примерам из статьи.
 

maksimk26

Client
Регистрация
19.08.2020
Сообщения
6
Благодарностей
12
Баллы
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
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
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"
 
  • Спасибо
Реакции: maksimk26

SteedLoL

Client
Регистрация
21.12.2019
Сообщения
29
Благодарностей
20
Баллы
3
может кто-нибудь на пальцах объяснить, как запустить приложение?
где и как прописать эту команду?
C#:
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
79922


UPD. Спасибо, разобрался сам))
если кому вдруг поможет, то запускаем CMD из каталога NOX,
прописываем:
Код:
adb shell dumpsys window windows
и вуаля
79923
 
Последнее редактирование:
  • Спасибо
Реакции: Nightgarm и WLDN

morfeus

Client
Регистрация
23.02.2012
Сообщения
171
Благодарностей
28
Баллы
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
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
может кто-нибудь на пальцах объяснить, как запустить приложение?
где и как прописать эту команду?
C#:
adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
Посмотреть вложение 79922

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

Ilshakin

Client
Регистрация
14.02.2017
Сообщения
639
Благодарностей
581
Баллы
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
 
Последнее редактирование:

morfeus

Client
Регистрация
23.02.2012
Сообщения
171
Благодарностей
28
Баллы
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
Регистрация
19.06.2013
Сообщения
793
Благодарностей
278
Баллы
63
Может кто то реализовывал ? долгое нажатие + свайп вниз.
Задача банальная нажать и "потянуть" вниз по координатам.
С какой стороны зайти к данному вопросу?
80363
 

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