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

Где-то забыл вызвать Context. Вероятно не в этом кубике.
Благодарю! Вы как всегда на высоте с помощью).И да,Вы правы-не заметил отсутствие строки в одном из кубиков.Ещё раз спасибо!
 
  • Спасибо
Реакции: WLDN
А можна ещё один такой вопрос: (просмотрел все 8 страниц-на нашёл ответа). Нужно сделать клик в приложении по имени.Как правильно код прописать, (без клика по координатам)
Клик.jpg
? (на скрине)
 
А можна ещё один такой вопрос: (просмотрел все 8 страниц-на нашёл ответа). Нужно сделать клик в приложении по имени.Как правильно код прописать, (без клика по координатам) Посмотреть вложение 61577? (на скрине)
a.Click("//node[@text='Kari']", 0, 15); //XPath, Index, Seconds
 
  • Спасибо
Реакции: Szerzs
А можна ещё один такой вопрос: (просмотрел все 8 страниц-на нашёл ответа). Нужно сделать клик в приложении по имени.Как правильно код прописать, (без клика по координатам) Посмотреть вложение 61577? (на скрине)
var a = project.Context["ADB"];
a.Click("//node[@text='Kari' and @class='android.widget.TextView']", 0, 10);
 
  • Спасибо
Реакции: Ruhas, Szerzs и WLDN
Как правильно код прописать, (без клика по координатам)
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) Еще этом стоит помнить, что порядок в списке сообщений (как и координаты) изменяется при появлении новых сообщений. :-)
 
У меня такой вопрос по отправке текстового сообщения: при выполнении снипета
a.Text(project.Variables["message"].Value); //ввод текста
a.KeyEvent("66"); //Enter
не пишется текст вида ААА (как пример), а только такого вида пишется и отправляется: А_А_А (текст на английском).Интересно,это из-за приложения или нужно версию NOX менять? И вообще-решаема эта проблема?
 
У меня такой вопрос по отправке текстового сообщения: при выполнении снипета
a.Text(project.Variables["message"].Value); //ввод текста
a.KeyEvent("66"); //Enter
не пишется текст вида ААА (как пример), а только такого вида пишется и отправляется: А_А_А (текст на английском).Интересно,это из-за приложения или нужно версию NOX менять? И вообще-решаема эта проблема?
Может быть, что нужно экранировать вводимые символы с помощью \ перед вводимым символом. Или заменить пробелы на %s (например, если проблема связана с ними)
 
Благодарю! Вы как всегда на высоте с помощью).И да,Вы правы-не заметил отсутствие строки в одном из кубиков.Ещё раз спасибо!
Если кликать по юникод имени, то тут нужно обратно конвертировать 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, Секунды
 
Последнее редактирование:
Я хотел было решить клики по имени по другому: спарсил имена в список,оттуда по одному в переменную,а уже переменную в код (в переменную 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 вставлять-то?))
 
Я хотел было решить клики по имени по другому: спарсил имена в список,оттуда по одному в переменную,а уже переменную в код (в переменную 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
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
а можно как-нибудь ускорить процесс (parse, click), когда идёт выход по красной ветке, кроме как указать 1 секунду?
потому что очень заметна разница между удачной обработкой экшена и неудачной.
не знаю правильно ли я объяснил ситуацию)
 
а можно как-нибудь ускорить процесс (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

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

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[@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
Хотел бы ещё уточнить по поводу переменных.Скажем у меня установлены несколько клонов приложений.И чтобы сделать клик в одном приложении,нужен код:

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
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....) берётся из переменной.Вот.Поэтому переменная обязательна.Вот как её сделать?
 
Последнее редактирование:
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, Секунды

Вот так ещё можно сделать без переменной
-
 
Последнее редактирование:
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, Секунды

Гуру помогите, решение без разницы какое, хоть в переменную, хоть в список
За ранее спасибо
 

Вложения

  • 2.png
    2.png
    57,6 KB · Просмотры: 274
Ошибка в коде:
Компиляция кода Ошибка в действии "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 твоё значение.
 
Приветствую
Подскажите как спарсить этот текст "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
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 ?
 
Последнее редактирование:

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