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

Господа, подскажите как сделать в отладчике Appium'a ноу ресет для приложения? Чтобы при включении отладчика не сбрасывался кэш приложения, а все введённые данные сохранялись и можно было продолжить с того же места.
 
Господа, подскажите как сделать в отладчике Appium'a ноу ресет для приложения? Чтобы при включении отладчика не сбрасывался кэш приложения, а все введённые данные сохранялись и можно было продолжить с того же места.

Код:
Развернуть Свернуть Копировать
cap.SetCapability("noReset", "True");
 
  • Спасибо
Реакции: Donalddick и avtostopshik
Нашел интересный материал по XPath, где подробнейшим образом описаны всевозможные способы поиска элементов.
http://www.software-testing-tutoria...5/10/ui-automator-viewer-get-android-app.html
Вот мне интересно, стоит ли при составлении путей, искать через всякие class, id, resourse-id, index и тому подобное, или достаточно простого xpath пути, который тот же отладчик аппиума предлагает? Как вы считаете, что стабильней работать будет?

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

Где-то на страницах предлагали такое решение. Оптимальнее не нашел, есть есть лучше поделитесь:

if (driver.FindElementsById("id/cancel").Count>0){
// Элемент есть.
}
 
  • Спасибо
Реакции: avtostopshik
Суть проблемы. Работает один эмулятор Memu, все ок. Но иногда нужно запустить 2й эмулятор, или Nox в ручном режиме.
Т.е. начинает стартовать что-то еще и первый эмулятор отваливается по ошибке (если в данные момент appium работает).
Может кто-то подскажет в какую сторону копать?
 
Суть проблемы. Работает один эмулятор Memu, все ок. Но иногда нужно запустить 2й эмулятор, или Nox в ручном режиме.
Т.е. начинает стартовать что-то еще и первый эмулятор отваливается по ошибке (если в данные момент appium работает).
Может кто-то подскажет в какую сторону копать?
При запуске эмулятор начинает подгружать своё adb и получается,что 1 экземпляр adb убивается другим.
Решение такое: нужно удалить встроенный adb с папок эмуляторов,чтоб они юзали стандартный adb, если он не настроен,то тоже нужно настраивать конечно. Иногда при таком способе эмуляторы не появляются в adb, поэтому нужно будет использовать команду: adb connect имя_устройства с портом
 
  • Спасибо
Реакции: Fantomass и smotrimail
Где-то на страницах предлагали такое решение. Оптимальнее не нашел, есть есть лучше поделитесь:

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

А кто-нибудь знает, как по индексу элементы искать? То есть, к примеру, здесь индекс десятый:
Appium 2019-05-15 12.10.19.png
И вот как используя этот индекс можно найти элемент? В том плане, что в коде прописать? Нету ведь метода типа FindElementByIndex
 
Последнее редактирование:
  • Спасибо
Реакции: avtostopshik
При запуске эмулятор начинает подгружать своё adb и получается,что 1 экземпляр adb убивается другим.
Решение такое: нужно удалить встроенный adb с папок эмуляторов,чтоб они юзали стандартный adb, если он не настроен,то тоже нужно настраивать конечно. Иногда при таком способе эмуляторы не появляются в adb, поэтому нужно будет использовать команду: adb connect имя_устройства с портом
Спасибо! Работает!
 
А вот такой вопрос по сложнее - можно ли как-то с помощью тех же айди атрибутов, классов и прочего, составлять многосложные выражения? Пример:
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 можно ли такое же составлять?
 
Господа, кто знает, через что нужно элементы искать и нажимать по ним, чтобы быстро было? Что самое быстрое из того, что мы можем использовать в мобильном приложении?
А то пути через XPath - нажатие на элемент срабатывает через 7-10 секунд, а в моей задаче это не подходит. Нужно чтобы быстро было. Что вместо FindElementByXPath стоит в таком случае использовать?
 
Парни подскажите плиз. В доках написано что

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 правильно, но не могу найти что
 
Господа, кто знает, через что нужно элементы искать и нажимать по ним, чтобы быстро было? Что самое быстрое из того, что мы можем использовать в мобильном приложении?
А то пути через XPath - нажатие на элемент срабатывает через 7-10 секунд, а в моей задаче это не подходит. Нужно чтобы быстро было. Что вместо FindElementByXPath стоит в таком случае использовать?
Если ты используешь обновленные библиотеки с этого поста (и ниже) https://zennolab.com/discussion/thr...i-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
Если ты используешь обновленные библиотеки с этого поста (и ниже) https://zennolab.com/discussion/thr...i-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); тапает с задержкой а нужно просто быстрый клик. Не встречали такого и как решить ?
 
Если ты используешь обновленные библиотеки с этого поста (и ниже) https://zennolab.com/discussion/thr...i-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();
Может быть вам известно, почему?
 
Последнее редактирование:
Короче после всех манипуляций пишет:
An error occurred while reading a response from ADB: unknown host service
То есть почему-то он стал на ADB ругаться. Неужели вы не сталкивались с такой же проблемой при переходе на новый драйвер?
 
Коллеги, подскажите, если у прилы выскакивает реклама после рандомного количества кликов в приложении, она разная нельзя 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();
}
 
Подскажите как спарсить номера из приложения.
Был подобный пример
Код:
Развернуть Свернуть Копировать
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 элементов удовлетворяющих параметру поиска.
 
Здравствуйте! Подскажите пожалуйста в чем проблема. Не получается запустить команду adb devices(сделано по инструкции) - http://prntscr.com/nw91fh.
Если пробую как в инструкции прописать android - http://prntscr.com/nw91mv sdk запускается.
Пробовал с подключенным телефоном(отладку по usb включил) и BlueStacks.
Путь в переменной прописал правильно http://prntscr.com/nw936g
Заранее спасибо за помощь
 
Здравствуйте! Подскажите пожалуйста в чем проблема. Не получается запустить команду 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
 
Прописал полный пусть, также ничего не происходит http://prntscr.com/nwqyy7 (путь указан правильно)
подскажите где искать проблему? может кто сталкивался с таким.
 
Не получается запустить команду adb devices(сделано по инструкции)
Подключал на семерке, не на одной машине, подключал на десятке, строго по инструкции из этой темы, все всегда работает.
Не правильно добавляете пути в переменные среды, ну или грешны, батенька :bt:
 
Пожалуйста ткните носом что делаю не правильно?
В самом первом посте этой темы, в восьмой строчке есть ссылка как прописывать переменные, можете посмотреть видео на ютубе.
 
А кто ни будь знает, как можно сделать ожидание не какого-то конкретного элемента, а 1 из 3 к примеру? После выполнения определенного действия есть несколько вариантов развития событий, могу открыться три разных окна.
Можно конечно поставить паузу и после нее через if проверить какой именно сейчас элемент на странице, но время ожидания бывает разное, окно может появится чрез 2 секунды, а может и через 20, т.е если пазу ставить, то максимальную, чего не хотелось бы делать. Методом с wait.Until было бы намного продуктивнее сделать, но как ему сказать, что нужен не конкретный элемент, а любой из трех ??
 
А кто ни будь знает, как можно сделать ожидание не какого-то конкретного элемента, а 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
Не получается запустить у себя на пк. Буду пробовать установить на сервер. Кто подскажет хороший недорогой сервер. Необходима работа с одним приложением через BlueStacks.
 

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