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

bas2006

Client
Регистрация
27.12.2017
Сообщения
40
Благодарностей
3
Баллы
8
Хелп! тему освоил, все получается, кроме этого Xpath. Нужно кликнуть на элемент с индексом 1, при условии что у сестринского элемента (это так же ведь называется?) contains(@text, 'Открыто'). У обоих элементов доступен resource-id и text. Не пойму как сделать условие, т.к. таких элементов много. Гуглил, не знаю как правильно спросить и там все примеры не для андроид приложений, что усложняет понимание. За статью огромное спасибо, с аппиумом тоже не понравилось, хотя разобрался. В следующем конкурсе расскажи как на запросах работаешь с приложениями и что делать с шифрованными токенами.
2021-07-30_04-26-32.png
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 680
Благодарностей
1 863
Баллы
113
Хелп! тему освоил, все получается, кроме этого Xpath. Нужно кликнуть на элемент с индексом 1, при условии что у сестринского элемента (это так же ведь называется?) contains(@text, 'Открыто'). У обоих элементов доступен resource-id и text. Не пойму как сделать условие, т.к. таких элементов много. Гуглил, не знаю как правильно спросить и там все примеры не для андроид приложений, что усложняет понимание. За статью огромное спасибо, с аппиумом тоже не понравилось, хотя разобрался. В следующем конкурсе расскажи как на запросах работаешь с приложениями и что делать с шифрованными токенами. Посмотреть вложение 80689
Так сначала проверяете наличие нужного элемента, и потом уже кликаете на другой. При составлении xpath, задача как раз составить такой путь, что будет находиться всего один нужный элемент.
 

bas2006

Client
Регистрация
27.12.2017
Сообщения
40
Благодарностей
3
Баллы
8
Так сначала проверяете наличие нужного элемента, и потом уже кликаете на другой.
У этих двух элементов есть общий родитель с одинаковым индексом. Мне видится такая логика - сначала получаем индекс родителя первого, затем проверяем атрибут текст у второго, получая его не прямо, а через путь с найденным индексом родителя. Проверить атрибут второго я знаю как, через a.Wait. А вот как получить индекс родителя не знаю.
 

radv

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

bas2006

Client
Регистрация
27.12.2017
Сообщения
40
Благодарностей
3
Баллы
8
Нужно составлять универсальный XPath, чтобы найти уникальный. И можно использовать существуюшие индексы. В Mobile App Xpath Helper такие пути легко проверять
с помощью твоего хелпера я смогу найти индекс родителя по дочернему элементу, с учетом того что индекс может изменяться, не статичен. У тебя там акция на годовую лицензию еще есть?
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 680
Благодарностей
1 863
Баллы
113
с учетом того что индекс может изменяться, не статичен.
Значит лучше привязываться к элементам с постоянным индексом. Может выше/ниже по дереву элементов.
У тебя там акция на годовую лицензию еще есть?
Пока есть, Скоро закончится.
 

bas2006

Client
Регистрация
27.12.2017
Сообщения
40
Благодарностей
3
Баллы
8
Значит лучше привязываться к элементам с постоянным индексом. Может выше/ниже по дереву элементов.
Пока есть, Скоро закончится.
Давай если я до 3-4 числа ничего не придумаю, то приобрету, в любом случае пригодится за год.
 

radv

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

bas2006

Client
Регистрация
27.12.2017
Сообщения
40
Благодарностей
3
Баллы
8

bas2006

Client
Регистрация
27.12.2017
Сообщения
40
Благодарностей
3
Баллы
8
По невнимательности я не заметил что могу с одного id забрать оба атрибута, для этого изменил функцию в общем коде, т.к. по умолчанию можно парсить только один.
C#:
public List<string> Parse(string XPath, string attribute, string attribute2, int index, int time){
            List<string> list = new List<string>();
            var doc = new XmlDocument();
            var receiver = new ConsoleOutputReceiver();
            bool check = true;
            for (int i=0; i<time; i++){  
                try {
                    doc = new XmlDocument();
                    receiver = new ConsoleOutputReceiver();
                   
                    AdbClient.Instance.ExecuteRemoteCommand(@"uiautomator dump /dev/tty", device, receiver);
                    doc.LoadXml(receiver.ToString().Replace("><",">\r\n<").Replace("UI hierchary dumped to: /dev/tty", ""));
                    //project.Variables["log"].Value = receiver.ToString(); //отправляет лог
                    var ok2 = doc.SelectNodes(XPath)[index].Attributes;
                    check = false;
                    break;
                    } catch (Exception e) {
                        Thread.Sleep(1000);
                        }
                    }
           
            if (check)
                throw new Exception("Can't find element");

        XmlNodeList ok = doc.SelectNodes(XPath);
            foreach (XmlNode t in ok){
                string s1 = (t.Attributes[attribute].Value);
                string s2 = (t.Attributes[attribute2].Value);
                string s3 = s1 + ";" + s2;
                list.Add(s3); //каждое значение аттрибута узла добавляем в список на вывод
               
            }
            return list;
           
        }
C#:
project.Lists["parse_name"].AddRange(a.Parse("//node[@resource-id=' ']", "text", "content-desc", 0, 2));
 
Последнее редактирование:
  • Спасибо
Реакции: trecho и WLDN

bas2006

Client
Регистрация
27.12.2017
Сообщения
40
Благодарностей
3
Баллы
8
С одним телефоном работает, с двумя:
Выполнение действия CSharp OwnCode: Connect to Phone. Значение не может быть неопределенным.
Имя параметра: host
 

Alexde

Client
Регистрация
03.11.2015
Сообщения
44
Благодарностей
20
Баллы
8
Просто красавчик!
 
  • Спасибо
Реакции: WLDN

trecho

Client
Регистрация
12.07.2018
Сообщения
171
Благодарностей
124
Баллы
43
Хелп! тему освоил, все получается, кроме этого Xpath. Нужно кликнуть на элемент с индексом 1, при условии что у сестринского элемента (это так же ведь называется?) contains(@text, 'Открыто'). У обоих элементов доступен resource-id и text. Не пойму как сделать условие, т.к. таких элементов много. Гуглил, не знаю как правильно спросить и там все примеры не для андроид приложений, что усложняет понимание. За статью огромное спасибо, с аппиумом тоже не понравилось, хотя разобрался. В следующем конкурсе расскажи как на запросах работаешь с приложениями и что делать с шифрованными токенами. Посмотреть вложение 80689
а вот так пробовал?
a.Click("//node[contains(@text, 'Открыто')]/preceding-sibling::node[@index='1']", 0, 10));
 

Jack_Dream

Client
Регистрация
05.12.2021
Сообщения
332
Благодарностей
28
Баллы
28
Чтобы русский текст заработал, достаточно перезалить в старый проект (с первой части этой статьи) новый файл SharpAdbClient.dll с этого проекта?
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 680
Благодарностей
1 863
Баллы
113
можно установить adbkeyboard и активировать эту клавиатуру
 

Jack_Dream

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

radv

Client
Регистрация
11.05.2015
Сообщения
3 680
Благодарностей
1 863
Баллы
113
Установил активировал, все равно англ пишет ру нет
проверьте активацию клавиатуры, доступность установленного русского языка для ввода. может у вас только англ. установлен.
 

Jack_Dream

Client
Регистрация
05.12.2021
Сообщения
332
Благодарностей
28
Баллы
28
92081


И в емуляторе светится внизу вто клавиатура adb включена
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 680
Благодарностей
1 863
Баллы
113
А документацию к adbkeyboard смотрели? какие команды используются для ввода текста.
 
  • Спасибо
Реакции: Jack_Dream

radv

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

Вложения

Jack_Dream

Client
Регистрация
05.12.2021
Сообщения
332
Благодарностей
28
Баллы
28
А документацию к adbkeyboard смотрели? какие команды используются для ввода текста.
Там где англ там не меняется, может нокс глючный, может на мему только работет
 

Jack_Dream

Client
Регистрация
05.12.2021
Сообщения
332
Благодарностей
28
Баллы
28
Реят подскажите как семулировать нажатие на ссылке в емуляторе? Есть ссылка на канал в телеграме, как туда зайти, можно как то семулировать нажатие на ссылку?
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 680
Благодарностей
1 863
Баллы
113
ссылка это такой же элемент как и кнопки. Определяешь xpath ссылки или координаты и кликаешь ) Могут быть конечно нюансы, если ссылка внутри текста, тогда надо что то придумывать.
 

Jack_Dream

Client
Регистрация
05.12.2021
Сообщения
332
Благодарностей
28
Баллы
28
Ссылка лежит в переменной в проекте) Ее надо открыть в в емуляторе
 

kane16

Client
Регистрация
04.01.2021
Сообщения
57
Благодарностей
98
Баллы
18
  • Спасибо
Реакции: Jack_Dream и trecho

Jack_Dream

Client
Регистрация
05.12.2021
Сообщения
332
Благодарностей
28
Баллы
28
Подскажите в чем может быть проблема код:

C#:
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["Device", "serials"];
        return null;
    } catch (KeyNotFoundException ex) {
        string defaultValue = String.Empty;
        project.GlobalVariables.SetVariable("Device", "serials", defaultValue);
    
        // go to good exit if we initilized
    //    return "ok";
    }
}
При первом подключении телефона отработал норм, следующие подключения уже не работает, и тел перезагружал и зенку всеравно не работает в чем может быть проблема? Это кубик Init Global Var - Device (на смартфонах)
 

Jack_Dream

Client
Регистрация
05.12.2021
Сообщения
332
Благодарностей
28
Баллы
28
в консольной строке вбиваю тел есть, uiautomator запускаю все ок, видит тел
 

bas2006

Client
Регистрация
27.12.2017
Сообщения
40
Благодарностей
3
Баллы
8
Подскажите в чем может быть проблема код:

C#:
lock(SyncObject) {
    try {
        var gbVar = project.GlobalVariables["Device", "serials"];
        return null;
    } catch (KeyNotFoundException ex) {
        string defaultValue = String.Empty;
        project.GlobalVariables.SetVariable("Device", "serials", defaultValue);
   
        // go to good exit if we initilized
    //    return "ok";
    }
}
При первом подключении телефона отработал норм, следующие подключения уже не работает, и тел перезагружал и зенку всеравно не работает в чем может быть проблема? Это кубик Init Global Var - Device (на смартфонах)
ставь первым кубиком remove device, а вторым Init Global Var - Device и то не всегда срабатывает, допустим 3 телефона, он сделает 3 коннекта но два из них будет к одному и тому же, помогает перезапуск зенки
 

Anna4256

Client
Регистрация
08.11.2020
Сообщения
1
Благодарностей
0
Баллы
1
Кто-нибудь может помочь разобраться запуском этого проекта? Напишите, пожалуйста, в телеграм @matem321
 

Ruhas

Client
Регистрация
26.11.2019
Сообщения
622
Благодарностей
154
Баллы
43
С одним телефоном работает, с двумя:
Выполнение действия CSharp OwnCode: Connect to Phone. Значение не может быть неопределенным.
Имя параметра: host
Привет, можешь в ТГ отписать? @Rus31
 

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