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

Serkser

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

Начинаем

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

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

d2b1202ecc3f4059bbfac4fc048e1960.png



31068683509441f687e086e22ef2ec48.png


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


Первое что нам понадобится это запустить 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:
0d84fc6e53224ee1afa7b410f391e888.png



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


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

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

638e592b4ce4432ab0bd3d93b5d15580.png



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

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

Код:
Развернуть Свернуть Копировать
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
5846f144d63a47c3b2897303ff57d3c8.png


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

b0c5aa1b77a84f8a8e123a6d361a96da.png


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

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

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

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

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

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

Он немного потупит и откроет нам вот такое окно:
51e3510115594c1cb2ac399b40433167.png


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

d58b6a24c0344542a9d70002305f1615.png


Наша задача нажать на самолетик, чтобы отправить сообщение, выделяем его и смотрим по каким параметрам его можно найти. Больше всего мне понравилось искать по 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;
b2d1cda0ccc14289aa227576c9f8f302.png


Далее объявим экземпляр класса который будет отвечать за ожидание:
Код:
Развернуть Свернуть Копировать
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(); //жмем

Итого, теперь мы умеем смотреть все элементы на экране тлф, программно их находить и ожидать, осталось дело за малым - допилить нашего спамера по директу инсты, погнали:

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

f13a2d5e8b93441a9de56d1df5071ff6.png


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

dfcecb392144469289be9c5220dce186.png


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

2aa8bf0d182e4e3fbc92010138d8b59a.png


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

495c18e728464903bfbc1cc5a35dd0bf.png


Я исследовал элемент, выяснил что значение его класса не уникально и у него отсутствует 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("Привееееет");

исходил из данных от инспектора
6f4cdffd8fac4e9482212d054672c9ea.png


Нажимаем на кнопку отправить и не забываем предварительно ожидать ее появления:
Код:
Развернуть Свернуть Копировать
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");

ab01ed9d87fd4175a4c80a7cd0d74d58.png


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


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

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

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

Мои контакты для обратной связи:

Почта: info@itlabs.top
Skype: Serkser70
Telegram: Serkser
Whatsapp/Viber: +79511929402


Спасибо за внимание! Всех с наступающим! =)
 
Номер конкурса статей
  1. Шестой конкурс статей
Тема статьи
  1. Нестандартные хаки

Вложения

Последнее редактирование:
молодец крутяк )
 
  • Спасибо
Реакции: Serkser
А прокси подружить с этой схемой можно?
 
статья круть!
опять буду голосовать за этого автора! :)
 
  • Спасибо
Реакции: Serkser
А прокси подружить с этой схемой можно?
Никто не запрещает поставить на тлф. ProxyDroid и в нем менять прокси на всем телефоне.

Но правильней было бы использовать эмулятор андрюши и так же управлять им, а прокси менять в
Proxyfier при помощи WinApi =)
 
Автору респект за труды, ТС занимается уникальным направлением для использования зеннопостера. Предполагаю что это будет одна из лидирующих статей в этом году! Буду голосовать полюбому!!!
 
  • Спасибо
Реакции: GeGold и Serkser
Отличная статья на очень актуальную тему, автору респект!
 
  • Спасибо
Реакции: Serkser
ждал темку от Serkser как всегда круто!

Serkser ну интригу конечно развел телефон провода юсби )))
P.S: По секрету говоря абсолютно не важно будете ли вы использовать свой телефон подключенный через USB или любой эмулятор андроида, например bluestacks или NOX, данная инструкция подойдет для применения к любому из них, только заместо подключенного по USB телефона у вас на пк должен быть открыт эмулятор андроида и все =)
зы: ну все хана инстаграму походу!
 
  • Спасибо
Реакции: Serkser
Пока лучшая статья на этом конкурсе)
 
  • Спасибо
Реакции: Serkser
мобилы сейчас актуальны, как никогда, особенно в свете перспектив привлечения и конверта мобильного трафика, благодарствую за уникальную подачу конкурсного материала!!! :cw:
 
  • Спасибо
Реакции: Serkser
+1 от меня. Если в Зеннодроид ничего не изменят, то ему капут
vanga.jpg
 
  • Спасибо
Реакции: Eldario и Serkser
статья хорошая, но это что тока для ватцап, инстаграм и вайбер нужно это? Что еще бы придумать, как на этом срубить бабло?
 
статья хорошая, но это что тока для ватцап, инстаграм и вайбер нужно это? Что еще бы придумать, как на этом срубить бабло?
Не в деньгах смысл, а в знаниях :-)
 
Понятное дело кто умней тот и богаче, полностью согласен с ТС. Но понимаешь такая штука, у меня в субботу умер друг, и чтобы его похоронить нужно минимум 130 000 рублей, я дал его семье столько сколько было в моей семье, а именно все 50 000р, сижу на галиках. А ты говоришь не в деньгах счастье, дальше будет еще дороже. Зачем деньги, можно и воздухом подышать. Жду зарплаты и пойду искать клиентов.
 
Понятное дело кто умней тот и богаче, полностью согласен с ТС. Но понимаешь такая штука, у меня в субботу умер друг, и чтобы его похоронить нужно минимум 130 000 рублей, я дал его семье столько сколько было в моей семье, а именно все 50 000р, сижу на галиках. А ты говоришь не в деньгах счастье, дальше будет еще дороже. Зачем деньги, можно и воздухом подышать. Жду зарплаты и пойду искать клиентов.
Мои искренние соболезнования :(
 
  • Спасибо
Реакции: bumer
@Serkser http://zennolab.com/discussion/threads/shestoj-konkurs-statej.32104/

  • Публиковать статьи нужно будет на нашем форуме, чтобы их можно было обсудить и проголосовать за понравившиеся. Все файлы и картинки, входящие в статью, должны хоститься на форуме в сообщении, а не на сторонних image и file хостингах.
 
Никто не запрещает поставить на тлф. ProxyDroid и в нем менять прокси на всем телефоне.

Но правильней было бы использовать эмулятор андрюши и так же управлять им, а прокси менять в
Proxyfier при помощи WinApi =)
Добрый день, есть предложение как можно круто допилить шаблончик) Напиши пожалуйста в лс, или ответь в скайп ( я тебе там написал)
 
@Serkser http://zennolab.com/discussion/threads/shestoj-konkurs-statej.32104/

  • Публиковать статьи нужно будет на нашем форуме, чтобы их можно было обсудить и проголосовать за понравившиеся. Все файлы и картинки, входящие в статью, должны хоститься на форуме в сообщении, а не на сторонних image и file хостингах.
Я думал если вставлять картинки из конструктора, то они сами сгружаются на ваш хостинг
 
Еще ждем статьи от самизнаетекого о том какпосчитатьчужиеденьги и можно роздавать призы.
ТС - отличная статья, спасибо!
 
  • Спасибо
Реакции: AZANIR и Radzhab
Спасибо за статью, то что нужно) А может кто-то подсказать, как из прилажения на андроиде вытянуть гугл капчу для разгадывания?
 
Спасибо за статью, то что нужно) А может кто-то подсказать, как из прилажения на андроиде вытянуть гугл капчу для разгадывания?
При помощи Appium можно работать с html элементами на экране андрюши, при условии если она загружена в webview, а она в любом случае будет туда загружена, так что думаю можно организовать работу даже без эмуляции кликов по каптче, а решать ее способом описанным на рукаптче, т.е. через чистые запросы
 
  • Спасибо
Реакции: VerBin и nvmds
Иду по шагам и возникла проблемка. Не выполнялась команда adb devices. Выдавало, что команда не известна. Добавил adb в переменные среды, path. Все заработало, и я увидел данные о запущенном прилажении на телефоне. Но при попытке выполнения самого проекта error: Logcat capture failed: spawn ENOENT
 
Разобрался, все ок. Не установил android sdk build tools.
 
  • Спасибо
Реакции: Skrine
Супер!=)
 
Serkser пока тема горячая запили пожалуйста видео, как делать все тоже самое только с андроид эмуляторами.
 
Ништяк! С selenium webdriver 2 работал до зенно, интересно будет пощупать щаблон) Победы на конкурсе!
 

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