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

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
Самого дистрибутива appium в прикрепленных файлах нет
Сам дистрибутив аппиума нужной версии можно скачать с гитхаба или битбакета (раздел не помню, вроде ветка называется релизы или что то вроде этого). Но тут надо понимать, что версия аппиума десктоп (которая в виде отдельного софта) и версия аппиума устанавливаемая через nodejs (как описано постом выше) это разные версии аппиума и при работе надо это учитывать.
 
  • Спасибо
Реакции: Gang

Gang

Client
Регистрация
04.04.2010
Сообщения
579
Благодарностей
313
Баллы
63
Сам дистрибутив аппиума нужной версии можно скачать с гитхаба или битбакета (раздел не помню, вроде ветка называется релизы или что то вроде этого). Но тут надо понимать, что версия аппиума десктоп (которая в виде отдельного софта) и версия аппиума устанавливаемая через nodejs (как описано постом выше) это разные версии аппиума и при работе надо это учитывать.
Да качал оттуда, спасибо за советы! Если долго мучится, что нибудь по любому получится)
 

gameboy123

Client
Регистрация
09.12.2017
Сообщения
58
Благодарностей
9
Баллы
8
Подскажите, как можно сделать так же с айфоном?
 

radv

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

kawae

Client
Регистрация
05.03.2020
Сообщения
28
Благодарностей
1
Баллы
3
C#:
driver.FindElementByXPath("//android.widget.RelativeLayout[contains(@index, 'project.Variables["id"].Value')]").Click();
Мне нужно использовать переменную "id"
Но это ошибка, как мне это использовать.
Я новичок. Вы можете мне помочь?
 

Koqpe

Client
Регистрация
23.12.2014
Сообщения
1 099
Благодарностей
648
Баллы
113
Мне нужно использовать переменную "id"
C#:
driver.FindElementByXPath("//android.widget.RelativeLayout[contains(@index, " + project.Variables["id"].Value + ")]").Click();

или

var id = project.Variables["id"].Value;
driver.FindElementByXPath("//android.widget.RelativeLayout[contains(@index, " + id + ")]").Click();
 

kawae

Client
Регистрация
05.03.2020
Сообщения
28
Благодарностей
1
Баллы
3
C#:
driver.FindElementByXPath("//android.widget.RelativeLayout[contains(@index, " + project.Variables["id"].Value + ")]").Click();

или

var id = project.Variables["id"].Value;
driver.FindElementByXPath("//android.widget.RelativeLayout[contains(@index, " + id + ")]").Click();

Большое спасибо за вашу помощь.
 

ильяsffse

Client
Регистрация
23.06.2018
Сообщения
119
Благодарностей
53
Баллы
28
крч еще важно в коде с# прописывать свою версию андроида! И свое имя девайса! т.к. в логе при подключении пишет "устройство с 4.0.1 не найдено" (иль какое там было у автора) Наконец разобрался +- )))
 

artomka

Client
Регистрация
23.08.2018
Сообщения
159
Благодарностей
93
Баллы
28
Ребят подскажет кто как вместо .Click() по элементу делать долгий тап (секунд 30 держать). И еще как из аппиума кнопку BACK/HOME нажимать?

Читал документацию на сайте аппиума но там примеры пустые :(

Заранее спасибо! :-)
 

ильяsffse

Client
Регистрация
23.06.2018
Сообщения
119
Благодарностей
53
Баллы
28
Ребят подскажет кто как вместо .Click() по элементу делать долгий тап (секунд 30 держать). И еще как из аппиума кнопку BACK/HOME нажимать?

Читал документацию на сайте аппиума но там примеры пустые :(

Заранее спасибо! :-)
Скорее всего "SendKeys BACK " и т.д.
Тут возможно про тапы есть https://developer.android.com/reference/android/view/KeyEvent#KEYCODE_0
 

desync

Client
Регистрация
28.01.2019
Сообщения
7
Благодарностей
0
Баллы
1

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
А можно немного подробнее? Поиск привел к тому что этот драйвер под винду не катит
Как правило автоматизация iphone должна происходить на технике apple.
Тут очень мало людей у кого есть опыт автоматизации на этой платформе.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
Поиск привел к тому что этот драйвер под винду не катит
Естественно, автоматизация должна происходить на MacOs и эмуляторе iOS по причине совместимости устройств, ну и под винду нет эмуляторов для яблочных устройств. т.е для автоматизации айфона, кроме него у вас должен быть макбук или аймак, вот с них и надо настраивать окружение для автоматизации. А зенка только на винде работает. Если знаете шарп или другой язык, сможете сделать автоматизацию создав приложение для макс оси.
 
Последнее редактирование:
  • Спасибо
Реакции: desync

desync

Client
Регистрация
28.01.2019
Сообщения
7
Благодарностей
0
Баллы
1
Естественно, автоматизация должна происходить на MacOs и эмуляторе iOS по причине совместимости устройств, ну и под винду нет эмуляторов для яблочных устройств. т.е для автоматизации айфона, кроме него у вас должен быть макбук или аймак, вот с них и надо настраивать окружение для автоматизации.
Спасибо за ответ, об этом в курсе, всякие умельцы тут есть, мало ли))
 

radv

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

VerBin

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

Kuciybes

Client
Регистрация
07.11.2015
Сообщения
18
Благодарностей
0
Баллы
3
При подключении зенки к эмулятору в консоль выбивает ошибку:
Could not find a connected Android device

Подскажите плиз в какую сторону копать. С чем это может быть связано ?

При вводе в консоли adb devices, подключенных устройств действительно не выдает
 

seregakot

Client
Регистрация
19.03.2016
Сообщения
126
Благодарностей
63
Баллы
28
При подключении зенки к эмулятору в консоль выбивает ошибку:
Could not find a connected Android device

Подскажите плиз в какую сторону копать. С чем это может быть связано ?

При вводе в консоли adb devices, подключенных устройств действительно не выдает
какой эмулятор используешь ?
 

VerBin

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

deluxe43

Новичок
Регистрация
31.03.2020
Сообщения
1
Благодарностей
0
Баллы
1
Всем привет! В связи с успехом прошлой статьи я решил и дальше пойти по линии автоматизации того что стандартными средствами ZP не предусмотрено. Сегодня мы с вами займемся автоматизацией приложения Instagram'a прямо на вашем смартфоне через USB !

Начинаем

Для того чтобы это все заработало нам понадобится:
Скачиваем и устанавливаем все это добро. Рекомендую ставить Android SDK по стандартному пути который предложит установочник, если вы по привычке его изменили как это сделал я, то эта инструкция для вас

После того как все установлено, вам нужно открыть Android SDK и установить внутри него вот эти пакеты:






Теперь, когда все готово можем приступить к созданию проекта, сначала берем USB, телефон и все это подключаем к ПК, в телефоне в настройках нужно включить опции разработчика и отладку по USB


Первое что нам понадобится это запустить appium с нужными параметрами чтобы на пк поднялся сервер для перенаправления команд на телефон, делаем:

Создадим два bat файла
1)
Код:
"C:/Program Files (x86)/Appium/node.exe" "C:/Program Files (x86)/Appium/node_modules/appium/bin/Appium.js" --address 127.0.0.1 --chromedriver-port 9516 --bootstrap-port 4725 --selendroid-port 8082 --no-reset --local-timezone
и назовем его AppiumStart.bat

2)
Код:
taskkill /F /IM node.exe
это пусть будет AppiumStop.bat

Теперь первым экшеном в нашем проекте будет запуск программы с указанием пути до файла AppiumStart:



Следующим шагом плавно переходим к кодингу, для работы сего приложения нам понадобятся библиотеки от Appium и Selenium а также Newtonsoft.Json ибо они без него не работают, добавляем их в ссылки GAC:


Все нужные dll во вложении

Теперь добавляем необходимые using:
Код:
using System.Linq;
using OpenQA.Selenium.Appium.Android;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;



Для того чтобы мы управляли конкретным приложением и при старте на телефоне открылось именно оно, нам нужно указать параметры инициализации экземпляра класса драйвера управления, не думаю что в это нужно вникать, можно просто все сделать по инструкции =)

Создаем экшен Код С# и начинаем кодить:

Код:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)
cap.SetCapability("platformVersion", "4.0.3");// версия платформы (тоже любая)
cap.SetCapability("platformName", "Android");//имя платформы
cap.SetCapability("appPackage", "com.instagram.android"); // пространство имен используемое приложением
cap.SetCapability("appActivity", ".activity.MainTabActivity"); // активное окно

AndroidDriver<IWebElement> driver = new AndroidDriver<IWebElement>(new Uri("http://127.0.0.1:4723/wd/hub"), cap); // инициализируем экземпляр класса драйвера с настроечками
Как вы заметили в настройках фигурируют два непонятных параметра это appPackage и аppActivity
Для любого приложения их можно получить следующим образом:
  • Открываем на телефоне приложение для которого хотим получить данные (исходим из условия что телефон уже подключен к ПК и на нем включен режим отладки)
  • Запускаем cmd от имени администратора
  • пишем adb devices


  • Дальше adb shell
  • И теперь dumpsys window windows | grep -E ‘mCurrentFocus|mFocusedApp’
Если все верно вы должны получить данные о запущенном приложении:



Именно они и указывались в наших настройках.
Теперь если запустить проект, то на экшене c кодом на телефоне уже должно само открыться приложение Instagram.

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

Начнем с 1 пункта

Исследование элементов на андроид приложениях

На самом деле тут не нужно изобретать велосипед, Google сам уже все сделал для этого, вам достаточно открыть папку с android- sdk, перейти в папку tools и открыть файл uiautomatorviewer.bat

Мой полный путь до него: "C:\android-sdk\tools\uiautomatorviewer.bat"

Он немного потупит и откроет нам вот такое окно:


Далее открываем на телефоне необходимый экран нужного приложения, в нашем случае это инстаграм, жмем на кнопку что на скрине и видим что он нам загрузил скрин экрана со всеми его элементами:



Наша задача нажать на самолетик, чтобы отправить сообщение, выделяем его и смотрим по каким параметрам его можно найти. Больше всего мне понравилось искать по XPath

Давайте сразу в коде добавим нажатие на этот элемент, выглядеть это будет вот так:
Код:
driver.FindElementByXPath("//android.widget.FrameLayout[contains(@resource-id, 'action_bar_inbox_icon_with_badge')]").Click();
Если разбирать по букофкам то мы обратились к нашему драйверу driver, вызвали в нем функцию поиска элемента на экране по XPath- FindElementByXPath, соотеветственно в него передали наше имя класса, взятое из uiautomatorviewer, внутри полученной коллекции элементов с этим классом вычленили элемент у которого resource-id равен тому id что показал нам инспектор (id начинает после :id/) и кликнули по нему Click()

По идее если сейчас запустить наш проект, то уже должно раскрыться приложение инсты и там должен нажаться самолетик, НО такое исполнение может вызывать ошибку "Элемент не найден" ибо телефон может затупить и долго открывать окно приложения, поэтому сразу зацепим следующий пункт

Ожидание появления элементов на экране телефона

В этом тоже нет ничего сложного, для того чтобы дождаться когда на нашем телефоне появится этот самолетик мы будем использовать следующий способ:
Сначала подключим необходимый using для этого:
Код:
using OpenQA.Selenium.Support.UI;


Далее объявим экземпляр класса который будет отвечать за ожидание:
Код:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
При его объявлении мы указали для какого объекта драйвера он будет использоваться и в течении какого времени производить ожидание, в нашем случае это 60 секунд

Непосредственно само ожидание:
Код:
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//android.widget.FrameLayout[contains(@resource-id, 'action_bar_inbox_icon_with_badge')]")));
Разбираем, мы сказали объекту что должны выполнить ожидание появления элемента на экране по заданному XPath, следовательно программа будет стоять на строке этого кода пока не появится этот элемент либо не пройдет наши заданные 60с, если они пройдут то строка выдаст исключение с текстом об истечении таймаута, как только он появится мы сразу нажимаем на него

В экшене все это выглядит уже так:
Код:
DesiredCapabilities cap = new DesiredCapabilities(); // экземпляр класса настроек
cap.SetCapability("deviceName", "Insta"); // имя девайся (абсолютно любое)
cap.SetCapability("platformVersion", "4.0.3");// версия платформы (тоже любая)
cap.SetCapability("platformName", "Android");//имя платформы
cap.SetCapability("appPackage", "com.instagram.android"); // пространство имен используемое приложением
cap.SetCapability("appActivity", ".activity.MainTabActivity"); // активное окно

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("//android.widget.FrameLayout[contains(@resource-id, 'action_bar_inbox_icon_with_badge')]"))); //ожидаем
driver.FindElementByXPath("//android.widget.FrameLayout[contains(@resource-id, 'action_bar_inbox_icon_with_badge')]").Click(); //жмем
Итого, теперь мы умеем смотреть все элементы на экране тлф, программно их находить и ожидать, осталось дело за малым - допилить нашего спамера по директу инсты, погнали:

Алгоритм примерно такой:
Нажать новое сообщение



Ввести никнейм получателя



Дождаться результата, выбрать первого, ввести текст и нажать отправить



Жмем на "Новое сообщение"
driver.FindElementsByClassName("android.widget.TextView").Where(f=> f.Text == "Новое сообщение").First().Click();



Я исследовал элемент, выяснил что значение его класса не уникально и у него отсутствует resource-id, поэтому сделал поиск по классу и свой- ву Text, к первому элементу применил метод Click();

Вводим никнейм
Любые нажатия в приложения отправляются при помощи метода SendKeys("тут текст");

Код:
driver.FindElementsByClassName("android.widget.EditText").First(f=> f.Text == "Поиск").SendKeys("test");
Дальше ожидаем появления результатов поиска и делаем Click() на первый результат выдачи:
Код:
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//android.widget.LinearLayout[contains(@resource-id, 'user_row_background')]")));
driver.FindElementsByXPath("//android.widget.LinearLayout[contains(@resource-id, 'user_row_background')]").First().Click();
Вводим текст сообщения
Код:
driver.FindElementByXPath("//android.widget.EditText[contains(@resource-id, 'row_thread_composer_edittext')]").SendKeys("Привееееет");
исходил из данных от инспектора


Нажимаем на кнопку отправить и не забываем предварительно ожидать ее появления:
Код:
wait.Until(ExpectedConditions.PresenceOfAllElementsLocatedBy(By.XPath("//android.widget.ImageView[contains(@resource-id, 'row_thread_composer_button_send')]")));
driver.FindElementByXPath("//android.widget.ImageView[contains(@resource-id, 'row_thread_composer_button_send')]").Click();
Но тут у меня всплыл такой момент, когда я пытаюсь отправить нажатия русских символов, то ничего не вводится, а английские работают, проблема решилась добавлением в начальные настройки инициализации драйвера строки
Код:
cap.SetCapability("unicodeKeyboard", "true");


ВУАЛЯ, все круто, все работает, вот демонстрация того как это происходит у меня:


Для трансляции видео на экран ПК через инет использовал Screen Stream Mirroring

P.S: По секрету говоря абсолютно не важно будете ли вы использовать свой телефон подключенный через USB или любой эмулятор андроида, например bluestacks или NOX, данная инструкция подойдет для применения к любому из них, только заместо подключенного по USB телефона у вас на пк должен быть открыт эмулятор андроида и все =)

Получившийся проект прикрепил!

Спасибо за внимание! Всех с наступающим! =)
Привет можно твой телеграмм?
 

slavon

Client
Регистрация
24.06.2016
Сообщения
596
Благодарностей
128
Баллы
43
Народ кто поможет настроить эту хрень?
 

radv

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

Koqpe

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

ильяsffse

Client
Регистрация
23.06.2018
Сообщения
119
Благодарностей
53
Баллы
28
Народ кто поможет настроить эту хрень?
Иди по шагам.. и тут почитай все коменты,не ленись! Я за пару дней разобрался..будучи обсалютным нубом!))) И есть маны Индусов на ютубе про Аппиум, они ОООЧЕНЬ помогли))! Все ошибки..копируй и отправляй в поиск;-) Крч в инете уже все есть))
И да, лучше спрашивай что то конкретное,люди помогут. Либо за $ может кто то по шагам проведет) Но лучше самому разобраться
 

slavon

Client
Регистрация
24.06.2016
Сообщения
596
Благодарностей
128
Баллы
43
СКОЛЬКО?$
 

slavon

Client
Регистрация
24.06.2016
Сообщения
596
Благодарностей
128
Баллы
43
Иди по шагам.. и тут почитай все коменты,не ленись! Я за пару дней разобрался..будучи обсалютным нубом!))) И есть маны Индусов на ютубе про Аппиум, они ОООЧЕНЬ помогли))! Все ошибки..копируй и отправляй в поиск;-) Крч в инете уже все есть))
И да, лучше спрашивай что то конкретное,люди помогут. Либо за $ может кто то по шагам проведет) Но лучше самому разобраться
У меня не хватает терпения на пару часов,а ты про пару дней говоришь.
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
У меня не хватает терпения на пару часов,а ты про пару дней говоришь.
Ну во сколько ты оценишь экономию своего времени? в $ 100-300-500 ? И пойми, что одно дело настроить все, а другое дело работать с этим. Придется тогда за каждый вопрос платить, если сам не хочешь вникать. Проще тогда заказать готовый проект под ключ, все равно в коде потом не разберешься. и исправить ничего не сможешь с таким подходом..
 
  • Спасибо
Реакции: VerBin

slavon

Client
Регистрация
24.06.2016
Сообщения
596
Благодарностей
128
Баллы
43
Ну во сколько ты оценишь экономию своего времени? в $ 100-300-500 ? И пойми, что одно дело настроить все, а другое дело работать с этим. Придется тогда за каждый вопрос платить, если сам не хочешь вникать. Проще тогда заказать готовый проект под ключ, все равно в коде потом не разберешься. и исправить ничего не сможешь с таким подходом..
Ну во сколько ты оценишь экономию своего времени? в $ 100-300-500 ? Досвидос,я за такие деньги воробья в чистом поле загоню.Ты мне что сразу готовую тему предлагаешь )))НЕ СМЕШИ.За пол часа делов в тимке,головой своей думаешь?
 

radv

Client
Регистрация
11.05.2015
Сообщения
3 789
Благодарностей
1 954
Баллы
113
Ну во сколько ты оценишь экономию своего времени? в $ 100-300-500 ? Досвидос,я за такие деньги воробья в чистом поле загоню.Ты мне что сразу готовую тему предлагаешь )))НЕ СМЕШИ.За пол часа делов в тимке,головой своей думаешь?
Ну а ты уверен, что полчаса все поймешь и вопросов не останется? Желаю удачи. Многие и про кубики так говорят, что сделать шаблон парсера с нуля полчаса надо, а как возьмутся, то пару дней сидят.
 
  • Спасибо
Реакции: andrey-ka

slavon

Client
Регистрация
24.06.2016
Сообщения
596
Благодарностей
128
Баллы
43
Ну а ты уверен, что полчаса все поймешь и вопросов не останется? Желаю удачи. Многие и про кубики так говорят, что сделать шаблон парсера с нуля полчаса надо, а как возьмутся, то пару дней сидят.
Удачи тебе!
 

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