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

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
Где-то забыл вызвать Context. Вероятно не в этом кубике.
Благодарю! Вы как всегда на высоте с помощью).И да,Вы правы-не заметил отсутствие строки в одном из кубиков.Ещё раз спасибо!
 
  • Спасибо
Реакции: WLDN

Szerzs

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

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
А можна ещё один такой вопрос: (просмотрел все 8 страниц-на нашёл ответа). Нужно сделать клик в приложении по имени.Как правильно код прописать, (без клика по координатам) Посмотреть вложение 61577? (на скрине)
a.Click("//node[@text='Kari']", 0, 15); //XPath, Index, Seconds
 
  • Спасибо
Реакции: Szerzs

dizney

Client
Регистрация
25.01.2014
Сообщения
51
Благодарностей
52
Баллы
18
А можна ещё один такой вопрос: (просмотрел все 8 страниц-на нашёл ответа). Нужно сделать клик в приложении по имени.Как правильно код прописать, (без клика по координатам) Посмотреть вложение 61577? (на скрине)
var a = project.Context["ADB"];
a.Click("//node[@text='Kari' and @class='android.widget.TextView']", 0, 10);
 
  • Спасибо
Реакции: Ruhas, Szerzs и WLDN

Szerzs

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

radv

Client
Регистрация
11.05.2015
Сообщения
3 820
Благодарностей
2 030
Баллы
113
Как правильно код прописать, (без клика по координатам)
a.Click("//node[@text='Kari']", 0, 15); //XPath, Index, Seconds
var a = project.Context["ADB"];
a.Click("//node[@text='Kari' and @class='android.widget.TextView']", 0, 10);
Это если нужно кликнуть по конкретному имени, которое известно.

А если клик нужен по элементу в котором имя, то нужно его и искать. Получится коллекция элементов (например с одинаковым resource-id) и перебирать их кликая по нужному (при этом обращая внимание на атрибут clickable) Еще этом стоит помнить, что порядок в списке сообщений (как и координаты) изменяется при появлении новых сообщений. :-)
 

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
У меня такой вопрос по отправке текстового сообщения: при выполнении снипета
a.Text(project.Variables["message"].Value); //ввод текста
a.KeyEvent("66"); //Enter
не пишется текст вида ААА (как пример), а только такого вида пишется и отправляется: А_А_А (текст на английском).Интересно,это из-за приложения или нужно версию NOX менять? И вообще-решаема эта проблема?
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
У меня такой вопрос по отправке текстового сообщения: при выполнении снипета
a.Text(project.Variables["message"].Value); //ввод текста
a.KeyEvent("66"); //Enter
не пишется текст вида ААА (как пример), а только такого вида пишется и отправляется: А_А_А (текст на английском).Интересно,это из-за приложения или нужно версию NOX менять? И вообще-решаема эта проблема?
Может быть, что нужно экранировать вводимые символы с помощью \ перед вводимым символом. Или заменить пробелы на %s (например, если проблема связана с ними)
 

ezotonal

Client
Регистрация
13.01.2014
Сообщения
819
Благодарностей
231
Баллы
43
Благодарю! Вы как всегда на высоте с помощью).И да,Вы правы-не заметил отсутствие строки в одном из кубиков.Ещё раз спасибо!
Если кликать по юникод имени, то тут нужно обратно конвертировать utf-8 в ISO-8859-1

C#:
string text = project.Variables["test2"].Value; // в переменной 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);
return win1251.GetString(win1251Bytes); // Результат: Ðаказ звонка ÑеÑниÑеÑкой поддеÑжки
А потом данный результат вставлять в xpatx поиск по тексту

Типа так
C#:
a.Click("//node[@text='Ðнопка' and @class='android.widget.TextView']", 0, 10); //XPath, Index, Секунды
 
Последнее редактирование:

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
Я хотел было решить клики по имени по другому: спарсил имена в список,оттуда по одному в переменную,а уже переменную в код (в переменную name вставляется спаршеное имя пользователя:
Было:
a.Click("//node[@text='Kari']", 0, 15); //XPath, Index, Seconds
Стало:
a.Click("//node[@text='project.Variables["name"].Value']", 0, 15); //XPath, Index, Seconds
Но,о Боги! Не работает этот код-одни ошибки). Вставлял я project.Variables["name"].Value и после node и перед a.Click и в кавычках всевозможных-и ни в какую)). Куда эту переменную project.Variables["name"].Value вставлять-то?))
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Я хотел было решить клики по имени по другому: спарсил имена в список,оттуда по одному в переменную,а уже переменную в код (в переменную name вставляется спаршеное имя пользователя:
Было:
a.Click("//node[@text='Kari']", 0, 15); //XPath, Index, Seconds
Стало:
a.Click("//node[@text='project.Variables["name"].Value']", 0, 15); //XPath, Index, Seconds
Но,о Боги! Не работает этот код-одни ошибки). Вставлял я project.Variables["name"].Value и после node и перед a.Click и в кавычках всевозможных-и ни в какую)). Куда эту переменную project.Variables["name"].Value вставлять-то?))
Лучше ошибки сюда сразу скидывать. Код правильно вставил. Может контекст забыл? Или на странице нет такого имени?
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Хотя подожди, нет не правильно, нужно использовать a.Click(String.Format("//node[@text='{0}']", project.Variables["name"].Value), 0, 15); //XPath, Index, Seconds
 

ezotonal

Client
Регистрация
13.01.2014
Сообщения
819
Благодарностей
231
Баллы
43

Szerzs

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

Szerzs

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

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
  • Спасибо
Реакции: WLDN

dizney

Client
Регистрация
25.01.2014
Сообщения
51
Благодарностей
52
Баллы
18
a.Click("//node[contains(@text, 'Смотреть') and @class='android.widget.Button']", 0, 10);
Только учитывайте, что регистр текста тоже важен и по созданному xpath должен находиться всего 1 элемент. Рекомендую почитать статьи по работе с xpath, они есть и на форуме и на других сайтах. Можете поискать видео на ютуб, так же обучение по xpath есть в различных видеокурсах (например в ZennoAcademy от sibbora, возможно есть в курсах других авторов)
По поводу регистра:
C#:
var a = project.Context["ADB"];
string text = project.Variables["text"].Value; //тут твой текст
a.Click("//*[contains(translate(@text, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '"+text+"') and @class='android.view.View']", 0, 10); //XPath, Index, Секунды
Предварительно текст нужно перевести в нижний регистр.
 
  • Спасибо
Реакции: orka13

morgansho

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

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
а можно как-нибудь ускорить процесс (parse, click), когда идёт выход по красной ветке, кроме как указать 1 секунду?
потому что очень заметна разница между удачной обработкой экшена и неудачной.
не знаю правильно ли я объяснил ситуацию)
Один из вариантов сделать проверку с помощью Wait и цикла.
Check Element:
var a = project.Context["ADB"];
int z = int.Parse(project.Variables["settings_pause_wait"].Value)/2;
for (int i=0;i<z;i++){
    try {
a.Wait("//node[@resource-id='com.instagram.android:id/next_button' and @class='android.widget.FrameLayout']", 0, 1); //XPath, Index, Секунды
        return "next";
    } catch (Exception e) {}
        try {
a.Wait("//node[@resource-id='com.instagram.android:id/skip_button' and @class='android.widget.TextView']", 0, 1); //XPath, Index, Секунды
            return "skip";
    } catch (Exception e) {}
}
throw new Exception("Can't load Element");
Положить результат в переменную Check, и направить бота в нужное русло через Switch.

Посмотреть вложение 59628
Это имел ввиду?
 

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
Подскажите пожалуйста,вот пустил я нокс через Proxifier с мобильными прокси.Какие ip и порт прописывать в экшены Get Device и Connect? И откуда их можно взять? На пробах и ошибках я понял что ip-порт мобильных проксей в экшены не подходят.
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Подскажите пожалуйста,вот пустил я нокс через Proxifier с мобильными прокси.Какие ip и порт прописывать в экшены Get Device и Connect? И откуда их можно взять? На пробах и ошибках я понял что ip-порт мобильных проксей в экшены не подходят.
Get Device и Connect нужны для подключения к устройству (эмулятору) через его host:port, т.е. использовать всё также как и раньше. Proxifier используется для проксирования трафика и ip:port мобильных проксей нужно вставлять именно в Proxifier. С шаблоном они никак не пересекаются в данном случае.
 
  • Спасибо
Реакции: Szerzs

Szerzs

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

var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.appnew:id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды

В клоне клик уже такой: (меняется только appnew)
var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.appnex:id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды

Так вот,чтобы в шаблоне не клонировать кучу экшенов-кубиков,можно ведь подставлять переменные вместо appnew, верно?
Подскажите пажалуйста,как его подправить.Пробовал так,не работает:

var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.(project.Variables["app_name"].Value):id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды
 

dizney

Client
Регистрация
25.01.2014
Сообщения
51
Благодарностей
52
Баллы
18
Хотел бы ещё уточнить по поводу переменных.Скажем у меня установлены несколько клонов приложений.И чтобы сделать клик в одном приложении,нужен код:

var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.appnew:id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды

В клоне клик уже такой: (меняется только appnew)
var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.appnex:id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды

Так вот,чтобы в шаблоне не клонировать кучу экшенов-кубиков,можно ведь подставлять переменные вместо appnew, верно?
Подскажите пажалуйста,как его подправить.Пробовал так,не работает:

var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.(project.Variables["app_name"].Value):id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды
C#:
string app = project.Variables["app_name"].Value;
var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android."+app+":id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды
Можно такую комбинацию использовать.
 
  • Спасибо
Реакции: Szerzs

WLDN

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

var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.appnew:id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды

В клоне клик уже такой: (меняется только appnew)
var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.appnex:id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды

Так вот,чтобы в шаблоне не клонировать кучу экшенов-кубиков,можно ведь подставлять переменные вместо appnew, верно?
Подскажите пажалуйста,как его подправить.Пробовал так,не работает:

var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android.(project.Variables["app_name"].Value):id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды
var a = project.Context["ADB"];
a.Click("//node[contains(@resource-id,'com.app.android.appne') and contains(@resource-id,':id/picture') and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды

Вот так ещё можно сделать без переменной
 
  • Спасибо
Реакции: Szerzs

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
C#:
string app = project.Variables["app_name"].Value;
var a = project.Context["ADB"];
a.Click("//node[@resource-id='com.app.android."+app+":id/picture' and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды
Можно такую комбинацию использовать.
Ошибка в коде:
Компиляция кода Ошибка в действии "CS0103" "Имя "app" отсутствует в текущем контексте". [Строка: 2; Cтолбец: 49]

Может я не правильно объяснил.Пример. Установлено скажем 5 клонов приложений:
1-com.mazilla.android.mazillaex
2-com.mazilla.android.mazillaey
3-com.mazilla.android.mazillaez
4-com.mazilla.android.mazillaev
5-com.mazilla.android.mazillaeu

Чтобы не делать отдельные шаблоны, в кубиках c#,где нужны действия, после resource-id=вставляем название пакета ,который выше,окончание которого (mazilla....) берётся из переменной.Вот.Поэтому переменная обязательна.Вот как её сделать?
 
Последнее редактирование:

Szerzs

Client
Регистрация
15.06.2019
Сообщения
260
Благодарностей
68
Баллы
28
var a = project.Context["ADB"];
a.Click("//node[contains(@resource-id,'com.app.android.appne') and contains(@resource-id,':id/picture') and @class='android.widget.ImageView']", 0, 3); //XPath, Index, Секунды

Вот так ещё можно сделать без переменной
-
 
Последнее редактирование:

ErikMoor

Client
Регистрация
24.03.2016
Сообщения
123
Благодарностей
22
Баллы
18
project.Variables["переменная"].Value = a.Parse("//node[@resource-id='com.google.android.youtube:id/duration' and @class='android.widget.TextView']", "text", 0, 5)[0];

Может быть что-то типо того, я уже не помню точно.
Приветствую
Подскажите как спарсить этот текст "Your account or password is incorrect. If you don't remember your password, "

Перепробовал этот вариант в переменную - нет получилось
Пробовал вариант как выше был пример со списком - не получилось
Все время сыпятся ошибки
Вот что пробовал, все что закоментированно тоже не работает


C#:
var a = project.Context["ADB"];

project.Variables["test"].Value = driver.FindElementByXPath("//android.view.View[contains(@package, 'com.microsoft.xboxone.smartglass')]").GetAttribute("text");
//project.Variables["test"].Value = a.Parse("//node[@package='com.microsoft.xboxone.smartglass']", "text", 0, 5)[0];
//work//project.Variables["test"].Value = a.Parse("//node[@class='android.view.View']", "text", 0, 5)[0];

//project.Variables["test"].Value = a.Parse("//node[@class='android.view.View']", "text", 0, 5)[0];
//project.Lists["parse"].AddRange(a.Parse("//node[contains(@package='com.microsoft.xboxone.smartglass')]", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды
//project.Lists["parse"].AddRange(a.Parse("//node[contains(@package='com.microsoft.xboxone.smartglass') and @class='android.view.View']", "resource-id", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды
//a.Click("//node[@resource-id='idSIButton9' and @package='com.microsoft.xboxone.smartglass']", 0, 10); //XPath, Index, Секунды
//project.Variables["test"].Value = a.Parse("//node[@text='Your%saccount%sor%spassword%sis%sincorrect' and @class='android.view.View']", "text", 0, 5);
//project.Lists["parse"].AddRange(a.Parse("//node[contains(@package='com.microsoft.xboxone.smartglass')]", "text", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды
Гуру помогите, решение без разницы какое, хоть в переменную, хоть в список
За ранее спасибо
 

Вложения

  • 57,6 КБ Просмотры: 188

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Ошибка в коде:
Компиляция кода Ошибка в действии "CS0103" "Имя "app" отсутствует в текущем контексте". [Строка: 2; Cтолбец: 49]

Может я не правильно объяснил.Пример. Установлено скажем 5 клонов приложений:
1-com.mazilla.android.mazillaex
2-com.mazilla.android.mazillaey
3-com.mazilla.android.mazillaez
4-com.mazilla.android.mazillaev
5-com.mazilla.android.mazillaeu

Чтобы не делать отдельные шаблоны, в кубиках c#,где нужны действия, после resource-id=вставляем название пакета ,который выше,окончание которого (mazilla....) берётся из переменной.Вот.Поэтому переменная обязательна.Вот как её сделать?
Можно без переменной, как я выше указал, через contains делать (то есть проверять на содержание определенных символов)

По поводу ошибки имя app. Внимательно посмотри код, который тебе прислали. Там
string app = project.Variables["app_name"].Value;

и это не контекст. Тебе просто надо было скопировать код присланный и должно было работать. А в переменную app_name твоё значение.
 

WLDN

Client
Регистрация
09.07.2015
Сообщения
357
Благодарностей
566
Баллы
93
Приветствую
Подскажите как спарсить этот текст "Your account or password is incorrect. If you don't remember your password, "

Перепробовал этот вариант в переменную - нет получилось
Пробовал вариант как выше был пример со списком - не получилось
Все время сыпятся ошибки
Вот что пробовал, все что закоментированно тоже не работает


C#:
var a = project.Context["ADB"];

project.Variables["test"].Value = driver.FindElementByXPath("//android.view.View[contains(@package, 'com.microsoft.xboxone.smartglass')]").GetAttribute("text");
//project.Variables["test"].Value = a.Parse("//node[@package='com.microsoft.xboxone.smartglass']", "text", 0, 5)[0];
//work//project.Variables["test"].Value = a.Parse("//node[@class='android.view.View']", "text", 0, 5)[0];

//project.Variables["test"].Value = a.Parse("//node[@class='android.view.View']", "text", 0, 5)[0];
//project.Lists["parse"].AddRange(a.Parse("//node[contains(@package='com.microsoft.xboxone.smartglass')]", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды
//project.Lists["parse"].AddRange(a.Parse("//node[contains(@package='com.microsoft.xboxone.smartglass') and @class='android.view.View']", "resource-id", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды
//a.Click("//node[@resource-id='idSIButton9' and @package='com.microsoft.xboxone.smartglass']", 0, 10); //XPath, Index, Секунды
//project.Variables["test"].Value = a.Parse("//node[@text='Your%saccount%sor%spassword%sis%sincorrect' and @class='android.view.View']", "text", 0, 5);
//project.Lists["parse"].AddRange(a.Parse("//node[contains(@package='com.microsoft.xboxone.smartglass')]", "text", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды
Гуру помогите, решение без разницы какое, хоть в переменную, хоть в список
За ранее спасибо
var a = project.Context["ADB"];

project.Lists["parse"].AddRange(a.Parse("//node[contains(@package,'com.microsoft.xboxone.smartglass') and @index='0']", "text", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды

Синтаксис не верный был для contains.
 
  • Спасибо
Реакции: ErikMoor

ErikMoor

Client
Регистрация
24.03.2016
Сообщения
123
Благодарностей
22
Баллы
18
var a = project.Context["ADB"];

project.Lists["parse"].AddRange(a.Parse("//node[contains(@package,'com.microsoft.xboxone.smartglass') and @index='0']", "text", 0, 5)); //XPath, какой аттрибут парсить, Index, Секунды

Синтаксис не верный был для contains.
Спасибо. Все работает. Ура
_________________________________________

Возможно кто то не просто знает, но и подскажет
Как в таком варианте подружить это все дело с MEMU а не с Nox ?
 
Последнее редактирование:

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