一、用法
- 获取 driver 属性
- 获取元素属性
- 用户操作
- 触屏操作
- swipe滑动
- start_activity进入页面
- 放大缩小
- 按键操作
- Toast
- 其他操作
(1)获取 driver 属性
- current_package, 包名。 aapt,元素定位
- current_activity, 获取当前页面, 后面切换有用
- context, 上下文。web窗口切换。h5测试,获取上下文
driver.switch_to_context - contexts, 所有的上下文。 winodw_handlers
- page_source , 获取页面源代码
- capabilities
- device_time, 设备时间
- location, 定位
(2)获取元素属性
-
el.rect 获取元素宽度,高度,x,y
-
text
-
el.get_attribute()
(3)用户操作
-
el.click()
-
el.send_keys()
(4)触屏操作(全部封装在TouchAction这个类里面)
from appium.webdriver.common.touch_action import TouchAction
xpath_my = '//*[@resource-id="com.lemon.lemonban:id/navigation_my"]/android.widget.ImageView[1]'
el = driver.find_element('xpath', xpath_my)
action = TouchAction(driver)
action.tap(el).perform()
- tap,点击,按下去然后松开, 相当于全局的click,适合封装在basepage中
- move_to, 移动
- press, 按下去不松开
- long_press, 长按不松开
- release, 松开
- wait, 等待
- flick, 划一下就松开(用得不多)
(5)swipe 滑动 (单指操作)
from appium.webdriver import Remote
caps = {
"deviceName": "emulator-5554",
"platformName": "Android",
"app": r"D:\Future-release-2018.apk",
"newCommandTimeout": 1200
}
# Remote 类是集成自 selenium webdriver类
driver = Remote(command_executor='http://127.0.0.1:4446/wd/hub',
desired_capabilities=caps
)
# 方法1:直接输入对应的坐标点
# 存在的问题:不稳定。换一个大屏手机可能就失效了
driver.swipe(600, 600, 100, 600)
# 方法2:可以使用不同的分辨率的手机,都可以通用的让滑动生效
# 思路,1,获取手机的屏幕宽度和高度width,height
# 从右边往左边滑
# 2, driver.swipe(width * 0.9, height * 0.5, width * 0.1, height * 0.5 )
# {'width': 900, 'height': 1600, 'x': 0, 'y': 0}
# rect = driver.get_window_rect()
# width = rect['width']
# height = rect['height']
# 从左边滑动到右边
driver.swipe(width * 0.1, height * 0.5, width * 0.9, height * 0.5 )
# 从上面滑动到下面, 下拉刷新操作
driver.swipe(width * 0.5, height * 0.1, width * 0.5, height * 0.9 )
# 从下面滑动到上面,上拉刷新,懒加载
driver.swipe(width * 0.5, height * 0.9, width * 0.5, height * 0.1 )
每次都要传四个参数,很麻烦 ,封装一下
再简化一下,在width方法和height方法上面添加@property, 这个是用来干嘛的?这个表示会把这个方法转化成属性。
注意:不难发现,其实swipe还有一个参数 duration,这个是用干嘛的? 数值越大,滑动的速度越慢,数值越小,滑动的速度越快,这个其实是控制滑动的速度,duration=1000,就是1秒钟滑到指定位置。
!!! 如果滑动速度过快,app就容易卡死,所以正常让duration参数设置的不要太小,也就是不要让他滑动的太快,正常设置duration=1000可以了。
(6)start_activity进入页面
作用:这个是啥意思呢?你可以直接进入某个界面,不需要一步一步去点击,但是呢,一定要确保这个界面是可以进入的,因为有些界面需要登录 或者需要某个权限才能进入。
- 什么时候才用?
答: 如果需要测试某个单独的页面,但是进入这个页面有很长的路径,则会严重影响效率, 而且路径过长,会让测试程序不稳定。 start_activitykeyi 可以快速进入指定界面,只需要指定activity的名称。 - 那么问题来了,怎么获取当前页面的名称呢?
# 获取当前页面的名称 adb shell dumpsys activity | find "mResumedActivity"
- 好处是什么?
答:尽可能避免不必要的流程,提升我们UI自动化测试的稳定性,也尽量避免因多次定位元素导致的出错。 - 怎么使用?
# 需要填写两个参数,1.需要跳转的包名,2.进入哪个页面。
driver.satrt_activity('com.lemon.lemonban', '.activity.LoginActActivity')
5. 可以从appA跳转到另外一个app页面,多个app之间的跳转(只需要把包名换成其他的app的包名,activity改成其他app的页面名称就能实现多个app之间的跳转)。
6. 某一个元素移动到另外一个元素上面怎么操作。
def swipe_element(self, el1,el2, duration=1000):
"一个元素移动到另外一个元素上面"
action = TouchAction(self)
action.press(el=el1).wait(ms=duration).move_to(el2).release()
action.perform()
return self
(7)放大缩小(多指操作)
from appium.webdriver.common.multi_action import MultiAction
# 1. TouchAction 一个手指的触控操作
# 2. MultiAction 多个手指的触控操作
# MultiAction 由多个 TouchAction 组成
# 放大
# 思路,先初始化两个 TouchAction, a1, a2
# 1, a1 先按下屏幕最中心的点,a2 按下屏幕最中心的点
# 2, a1 move_to(y=y_point) height * 0.1
# 3, a2 move_to(y=y_point) height * 0.9
# 缩小
# 思路,先初始化两个 TouchAction, a1, a2
# 1, a1 按下屏幕 height * 0.1 , a2 height * 0.9
# 2, a1 move_to(y=y_point) height * 0.5
# 3, a2 move_to(y=y_point) height * 0.5
缩小改变一下x参数就ok了。
(8)按键操作
具体可bd搜索Appium---- Android的KeyCode键值
(9)toast