appium、adb

appium环境搭建
.net
node.js
jdk
sdk
appium

appium工作原理
启动appium时会启动一个指定端口的服务,监听发送来的请求
使用Python代码写的自动化指令通过http通讯发给appium服务
appium再解析发送来的指令调用对应的框架相应操作APP

安装pip install Appium-Python-Client依赖包

adb  安卓调试桥android debug bridge
adb version 查看版本和安装路径
adb devices 获取连接设备 device状态是正常连接
adb connect ip:端口  连接设备
adb shell pm list packages 查看所有安装的包名
adb shell 进入手机系统的命令行
exit 退出手机终端
adb install apk安装包的完整路径  安装指定APP
adb uninstall 包名 卸载APP
adb push 本地文件路径 手机存放文件目录  把本地文件推送到手机指定文件夹
adb pull 手机文件路径 本地存放文件目录  把手机文件拉取到本地指定文件夹
adb shell dumpsys activity | findstr "mFocusedActivity" 查看当前APP的Activity
aapt dump badging apk安装包名字  APK安装包路径下输入可直接获取包名和Activity

APP元素定位
xml标签对class为标签名其余都为属性名,使用text获取需要@text,区别web元素定位
APP元素定位需要借助元素定位辅助工具,如appium
元素定位常见方式
1、ID
2、UiSelector 安卓自带的元素定位方法,固定用法new UiSelector().text("允许");双引号java语言
3、xpath
推荐使用1和2。UiSelector是安卓自带的一种定位方式,解析页面更快;xpath定位需要先把页面加载成DOM树,根据xpath语法的节点一级一级去解析,所以比较慢。

from appium.webdriver.common.mobileby import MobileBy

driver.find_element(MobileBy.ID,'com.android.packageinstaller:id/permission_allow_button').click()   # driver.find_element_by_id()

# driver.find_element_by_android_uiautomator('new UiSelector().text("允许")').click()
driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("允许")').click()

 

appium三大等待 同selenium

触屏操作





混合 App 打开 H5 调试开关 - 测试派





import time
from appium.webdriver import Remote
from appium.webdriver.common.mobileby import MobileBy

# 双引号
params = {"platformName":"Android",  # 设备操作系统
          "platformVersion":"7.1.2",  # 系统的版本
          "automationName":"UiAutomator2",  # 自动化测试框架
          "deviceName":"HUAWEIP30",  # 设备名字
          "appPackage":"cn.cntv",  # APP包名
          "appActivity":"com.cctv.mcctv.ui.activity.MainActivity",  # APP启动页面
          "noReset":True  # 默认为False每次启动自动清空缓存重置APP,为True时是不清空APP缓存
          }

driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',
                desired_capabilities=params)
driver.implicitly_wait(15)
# 获取当前页的源码,可在断言或判断页面是否发生变化时使用
# old = driver.page_source
# driver.find_element(MobileBy.ID,'com.android.packageinstaller:id/permission_allow_button').click() # driver.find_element_by_id()

# driver.find_element_by_android_uiautomator('new UiSelector().text("允许")').click()
driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("允许")').click()

# driver.find_element_by_android_uiautomator('new UiSelector().text("允许")').click()

driver.find_element_by_android_uiautomator('new UiSelector().text("允许")').click()

driver.find_element_by_android_uiautomator('new UiSelector().text("我的")').click()
# time.sleep(5)
# el1 = driver.find_element_by_id("com.android.packageinstaller:id/permission_allow_button")
# el1.click()
# time.sleep(5)
# el2 = driver.find_element_by_id("com.android.packageinstaller:id/permission_allow_button")
# el2.click()
# time.sleep(5)
# el3 = driver.find_element_by_id("com.android.packageinstaller:id/permission_allow_button")
# el3.click()
# time.sleep(5)
# el4 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.LinearLayout[4]")
# el4.click()

# 通过坐标进行点击,定位不到元素时再使用这种方法;手机屏幕分辨率不同,换台设备就可能用不了
# driver.tap([(100,100),(200,200)],200),点击坐标点使用列表嵌套元组,可有多个值依次点击,第二个参数为按住再放开的时间200毫秒
driver.tap([(100,100)],200)

# 通过坐标滑动屏幕,五个参数,滑动起止位置的横纵坐标和完成动作时间,支持上下左右滑动
driver.swipe(start_x=200,start_y=200,end_x=500,end_y=200,duration=200)

# 可先获取屏幕分辨率,记录坐标点击位置的比例再乘以当前设备的屏幕分辨率,动态传参
# 获取当前设备屏幕分辨率的方法
res = driver.get_window_size()
print(res)  # {'width':1080,'height':960}

from appium.webdriver.common.touch_action import TouchAction  # 触控对象
t1 = TouchAction(driver)
# TouchAction类中的tap方法可以传定位到的元素或者坐标,count参数为点击次数;使用关键字传参
# perform()调用后清空列表,同一个TouchAction()对象可重复使用,区别于selenium中的鼠标perform()
ele = driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("允许")')
t1.tap(element=ele,count=2).perform()

ele1 = driver.find_element(MobileBy.ANDROID_UIAUTOMATOR,'new UiSelector().text("允许")')
# 获取元素的大小和位置
res1 = ele1.rect  # {'width':1080,'height':960,'x':100,'y':150}
# 按下屏幕,可以传定位到的元素或者坐标
t1.press(el=ele1)
# 移动到哪个位置,可以传定位到的元素或者坐标
t1.move_to(x=100,y=150)
# 等待200毫秒,松开屏幕,提交动作
t1.wait(200).release().perform()
# 长按,可以传定位到的元素或者坐标
t1.long_press()
# 多点触控导包路径
from appium.webdriver.common.multi_action import MultiAction

# 切换到其他APP,传入包名和启动页面即可
driver.start_activity(app_package='',app_activity='')

# 混合APP里面带H5页面的只能定位到webview,里面的元素定位首先需要开启H5调试模式(找开发加串代码重新打包即可)
# 使用driver.switch_to.context()从APP原生控件切换到H5页
# 再使用UC devtools元素定位,与web自动化无任何区别

# 进入H5页面后使用contexts获取所有的上下文,得到的是一个列表,同web的窗口句柄;
# context是获取的当前窗口的上下文,得到的是一个字符串
res = driver.contexts  # 获取上下文
print(res)  # ['NATIVE_APP','WEBVIEW_com.xxxx'] webview名字固定
# 切换到webview
driver.switch_to.context(res[-1])
# 切回APP
driver.switch_to.default_content()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值