4 место Управление любыми Android приложениями на смартфоне из ZP

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
793
Благодарностей
136
Баллы
43
Господа, подскажите как сделать в отладчике Appium'a ноу ресет для приложения? Чтобы при включении отладчика не сбрасывался кэш приложения, а все введённые данные сохранялись и можно было продолжить с того же места.
 

Assassin

Client
Регистрация
17.11.2011
Сообщения
24
Благодарностей
3
Баллы
3
Господа, подскажите как сделать в отладчике Appium'a ноу ресет для приложения? Чтобы при включении отладчика не сбрасывался кэш приложения, а все введённые данные сохранялись и можно было продолжить с того же места.
Код:
cap.SetCapability("noReset", "True");
 
  • Спасибо
Реакции: Donalddick и avtostopshik

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
793
Благодарностей
136
Баллы
43
Нашел интересный материал по XPath, где подробнейшим образом описаны всевозможные способы поиска элементов.
http://www.software-testing-tutorials-automation.com/2015/10/ui-automator-viewer-get-android-app.html
Вот мне интересно, стоит ли при составлении путей, искать через всякие class, id, resourse-id, index и тому подобное, или достаточно простого xpath пути, который тот же отладчик аппиума предлагает? Как вы считаете, что стабильней работать будет?

И второй вопрос - не понятно, существует ли какой-то метод для проверки, существует элемент или нет? Типа element.IsVoid
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113

smotrimail

Client
Регистрация
06.02.2017
Сообщения
36
Благодарностей
6
Баллы
8
И второй вопрос - не понятно, существует ли какой-то метод для проверки, существует элемент или нет? Типа element.IsVoid
Где-то на страницах предлагали такое решение. Оптимальнее не нашел, есть есть лучше поделитесь:

if (driver.FindElementsById("id/cancel").Count>0){
// Элемент есть.
}
 
  • Спасибо
Реакции: avtostopshik

smotrimail

Client
Регистрация
06.02.2017
Сообщения
36
Благодарностей
6
Баллы
8
Суть проблемы. Работает один эмулятор Memu, все ок. Но иногда нужно запустить 2й эмулятор, или Nox в ручном режиме.
Т.е. начинает стартовать что-то еще и первый эмулятор отваливается по ошибке (если в данные момент appium работает).
Может кто-то подскажет в какую сторону копать?
 

lybimiy86

Client
Регистрация
29.10.2016
Сообщения
97
Благодарностей
187
Баллы
33
Суть проблемы. Работает один эмулятор Memu, все ок. Но иногда нужно запустить 2й эмулятор, или Nox в ручном режиме.
Т.е. начинает стартовать что-то еще и первый эмулятор отваливается по ошибке (если в данные момент appium работает).
Может кто-то подскажет в какую сторону копать?
При запуске эмулятор начинает подгружать своё adb и получается,что 1 экземпляр adb убивается другим.
Решение такое: нужно удалить встроенный adb с папок эмуляторов,чтоб они юзали стандартный adb, если он не настроен,то тоже нужно настраивать конечно. Иногда при таком способе эмуляторы не появляются в adb, поэтому нужно будет использовать команду: adb connect имя_устройства с портом
 
  • Спасибо
Реакции: Fantomass и smotrimail

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
793
Благодарностей
136
Баллы
43
Где-то на страницах предлагали такое решение. Оптимальнее не нашел, есть есть лучше поделитесь:

if (driver.FindElementsById("id/cancel").Count>0){
// Элемент есть.
}
Спасибо, это работает.

А кто-нибудь знает, как по индексу элементы искать? То есть, к примеру, здесь индекс десятый:
Appium 2019-05-15 12.10.19.png
И вот как используя этот индекс можно найти элемент? В том плане, что в коде прописать? Нету ведь метода типа FindElementByIndex
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 518
Благодарностей
3 371
Баллы
113
Последнее редактирование:
  • Спасибо
Реакции: avtostopshik

smotrimail

Client
Регистрация
06.02.2017
Сообщения
36
Благодарностей
6
Баллы
8
При запуске эмулятор начинает подгружать своё adb и получается,что 1 экземпляр adb убивается другим.
Решение такое: нужно удалить встроенный adb с папок эмуляторов,чтоб они юзали стандартный adb, если он не настроен,то тоже нужно настраивать конечно. Иногда при таком способе эмуляторы не появляются в adb, поэтому нужно будет использовать команду: adb connect имя_устройства с портом
Спасибо! Работает!
 

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
793
Благодарностей
136
Баллы
43
А вот такой вопрос по сложнее - можно ли как-то с помощью тех же айди атрибутов, классов и прочего, составлять многосложные выражения? Пример:
Appium.png
Допустим я пишу driver.FindElementById("table_bet_display_cards_sum_banker"), то есть это цифра один на скрине. Но найти мне нужно то, на что указывает на скрине цифра два. Как мне продолжить выражение, чтобы после обозначенного в выражении айди сослаться на следующий конкретный элемент? Этот элемент не имеет айди, классов и других полезных атрибутов. Возможно его можно найти по индексу. Возможно к нему от обозначенного айди table_bet_display_cards_sum_banker можно составить [уже] короткий XPath.
И хочу добавить, что я имею ввиду. На страницах этой ветки есть такой пример:
Код:
driver.FindElementByAndroidUIAutomator("new UiSelector().resourceId(\"conversations_row_message_count\").fromParent(new UiSelector().className(\"android.widget.LinearLayout\"))").Click();
П
В этом примере UiSelector используем - тут идёт продолжение и через .fromParent идёт обращение к классу .className(\"android.widget.LinearLayout\")
В случае с FindElementById и/или FindElementByXPath можно ли такое же составлять?
 

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
793
Благодарностей
136
Баллы
43
Господа, кто знает, через что нужно элементы искать и нажимать по ним, чтобы быстро было? Что самое быстрое из того, что мы можем использовать в мобильном приложении?
А то пути через XPath - нажатие на элемент срабатывает через 7-10 секунд, а в моей задаче это не подходит. Нужно чтобы быстро было. Что вместо FindElementByXPath стоит в таком случае использовать?
 

lzlmrf

Client
Регистрация
14.08.2015
Сообщения
488
Благодарностей
149
Баллы
43
Парни подскажите плиз. В доках написано что

TouchAction
TouchAction objects contain a chain of events.

In all the appium client libraries, touch objects are created and are given a chain of events.

The available events from the spec are: * press * release * moveTo * tap * wait * longPress * cancel * perform

Here's an example of creating an action in pseudocode:

TouchAction().press(el0).moveTo(el1).release()

Но как обратиться ?
Я так понимаю что надо прописать в using правильно, но не могу найти что
 

lybimiy86

Client
Регистрация
29.10.2016
Сообщения
97
Благодарностей
187
Баллы
33
Господа, кто знает, через что нужно элементы искать и нажимать по ним, чтобы быстро было? Что самое быстрое из того, что мы можем использовать в мобильном приложении?
А то пути через XPath - нажатие на элемент срабатывает через 7-10 секунд, а в моей задаче это не подходит. Нужно чтобы быстро было. Что вместо FindElementByXPath стоит в таком случае использовать?
Если ты используешь обновленные библиотеки с этого поста (и ниже) https://zennolab.com/discussion/threads/upravlenie-ljubymi-android-prilozhenijami-na-smartfone-iz-zp.33511/page-7#post-280749
То попробуй сменить драйвер, он работает быстрее:
PHP:
cap.SetCapability("automationName","UiAutomator2");
Инициализировать Action и попробовать через него кликать. В этом посте смотри как это сделать https://zennolab.com/discussion/threads/c-kak-pravilno-inicializirovat-klass.39565/#post-434362
 
Последнее редактирование:
  • Спасибо
Реакции: avtostopshik

lzlmrf

Client
Регистрация
14.08.2015
Сообщения
488
Благодарностей
149
Баллы
43
Если ты используешь обновленные библиотеки с этого поста (и ниже) https://zennolab.com/discussion/threads/upravlenie-ljubymi-android-prilozhenijami-na-smartfone-iz-zp.33511/page-7#post-280749
То попробуй сменить драйвер, он работает быстрее:
PHP:
cap.SetCapability("automationName","UiAutomator2");
да согласен. Тоже заметил что скорость увеличилась существенно. Но У меня проблема возникла . Перестал работать Tap как нужно. driver.Tap(1,el_x-80,el_y+20,1); тапает с задержкой а нужно просто быстрый клик. Не встречали такого и как решить ?
 

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
793
Благодарностей
136
Баллы
43
Если ты используешь обновленные библиотеки с этого поста (и ниже) https://zennolab.com/discussion/threads/upravlenie-ljubymi-android-prilozhenijami-na-smartfone-iz-zp.33511/page-7#post-280749
То попробуй сменить драйвер, он работает быстрее:
PHP:
cap.SetCapability("automationName","UiAutomator2");
Инициализировать Action и попробовать через него кликать. В этом посте смотри как это сделать https://zennolab.com/discussion/threads/c-kak-pravilno-inicializirovat-klass.39565/#post-434362
Спасибо! Строчку
Код:
cap.SetCapability("automationName","UiAutomator2");
просто добавить снизу нужно, а не заменить ею какую-то другую? Я просто добавил, теперь ошибка вылезает:
An unknown server-side error occurred while processing the command. Original error: Could not find aapt Please set the ANDROID_HOME environment variable with the Android SDK root directory path.
UP: с ошибкой разобрался, создал переменную ANDROID_HOME с нужным значением и переменную PATH отредактировал. Приложение стало запускаться, однако любые клики по кнопкам перестали работать - пишет, что не может найти путь к ним. К примеру такой клик не работает:
Код:
driver.FindElementById("Open navigation drawer").Click();
Может быть вам известно, почему?
 
Последнее редактирование:

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
793
Благодарностей
136
Баллы
43
Короче после всех манипуляций пишет:
An error occurred while reading a response from ADB: unknown host service
То есть почему-то он стал на ADB ругаться. Неужели вы не сталкивались с такой же проблемой при переходе на новый драйвер?
 

vetruvian

Client
Регистрация
23.09.2010
Сообщения
33
Благодарностей
3
Баллы
8
Коллеги, подскажите, если у прилы выскакивает реклама после рандомного количества кликов в приложении, она разная нельзя 100% указать элемент закрытия рекламы, как можно ее отследить?
Пробывал как бы по елементу меню приложения, если есть то продолжаем если нет то нажимаем Назад, но при таких вариантах идет или ошибка или в логе appium видно что оно не находит элемента и крутит пока WebDriverWait не закончиться .
Код:
if(driver.FindElementsByXPath("//android.widget.ImageButton[contains(@content-desc, 'Open')]").Count>0){
тут продлжаем
}
else { //тут жмем назад если есть реклама
            ProcessStartInfo startInfo1 = new ProcessStartInfo();
            startInfo1.FileName = @"adb.exe";
            startInfo1.Arguments = @"shell input keyevent 4";//параметры выполнения adb команды
            startInfo1.WindowStyle = ProcessWindowStyle.Hidden;//скрываем окно выполнения
            Process.Start(startInfo1).WaitForExit();
}
 

lustVVV

Client
Регистрация
19.06.2018
Сообщения
46
Благодарностей
33
Баллы
18
Подскажите как спарсить номера из приложения.
Был подобный пример
Код:
IZennoList listElements = project.Lists["Список 2"]; // создаём объект lstTest типа IZennoList и привязываем его к списку проекта
var elements = driver.FindElementsByXPath("//android.widget.TextView[contains(@resource-id, 'mobi.chat:id/count_members')]"); // ищем все совпадения и сохраняем их в переменную elements
foreach(string oneElement in elements) // делаем перебор коллекции
{
listElements.Add(oneElement.GetAttribute("text")); // добавляем каждый элемент в конец списка
}
Выводит ошибку: Ошибка в действии "CS1061" ""string" не содержит определение для "GetAttribute". Не удалось найти метод расширения "GetAttribute", принимающий первый аргумент типа "string" (пропущена директива using или ссылка на сборку?)"

Такой пример выводит только 1 значение.
Код:
project.Variables["username"].Value = driver.FindElementByXPath("//android.widget.TextView[contains(@resource-id, 'mobi.chat:id/count_members')]").GetAttribute("text");
Попытка добавить номер совпадения
Код:
project.Variables["username"].Value = driver.FindElementByXPath("//android.widget.TextView[contains(@resource-id, 'mobi.chat:id/count_members')][3]").GetAttribute("text");
Выводит ошибку An element could not be located on the page using the given search parameters. Хотя на странице 15 элементов удовлетворяющих параметру поиска.
 

stas11

Client
Регистрация
31.03.2013
Сообщения
188
Благодарностей
5
Баллы
18
Здравствуйте! Подскажите пожалуйста в чем проблема. Не получается запустить команду adb devices(сделано по инструкции) - http://prntscr.com/nw91fh.
Если пробую как в инструкции прописать android - http://prntscr.com/nw91mv sdk запускается.
Пробовал с подключенным телефоном(отладку по usb включил) и BlueStacks.
Путь в переменной прописал правильно http://prntscr.com/nw936g
Заранее спасибо за помощь
 

vetruvian

Client
Регистрация
23.09.2010
Сообщения
33
Благодарностей
3
Баллы
8
Здравствуйте! Подскажите пожалуйста в чем проблема. Не получается запустить команду adb devices(сделано по инструкции) - http://prntscr.com/nw91fh.
Если пробую как в инструкции прописать android - http://prntscr.com/nw91mv sdk запускается.
Пробовал с подключенным телефоном(отладку по usb включил) и BlueStacks.
Путь в переменной прописал правильно http://prntscr.com/nw936g
Заранее спасибо за помощь
Надо в cmd полный путь к adb указывать C:\sdk\platform-tools\adb devices ну или где он там у тебя или cd C:\sdk\platform-tools , а потом adb devices
 

stas11

Client
Регистрация
31.03.2013
Сообщения
188
Благодарностей
5
Баллы
18
Прописал полный пусть, также ничего не происходит http://prntscr.com/nwqyy7 (путь указан правильно)
подскажите где искать проблему? может кто сталкивался с таким.
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Не получается запустить команду adb devices(сделано по инструкции)
Подключал на семерке, не на одной машине, подключал на десятке, строго по инструкции из этой темы, все всегда работает.
Не правильно добавляете пути в переменные среды, ну или грешны, батенька :bt:
 

stas11

Client
Регистрация
31.03.2013
Сообщения
188
Благодарностей
5
Баллы
18
Пожалуйста ткните носом что делаю не правильно?
здесь расположена программа http://prntscr.com/nwwpa4
так прописан путь к переменным http://prntscr.com/nwwpoj
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 100
Благодарностей
649
Баллы
113
Пожалуйста ткните носом что делаю не правильно?
В самом первом посте этой темы, в восьмой строчке есть ссылка как прописывать переменные, можете посмотреть видео на ютубе.
 

irving zisman

Client
Регистрация
18.05.2017
Сообщения
225
Благодарностей
28
Баллы
28
А кто ни будь знает, как можно сделать ожидание не какого-то конкретного элемента, а 1 из 3 к примеру? После выполнения определенного действия есть несколько вариантов развития событий, могу открыться три разных окна.
Можно конечно поставить паузу и после нее через if проверить какой именно сейчас элемент на странице, но время ожидания бывает разное, окно может появится чрез 2 секунды, а может и через 20, т.е если пазу ставить, то максимальную, чего не хотелось бы делать. Методом с wait.Until было бы намного продуктивнее сделать, но как ему сказать, что нужен не конкретный элемент, а любой из трех ??
 

lybimiy86

Client
Регистрация
29.10.2016
Сообщения
97
Благодарностей
187
Баллы
33
А кто ни будь знает, как можно сделать ожидание не какого-то конкретного элемента, а 1 из 3 к примеру? После выполнения определенного действия есть несколько вариантов развития событий, могу открыться три разных окна.
Можно конечно поставить паузу и после нее через if проверить какой именно сейчас элемент на странице, но время ожидания бывает разное, окно может появится чрез 2 секунды, а может и через 20, т.е если пазу ставить, то максимальную, чего не хотелось бы делать. Методом с wait.Until было бы намного продуктивнее сделать, но как ему сказать, что нужен не конкретный элемент, а любой из трех ??
PHP:
//Количество циклов проверки
int x1 = 10;
while (x1 > 0){
    // 1 Элемент
    if (driver.FindElementsByXPath("//android.widget.Button[contains(@resource-id, 'ReferrerMainButton')]").Count>0){
        break;
    }
    // 2 Элемент
    if (driver.FindElementsByXPath("//android.widget.Button[contains(@resource-id, 'ReferrerMainButton')]").Count>0){
        break;
    }
    // 3 Элемент
    if (driver.FindElementsByXPath("//android.widget.Button[contains(@resource-id, 'ReferrerMainButton')]").Count>0){
        break;
    }
    //Пауза перед каждым циклом, в данном случае 1 секунда. Если x1 = 10, то цикл будет выполняться 10 раз с разницей между выполнениями 1 секунда. Можно ускорить конечно,если нужно 
    System.Threading.Thread.Sleep(1000);
    x1--;
}
//Если ничего не найдено - выполняем тело цикла, в данном случае исключение
if (x1 == 0){
    throw new Exception("Выход по ошибке");
}
 
  • Спасибо
Реакции: Solomon21 и irving zisman

stas11

Client
Регистрация
31.03.2013
Сообщения
188
Благодарностей
5
Баллы
18
Не получается запустить у себя на пк. Буду пробовать установить на сервер. Кто подскажет хороший недорогой сервер. Необходима работа с одним приложением через BlueStacks.
 

avtostopshik

Client
Регистрация
09.09.2016
Сообщения
793
Благодарностей
136
Баллы
43

Koqpe

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

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