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

luisa

Client
Регистрация
17.06.2019
Сообщения
42
Благодарностей
6
Баллы
8
отпишите пожалуйста кто в этом хорошо понимает
 

Zhekaz

Client
Регистрация
14.03.2016
Сообщения
107
Благодарностей
55
Баллы
28
Привет)
У сенямулятор memu, при прописке команды adb devices она срабатывает, но ответ что подключенных устройств нету, насколько понял после гугл, что нужно перенаправить порты
Просвятите как это сделать?
Заранее благодарен
P.S
Вроде все драйвера и переменные установил
 

luisa

Client
Регистрация
17.06.2019
Сообщения
42
Благодарностей
6
Баллы
8
D

Dronhik

Guest
Создал сначала свою тему, нужно сразу было тут писать, наверное)

Автоматизирую андройд приложение по данной статье, спасибо автору еще раз)

Есть с# код для автоматизации приложения на андроид, код заканчивается тем, что кликаем для подтверждения отправки проверочного смс. Следовательно далее нам нужно завершить этот экшен С# и выйти для получения смс, но потом ввести этот код в приложении нужно опять на C#. Ставлю новый экшен для этого действия именно(ввод смс), команда вот такая
C#:
driver.FindElementByXPath("//КлассОбъекта[contains(@resource-id, 'АйдиОбъекта')]").SendKeys(project.Variables["kod"].Value);
Код первого экшена C#
C#:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)
cap.SetCapability("platformVersion", "7.1");// версия платформы (тоже любая)
cap.SetCapability("platformName", "Android");//имя платформы
cap.SetCapability("appPackage", "Имя"); // пространство имен используемое приложением
cap.SetCapability("appActivity", ".Атив окно"); // активное окно
cap.SetCapability("unicodeKeyboard", "true");

AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap); // инициализируем экземпляр класса драйвера с настроечками
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//Класс[contains(@resource-id, 'Айди')]")));
driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").Click();


wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//Класс[contains(@resource-id, 'Айди')]")));
driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").SendKeys(project.Variables["number"].Value);


driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").SendKeys(project.Variables["kod_podtverd"].Value);
Если сделать во втором кубике вот так:
C#:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)


AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap);
driver.FindElementByXPath("//android.widget.EditText[contains(@resource-id, 'confirm_code_field')]").SendKeys(project.Variables["kod_podtverd"].Value);

То будет следующая ошибка: Выполнение действия CSharp OwnCode. An unknown server-side error occurred while processing the command. Original error: The desired capabilities must include either an app, appPackage or browserName

Заранее спасибо за помощь)
 
Последнее редактирование модератором:

Zhekaz

Client
Регистрация
14.03.2016
Сообщения
107
Благодарностей
55
Баллы
28
Создал сначала свою тему, нужно сразу было тут писать, наверное)

Автоматизирую андройд приложение по данной статье, спасибо автору еще раз)

Есть с# код для автоматизации приложения на андроид, код заканчивается тем, что кликаем для подтверждения отправки проверочного смс. Следовательно далее нам нужно завершить этот экшен С# и выйти для получения смс, но потом ввести этот код в приложении нужно опять на C#. Ставлю новый экшен для этого действия именно(ввод смс), команда вот такая
C#:
driver.FindElementByXPath("//КлассОбъекта[contains(@resource-id, 'АйдиОбъекта')]").SendKeys(project.Variables["kod"].Value);
Код первого экшена C#
C#:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)
cap.SetCapability("platformVersion", "7.1");// версия платформы (тоже любая)
cap.SetCapability("platformName", "Android");//имя платформы
cap.SetCapability("appPackage", "Имя"); // пространство имен используемое приложением
cap.SetCapability("appActivity", ".Атив окно"); // активное окно
cap.SetCapability("unicodeKeyboard", "true");

AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap); // инициализируем экземпляр класса драйвера с настроечками
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//Класс[contains(@resource-id, 'Айди')]")));
driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").Click();


wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//Класс[contains(@resource-id, 'Айди')]")));
driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").SendKeys(project.Variables["number"].Value);


driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").SendKeys(project.Variables["kod_podtverd"].Value);
Если сделать во втором кубике вот так:
C#:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)


AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap);
driver.FindElementByXPath("//android.widget.EditText[contains(@resource-id, 'confirm_code_field')]").SendKeys(project.Variables["kod_podtverd"].Value);

То будет следующая ошибка: Выполнение действия CSharp OwnCode. An unknown server-side error occurred while processing the command. Original error: The desired capabilities must include either an app, appPackage or browserName

Заранее спасибо за помощь)
Создал сначала свою тему, нужно сразу было тут писать, наверное)

Автоматизирую андройд приложение по данной статье, спасибо автору еще раз)

Есть с# код для автоматизации приложения на андроид, код заканчивается тем, что кликаем для подтверждения отправки проверочного смс. Следовательно далее нам нужно завершить этот экшен С# и выйти для получения смс, но потом ввести этот код в приложении нужно опять на C#. Ставлю новый экшен для этого действия именно(ввод смс), команда вот такая
C#:
driver.FindElementByXPath("//КлассОбъекта[contains(@resource-id, 'АйдиОбъекта')]").SendKeys(project.Variables["kod"].Value);
Код первого экшена C#
C#:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)
cap.SetCapability("platformVersion", "7.1");// версия платформы (тоже любая)
cap.SetCapability("platformName", "Android");//имя платформы
cap.SetCapability("appPackage", "Имя"); // пространство имен используемое приложением
cap.SetCapability("appActivity", ".Атив окно"); // активное окно
cap.SetCapability("unicodeKeyboard", "true");

AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap); // инициализируем экземпляр класса драйвера с настроечками
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//Класс[contains(@resource-id, 'Айди')]")));
driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").Click();


wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//Класс[contains(@resource-id, 'Айди')]")));
driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").SendKeys(project.Variables["number"].Value);


driver.FindElementByXPath("//Класс[contains(@resource-id, 'Айди')]").SendKeys(project.Variables["kod_podtverd"].Value);
Если сделать во втором кубике вот так:
C#:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)


AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap);
driver.FindElementByXPath("//android.widget.EditText[contains(@resource-id, 'confirm_code_field')]").SendKeys(project.Variables["kod_podtverd"].Value);

То будет следующая ошибка: Выполнение действия CSharp OwnCode. An unknown server-side error occurred while processing the command. Original error: The desired capabilities must include either an app, appPackage or browserName

Заранее спасибо за помощь)
C#:
var driver = project.Context["drv"];
driver.FindElementByXPath("//android.widget.EditText[contains(@resource-id, 'confirm_code_field')]").SendKeys(project.Variables["kod_podtverd"].Value);
project.Context["drv"]= driver;
И это в конец первого экшена
C#:
project.Context["drv"]= driver;
 
  • Спасибо
Реакции: Dronhik
D

Dronhik

Guest
Хочу попытаться сделать клик по координатам в приложении, подскажите как реализовать


Может кто-то подсказать, где найти все возможные команды типа Click для этого драйвера.
Ссылку, или хотя бы, что и как гуглить

Заранее спасибо)
 
D

Dronhik

Guest
Можно ли автоматизировать данное действие(выбор даты) в приложении(выбирается в эмуляторе прокручиванием при зажатии левой кнопки мыши),если да, то какие команды, а то в статье их так мало, и уж больно не хватает ссылки на источники или библиотеки(((
Просто передать дату 11.12.1970 в поле командой не получается. У всех 3-х окон айди одинаковое, и даже если передавать в поле год цифрой и нажимать подтвердить, оно не выбирается
Безымянный.jpg

Нашел вот такую конструкцию:

C#:
var element = driver.FindElement(By.id("element-id"));
Actions actions = new Actions(driver);
actions.MoveToElement(element);
actions.Perform();
Что если искать элемент не по айди при прокрутке а по тексту, вед айди у поля остается один и тот же, текст в этом поле меняется
 
Последнее редактирование модератором:

Monitor

Client
Регистрация
27.12.2016
Сообщения
61
Благодарностей
37
Баллы
18
Можно ли автоматизировать данное действие(выбор даты) в приложении(выбирается в эмуляторе прокручиванием при зажатии левой кнопки мыши)
Определяете год (день, месяц) по атрибуту text:
C#:
driver.FindElementByXPath("//android.widget.TextView[contains(@resource-id, 'year')]").GetAttribute("text");
Если год (день, месяц) больше или меньше нужного значения, то делаете несколько свайпов вверх или вниз. И так в цикле, пока не выставите нужную дату.
 
  • Спасибо
Реакции: Dronhik

Monitor

Client
Регистрация
27.12.2016
Сообщения
61
Благодарностей
37
Баллы
18
Хочу попытаться сделать клик по координатам в приложении, подскажите как реализовать
Тап по координатам (кол-во пальцев, координата x, координата y, задержка):
C#:
driver.Tap(1, 100, 100, 2000); // для долгого нажатия (Long press) нужно увеличить задержку
 
D

Dronhik

Guest
Определяете год (день, месяц) по атрибуту text:
C#:
driver.FindElementByXPath("//android.widget.TextView[contains(@resource-id, 'year')]").GetAttribute("text");
Если год (день, месяц) больше или меньше нужного значения, то делаете несколько свайпов вверх или вниз. И так в цикле, пока не выставите нужную дату.
Кст, тоже делаю в memu)) ошибка о сбое в гугл плей задрала

Спасибо, как попробую отпишу)
 

Monitor

Client
Регистрация
27.12.2016
Сообщения
61
Благодарностей
37
Баллы
18
D

Dronhik

Guest
Такая ошибка: "google play services has stopped"?
Ага, я уже чего только не делал, и переустанавливал, и кэш чистил, и останавливал приложения все, ничего не помогает, только шаблон мне сбивает при работе ...
 
D

Dronhik

Guest
Перечитал тему, вроде не было еще такого.
Допустим у нас в приложении есть переменная - число в определенной области в приложении, оно обновляется(пусть будет каждую минуту) можно его как-то парсить и класть в переменную в зенке, для дальнейшей обработки

Конечно можно делать просто скриншоты, и отправлять далее на хостинг, например, но это не особо удобно, хочется реализовать более продвинутую схемы что ли
 

Monitor

Client
Регистрация
27.12.2016
Сообщения
61
Благодарностей
37
Баллы
18
Ага, я уже чего только не делал, и переустанавливал, и кэш чистил, и останавливал приложения все, ничего не помогает, только шаблон мне сбивает при работе ...
Возможно поможет это:
- В меню Настройки приложения Google Play services нажать кнопку отключить. Андроид предложит удалить обновления и установить старую версию. Подтверждаем.
- Не включая Google Play services, вручную устанавливаем apk, который берем здесь (версию не подскажу, надо пробовать, начиная с максимальной).
У меня ошибка исчезла на MEmu c Андроид 7.1 (устанавливал версию Google Play services 19.2.74)
 
  • Спасибо
Реакции: Dorian_Gray и Dronhik
D

Dronhik

Guest
Возможно поможет это:
- В меню Настройки приложения Google Play services нажать кнопку отключить. Андроид предложит удалить обновления и установить старую версию. Подтверждаем.
- Не включая Google Play services, вручную устанавливаем apk, который берем здесь (версию не подскажу, надо пробовать, начиная с максимальной).
У меня ошибка исчезла на MEmu c Андроид 7.1 (устанавливал версию Google Play services 19.2.74)
Спасибо, попробую обязательно, тоже отпишу, как и со свайпом)
 

Zhekaz

Client
Регистрация
14.03.2016
Сообщения
107
Благодарностей
55
Баллы
28
Перечитал тему, вроде не было еще такого.
Допустим у нас в приложении есть переменная - число в определенной области в приложении, оно обновляется(пусть будет каждую минуту) можно его как-то парсить и класть в переменную в зенке, для дальнейшей обработки

Конечно можно делать просто скриншоты, и отправлять далее на хостинг, например, но это не особо удобно, хочется реализовать более продвинутую схемы что ли
C#:
project.Variables["Название переменной"].Value = driver.FindElementByXPath("//xPath путь").GetAttribute("text");
 
D

Dronhik

Guest
Определяете год (день, месяц) по атрибуту text:
C#:
driver.FindElementByXPath("//android.widget.TextView[contains(@resource-id, 'year')]").GetAttribute("text");
Если год (день, месяц) больше или меньше нужного значения, то делаете несколько свайпов вверх или вниз. И так в цикле, пока не выставите нужную дату.
Делаю вот такую конструкцию:
C#:
string ex = driver.FindElementByXPath("//android.widget.TextView[contains(@resource-id, 'Айди')]").GetAttribute("text");

project.Variables["test"].Value = ex;
Но ошибка, что превышен лимит запроса, и в переменную ничего не возвращается((
Проверил Айди уже, и в элементе точно присутствует значение text

Извиняюсь, все работает правильно, просто если выполнять в разных кубиках то шаблон сбивается из-за того, что вылезает ошибка Google Play
 
Последнее редактирование модератором:

karm412_ru

Client
Регистрация
31.03.2017
Сообщения
4
Благодарностей
3
Баллы
3
Подскажите как спарсить номера из приложения.
Был подобный пример
Код:
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 или ссылка на сборку?)"
Попробуй задать тип не string, а вот так
Код:
foreach(IWebElement oneElement in elements)
у меня нормально тогда отрабатывает обращение oneElement.GetAttribute("text")
на всякий случай моя версия зенки 5.12 (сентябрь 2017).
 
  • Спасибо
Реакции: Fobos
D

Dronhik

Guest
Подскажите, пожалуйста, как нажать клавишу Enter просто в открытом приложении андройд, не для конкретного элемента, а просто вылезает окно об ошибке в самом эмуляторе. и его можно закрыть нажатием на Enter.
Нагуглил кучу примеров, что-то уже устарело и не работает, где-то ошибки( я не особо кодер)

То что смог нагуглить:
Код:
import io.appium.java_client.android.nativekey.KeyEvent;
driver.pressKey(new KeyEvent(AndroidKey.ENTER));
Код:
Actions action = new Actions();
driver.send_keys(Keys.ENTER)
Заранее спасибо)
 
Последнее редактирование модератором:

Monitor

Client
Регистрация
27.12.2016
Сообщения
61
Благодарностей
37
Баллы
18
Подскажите, пожалуйста, как нажать клавишу Enter просто в открытом приложении андройд, не для конкретного элемента, а просто вылезает окно об ошибке в самом эмуляторе. и его можно закрыть нажатием на Enter.
Можно использовать нажатие по коду клавиши. Перечень кодов: https://developer.android.com/reference/android/view/KeyEvent.html

Способ №1:
C#:
driver.PressKeyCode(66); // 66 - это код ENTER
Способ №2 (через команду adb):
C#:
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"adb.exe";
startInfo.Arguments = @"shell input keyevent 66"; //параметры выполнения adb команды
startInfo.WindowStyle = ProcessWindowStyle.Hidden; //скрываем окно выполнения
Process.Start(startInfo).WaitForExit(); //запускаем процесс и дожидаемся выполнения
Способы могут и не сработать, т.к. не используется виртуальная клавиатура. Нужно тестить.

Лучше все-таки проверять на наличие определенного текста во всплывающем окне и затем уже кликать по кнопке закрытия окна:
C#:
if (driver.FindElementsByXPath("//android.widget.TextView[contains(@text, 'Текст ошибки')]").Count>0) {
    driver.FindElementByXPath("//android.widget.Button[contains(@text, 'Закрыть')]").Click();
}
 
  • Спасибо
Реакции: Donalddick и Dronhik

gameboy123

Client
Регистрация
09.12.2017
Сообщения
58
Благодарностей
9
Баллы
8
Все работает только, когда запускаю приложение оно пустые. Как будто только что установил.
Как сделать чтобы данные не удалялись в приложении?
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
Все работает только, когда запускаю приложение оно пустые. Как будто только что установил.
Как сделать чтобы данные не удалялись в приложении?
Нужно прописать параметр noReset в настройках
 
  • Спасибо
Реакции: gameboy123

gameboy123

Client
Регистрация
09.12.2017
Сообщения
58
Благодарностей
9
Баллы
8
после 60 секунд программа отрубается. Хотя при создании ставлю большой таймаут. Почему не работает?

C#:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(6000));

В аппиуме это выходит: Shutting down because we waited 60 seconds for a command

В C#
The HTTP request to the remote WebDriver server for URL http://127.0.0.1:4723/wd/hub/session timed out after 60 seconds.
 
Последнее редактирование:

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
после 60 секунд программа отрубается. Хотя при создании ставлю большой таймаут. Почему не работает?

C#:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(6000));

В аппиуме это выходит: Shutting down because we waited 60 seconds for a command

В C#
The HTTP request to the remote WebDriver server for URL http://127.0.0.1:4723/wd/hub/session timed out after 60 seconds.
То что у тебя в коде это создание обьекта ожидания элементов. его нужно использовать явно. У тебя ошибка в другом. Аппиум не получает команды в течении 60 сек. тебе нужно поискать параметр newCommandTimeout
 
  • Спасибо
Реакции: gameboy123

Alex_Follow

Client
Регистрация
12.12.2017
Сообщения
16
Благодарностей
19
Баллы
3
Начал почему-то кушаться текст, пропадать символы при использования метода SendKeys
Должен быть напечатан: "79215438752"
А печатает только: "7921"

Подскажите, пожалуйста, что это такое, как с этим бороться?
Решил проблему? На телефоне нормально работало, на эмуляторе кушает половину текста. Весь вечер вожусь




UPD: задача решилась строкой cap.SetCapability("automationName","UiAutomator2");
 
Последнее редактирование:

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
Решил проблему? На телефоне нормально работало, на эмуляторе кушает половину текста. Весь вечер вожусь
Какой эмулятор используешь? Какая версия андройда?
Компьютер мощный? Может эмуль тормозит?
 

Alex_Follow

Client
Регистрация
12.12.2017
Сообщения
16
Благодарностей
19
Баллы
3
Какой эмулятор используешь? Какая версия андройда?
Компьютер мощный? Может эмуль тормозит?
эмулятор Memu, настройки ставил разные, Android 5.1.1. Визуально текст набирает намного быстрее чем на телефоне, мощности компа точно хватает.


Руками емулятор не тупит. SendKeys пропускает пробелы и если есть в слове две одинаковые буквы подряд то некоторые пропускает.
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
эмулятор Memu, настройки ставил разные, Android 5.1.1. Визуально текст набирает намного быстрее чем на телефоне, мощности компа точно хватает.


Руками емулятор не тупит. SendKeys пропускает пробелы и если есть в слове две одинаковые буквы подряд то некоторые пропускает.
аппиум какая версия?
какая версия библиотек на c#?
 

Alex_Follow

Client
Регистрация
12.12.2017
Сообщения
16
Благодарностей
19
Баллы
3

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
  • Спасибо
Реакции: Alex_Follow

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