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
触屏操作
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()