目录
一、移动端数据简介、端爬取数据的背景
1、获取移动端数据的作用
2、UIAutomator的介绍
3、UIAutomator的缺陷
4、UIAutomato2的优势
5、UIAutomator2的执行流程
二、adb的简介和u2的基本操作
1、adb的安装与使用
2、adb有什么作用?
3、adb如何使用?
4、UIAutomator2快速入门
5、UIAutomator2控制移动设备
6、UIAutomato2启动手机app
7、UIAutomator2自动化工具基本操作
三、weditor的基本操作
1、什么是Activity?
2、Activity的控件
3、weditor的使用
4、weditor的界面包括
5、UiSelector和控件定位
5.1 定位方式
5.2 Andrid基本布局
5.3 控件的属性
5.4 文本定位的方式
5.5 ClassName定位的方式
5.6 资源id进行定位
5.7 混合定位的方式
5.8 坐标点定位法
5.9 xpath定位的方式
四、fiddler抓包工具的使用
1、什么是fiddler?
2、fiddler的安装
3、Fiddler抓包有点
4、Fiddler抓包缺点
5、SwitchyOmega插件的安装
6、会话列表
7、fiddler 配置移动端数据包
7.1夜神模拟器配置
7.2 fiddler 配置
fiddler配置及使用教程 - silencio。 - 博客园
五、Appium
1、元素定位
1.1 通过ID定位:
1.2 获取元素文本、位置、大小、屏幕大小、属性
1.3 滑动
随机互联网的发展,数据不仅仅只是存在于PC端。移动端的数据在这几年的占比以及势头发展趋势呈现几何倍数的增长。对于做数据分析、用户画像、市场调研来说仅仅参考PC端的数据是远远不够的。那么于此同时移动的数据就显得尤为的重要
项目地址https://github.com/openatx/uiautomator2
Adb又称Android调试桥,用于通过电脑端与模拟器或者是设备之间的交互的一个工具
Adb client 命令行程序‘adb’用于从shell或脚本中运行adb命令
Adb server adb server 是运行在PC的的一个后台程序
Adbd 程序adbd作为一个后台进程在Android设备或模拟器系统中运行
把adb的bin目录添加到环境变量当中
adb devices 查看链接的移动设备
adb kill-server 关闭链接的移动设备
adb install apk文件路径 安装app应用
adb shell pm list packages 查看应用包名
adb uninstall 应用包名 卸载应用
python -m uiautomator2 init 初始化移动设备
Uiautomator-server: 就是谷歌原声的 uiautomator
Atx-agent: uiautomator的守护进程
minicap和minitouch 中2个包是atx-agent增加远程控制功能的依赖
u2.connect_wifi('172.17.100.15') 通过wifi
u2.connect_usb('127.0.0.1:62025') 通过usb(手机序列号)
u2.connect_adb_wifi('172.17.100.15:5555') 通过adb wifi
使用aapt工具进入这个路径输入
aapt dump badging apk的文件名
找到包名
d.app_start('包名')
停止
d.app_stop('包名')
d.service('uiautomator').running() uiautomator运行状态
d.service('uiautomator').start() 启动uiautomator
d.service('uiautomator').stop() 停止uiautomator
d.app_install(data='apk地址') 安装app
d.app_current() 获取当前前台app的信息
d.app_stop('包名') 停止当前app
d.app_clear('包名') 清除缓存
d.app_uninstall('包名') 卸载app
d.app_list() 获取所有app的信息
d.app_stop_all() 停止所有app
d.app_uninstall_all() 卸载所有app
Activity是Android系统中的四大组件之一,可以用于显示View。Activity是一个与用户交互的系统模块
pip install weditor -i https://pypi.douban.com/simple
在命令行输入 weditor
线性布局 linearLayout
相对布局 RelativelLayout
帧布局 FrameLayout
表格布局 TableLayout
绝对布局 AbsoluteLayout
index |
int |
索引 |
0 |
instance |
int |
实例 |
5 |
class |
Sting |
类名 |
android.widget.TextView |
package |
Sting |
包名 |
com.tl.kaoyan |
check |
boolean |
控件勾选状态 |
false/true |
enable/clickable |
boolean |
控件可点击 |
false/true |
focused/focusable |
boolean |
焦点 |
false/true |
Scrollable |
boolean |
滚动条 |
false/true |
Long-clickable |
boolean |
长按 |
false/true |
selected |
boolean |
选择状态 |
false/true |
Text 全文本匹配
textContains 文本包含
textMatches 正则表达式
textStartsWith 起始文本
className classNmae的值
classNameMatches 正则表达式匹配 classNmae的值
resourcdId 资源id
文本定位 资源id ClassName等可以配合使用来进行定位
坐标点定位法分为2种方式 一种是通过原始的坐标点来呈现。一种是通过%号的方式来呈现
d.xpath('xpath语句')
Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯
官网 Fiddler | Web Debugging Proxy and Troubleshooting Solutions
fiddler功能很强大
chrome浏览器SwitchyOmega安装与使用 - OTAKU_nicole - 博客园一、安装 打开 https://github.com/FelisCatus/SwitchyOmega/releases 下载 下载之后后缀crx改成zip,解压到文件夹 chrome浏览器打开扩展程序https://www.cnblogs.com/nicole-zhang/p/11955881.html
(现在打开我们模拟器的浏览器)
提示有证书问题,我们来安装证书,点击继续
在这里输入我们的ip地址
(点击这个选项)
(如果设置密码的就已经可以了,如果没有设置密码会弹出选项让我们来设置密码)
弹出这个吐司证明安装成功了
fiddler的安装,可以参考如下文档:
fiddler配置及使用教程 - silencio。 - 博客园
注意:
1、夜神模拟器安装证书后无效问题解决?
即使按照其它教程的安装证书,也只是把证书安装到了用户下面,然而安卓高版本(7.0)之后呢,app可以只信任指定证书和系统内置的证书,后续用户安装的证书是不生效的。 所以切换成低版本的系统。
2、使用Fiddler抓包抓取不了数据包的问题
原因:使用Fiddler抓包抓取不了数据包的问题
使用Appium和Python来进行自动化测试,需要安装两个,一个是appium的客户端,一个是appium-python库,这两个需要安装的东西再加上手机就可以进行自动化测试了。他们之间的关系:python代码->Appium-Python库-》Appium-》手机
Appium环境搭建的超详细教程: Appium环境搭建超详细教程 - 知乎前言:本系列教程会从软件的基本安装开始,最终目的是通过完成几个案例后, 大家实现 自由抓取App中想要的资源。本系列以后会更的: Appium基本使用及控制真机及安卓模拟器Mitmproxy抓包工具的基本使用Fiddler抓包软件…https://zhuanlan.zhihu.com/p/49193525
需要用到的工具:
问题:
Adb连不上夜神模拟器的原因&&adb devices显示设备信息为空_凌萧的萧的博客-CSDN博客_dows窗口连接不上模拟器I、Adb连不上夜神模拟器的原因:(夜神模拟器的端口为62001)SDK 的 adb 版本与夜神模拟器的 adb 版本不一致(最重要)* 看看两个 adb 的版本分别是多少。* SDK adb 版本查询命令:adb version* 夜神模拟器的 adb 版本查询命令nox_adb version(如果要执行此命令,则需要在系统环境变量中配置夜神模拟器的bin目录)* 如果两个adb的版本不一致,解决方案如下:·先关闭所有 adb 的进程(在任务管理器中);·将 SDK 的...https://blog.csdn.net/weixin_45282042/article/details/109017645
原因:adb 没有连接上夜神模拟器
解决:cmd——adb connect 127.0.0.1:62001
error: no devices/emulators found解决办法_shixiu_yuan的博客-CSDN博客这是由于没有找到设备或模拟器,导致的解决方法:检查是否连上了设备或者打开了模拟器检查设备或模拟器是否打开了开发者模式打开开发者模式由于不同品牌不同型号而有所不同,这里我讲解一下华为手机的打开方式(如果此方法找不到,可从网上搜索对应手机的开发者模式打开方法):(1)进入到设置–系统–关于手机(2)多次点击版本号(3)退回到系统页面,找到开发人员选项(4)打开开发人员选项和USB调...https://blog.csdn.net/shixiu_yuan/article/details/103517388
原因就是adb版本与nox_adb版本不一致
将adroid sdk platform-tools下的adb.exe 拷贝到Nox/bin目录(夜神模拟器安装目录),改名nox_adb.exe。再运行脚本可以正常执行了。
两种方式:1是使用android-sdk中的C:\work\soft\android-sdk\tools\uiautomatorviewer.bat
可能遇到的问题:uiautomatorviewer打不开,原因:java的jdk版本过高。下载jdk1.8版本
案例:
from appium import webdriver
caps = dict()
# 系统
caps['platformName'] = 'Android'
# 系统版本
caps['platformVersion'] = '5.1.1'
# 设备名称
caps['deviceName'] = 'Android'
# 包名
caps['appPackage'] = 'com.tal.kaoyan'
# 界面名称
caps['appActivity'] = 'com.kaoyan.kylogin.ui.login.LoginKActivity'
# 使用自带的输入法,输入中文填True
caps['unicodeKeyboard'] = True
# 执行完程序恢复原来输入法
caps['resetKeyboard'] = True
caps['noReset'] = True
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',caps)
print('第一步:输入手机号')
tel = driver.find_element('id','com.tal.kaoyan:id/kylogin_phone_input_phonenum').send_keys('18735309044')
print('第二步:点击发送验证码')
send_code = driver.find_element('id','com.tal.kaoyan:id/kylogin_phone_input_codeget').click()
print('第三步:输入验证码')
code = input('请输入验证码')
driver.find_element('id','com.tal.kaoyan:id/kylogin_phone_input_code').send_keys(code)
print('第四步:同意协议')
driver.find_element('id','com.tal.kaoyan:id/loginTreatyCheckboxPhone').click()
print('第五步:登录')
driver.find_element('id','com.tal.kaoyan:id/loginCodeLoginBtn').click()
说明:这里的包名和当前打开界面的名称通过adb命令来获取的:命令如下:
adb shell dumpsys window windows | findstr mFocusedApp
另一种方法就是:appium自带功能
这样就定位到了元素的位置。
from appium import webdriver
from appium.webdriver.extensions.android.nativekey import AndroidKey
from appium.webdriver.common.appiumby import By
caps = dict()
# 系统
caps['platformName'] = 'Android'
# 系统版本
caps['platformVersion'] = '5.1.1'
# 设备名称
caps['deviceName'] = 'Android'
# 包名
caps['appPackage'] = 'com.android.Calendar'
# 界面名称
caps['appActivity'] = '.ui.activity.MainActivity'
# 使用自带的输入法,输入中文填True
caps['unicodeKeyboard'] = True
# 执行完程序恢复原来输入法
caps['resetKeyboard'] = True
caps['noReset'] = True
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',caps)
# 点击,输入,清空
try:
skip = driver.find_element(By.ID, 'com.android.Calendar:id/btn_skip')
if skip:
skip.click()
except:
pass
# 点击一下搜索框
driver.find_element(By.ID,'com.android.Calendar:id/tv_search').click()
# 搜索淘宝
driver.find_element(By.ID,'com.android.Calendar:id/et_search_word').send_keys('淘宝')
# 点击搜索按钮
#driver.find_element(By.ID,'com.android.Calendar:id/ibtn_search').click()
# 或者回车 AndroidKey 键盘按键
driver.press_keycode(AndroidKey.ENTER)
from appium import webdriver
from appium.webdriver.common.appiumby import By
caps = dict()
# 系统
caps['platformName'] = 'Android'
# 系统版本
caps['platformVersion'] = '5.1.1'
# 设备名称
caps['deviceName'] = 'Android'
# 包名
caps['appPackage'] = 'com.android.settings'
# 界面名称
caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',caps)
# 获取元素文本
# 获取无线名称
print(driver.find_element(By.XPATH,'//*[@text="WLAN"]').text)
# 获取元素的位置和大小
# {'x': 1208, 'y': 38}
print(driver.find_element(By.id,'com.android.settings:id/search').location)
# {'height': 69, 'width': 72}
print(driver.find_element(By.id,'com.android.settings:id/search').size)
print(driver.get_window_size())
# 获取元素的属性值
print(driver.find_element(By.id,'com.android.settings:id/search').get_attribute('content-desc'))
from appium import webdriver
import time
from appium.webdriver.common.appiumby import By
caps = dict()
caps['platformName'] = 'Android'
caps['platformVersion'] = '5.1.1'
caps['deviceName'] = 'Android'
caps['appPackage'] = 'com.ss.android.ugc.aweme'
caps['appActivity'] = '.splash.SplashActivity'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', caps)
"""获取屏幕的宽高"""
def get_size(driver):
x = driver.get_window_size()['width']
y = driver.get_window_size()['height']
return x,y
# 向上滑动
def swipeup(driver,t = 100,n=10):
x, y = get_size(driver)
x1 = x * 0.5
y1 = y * 0.2
y2 = y * 0.7
time.sleep(5)
is_agree = driver.find_element('id', 'com.ss.android.ugc.aweme:id/c6-')
if is_agree:
is_agree.click()
for i in range(n):
try:
driver.swipe(x1, y1, x1, y2, t)
except Exception as error:
print('error:',error)
# 向下滑动
def swipedown(driver,t = 500,n = 1):
x,y = get_size(driver)
x1 = x * 0.5
y1 = y * 0.8
y2 = y * 0.2
for i in range(n):
driver.swipe(x1,y1,x1,y2,t)
# swipeup(driver)
# 一个元素滑动到另一个元素 没有惯性的
# w_button = driver.find_element(By.XPATH,'//*[@text="WLAN"]')
# y_button = driver.find_element(By.XPATH,'//*[@text="应用"]')
# driver.drag_and_drop(y_button, w_button)
# 一个元素滑动到另一个元素 有惯性的
# driver.scroll(y_button, w_button)