[Appium] App自动化-元素定位及工具
一、元素定位工具简介
Web自动化是通过浏览器自带的F12键进行元素定位,但是App自动化支持三大定位工具(UIAutomatorView/Appium Desktop Inspector/Weditor)
二、UIAutomatorView
2.1 UIAutomatorView
UIAutomatorView这个工具是Android SDK自带的一个元素定位工具,存放在Android SDK工具下的tools目录下,uiautomatorviewer.bat 点击第二个Device Screenshoot按钮会发现,弹出以下错误,是因为当前的Android SDK版本太高了,只能通过手动导入Screenshot和UI XML Dump来尝试了,确保当前终端处于连接状态 打开command prompt然后输入以下命令生成Screenshot和UI XML Dump两个文件,然后导入UIAutomatorView
adb shell uiautomator dump /sdcard/app.uix # 把当前窗口的UI布局信息输出到/sdcard/app.uix文件
adb pull /sdcard/app.uix D:\1\app.uix # 把手机里面的app.uix文件写到本地D:\1\app.uix文件
adb shell screencap -p /sdcard/app.png # 截取当前的屏幕图片,并保存到/sdcard/app.png
adb pull /sdcard/app.png D:\1\app.png # 把上面的截图文件从手机中传递到电脑的D:\1\app.png中
导入完成后,app的UI显示在当前工具中 虽然可以通过导入文件的方式来实现元素定位,但是当前方法每个页面都需要如此操作,实在是不方便,所以不推荐使用
2.2、Appium Desktop Inspector
Appium Desktop Inspector是Appium Server自带的元素定位工具,使用的话需要打开Appium Server 打开之后需要设置Desired Capabilities配置项,参照下图设置好需要设置的,如果此设置基本不变可以点击左边的Save As…进行保存,然后点击Start Session 开始会话后,打开被测终端,然后打开需要测试的APP,点击刷新按钮,发现App界面同步过来了 接下来就可以进行相应的元素定位了
2.3、Weditor
UIautomator2是一个python第三方库, appUI自动化测试框架, webditor包含于UIautomator2,所以第一步需要安装UIautomator2 在pychram当前开发环境中打开Terminal然后使用pip install Uiautomator2(pip需要设置系统环境变量),切记当前三个包是安装在虚拟项目中不是python安装目录中,未设置系统变量,如果不在项目目录下运行是会提示找不到当前命令 UIautomator2安装完成后需要进行一个初始化: python -m uiautomator2 init 初始化完成后,接下来安装weditor: pip install weditor 安装完成后验证webditor是否安装成功,首先确保在使用python -m weditor 打开weditor页面,点击Connect,如果连接成功右侧的绿色树叶就会出现,这个时候打开被测终端的App,weditor当中就会同步实现App的UI了 连接成功会发现被测终端多了一个应用程序ATX,类似于之前Appium Server安装的appium settings 三种工具倾向于使用weditor,如果要使用会UIautomator,需要卸载掉ATX程序才可以
2.4 常见问题
- 如果使用Appium Desktop Inspector过程中发现An unknown server-side error occurred while processing the command. Original error: Cannot read property ‘toLowerCase’ of undefined. 可能是因为单词拼写错误
- Appium自动化测试启动APP遇到"UiAutomator exited unexpectedly with code 0, signal null",可能需要重启一下被测终端就解决了
三、元素定位
Appium界面定位元素的方法主要有: id–>ClassName–>text–>accessibility–>xpath
3.1 id
通过resourceid属性定位 find_element_by_id返回WebElement对象 当前示例没有resourceid,如果有的话通过find_element_by_id(“resourceid”)即可进行定位
3.2 ClassName
通过ClassName来进行元素定位,脚本编写为: find_element_by_class_name() 参考上述示例,脚本编写为: driver.find_element_by_class_name(‘android.widget.EditText’)
3.3 text
find_element_by_android_uiautomator() 通过调用系统自带框架(Uiautomator/Uiautomator2) 实现元素定位,基于java代码编写UiSelector实现元素定位, 可以参考UiSelector的官方文档: UiSelector 参考上述示例,脚本编写为: find_element_by_android_uiautomator(‘new UiSelector().text(“请输入邮箱”)’)
3.4 content-desc/description
通过description来进行元素定位,脚本编写为: find_element_by_accessibility_id(“description”)
3.5 xpath
通过XPathLite来进行元素定位,脚本编写为: find_element_by_xpath(“//*[@text=‘请输入邮箱’]”)
四、App元素操作
- App四大常用元素操作: click(),send_keys(),get_attribute(),text()
- App特殊操作: 滑屏,多点操控,长按等
4.1 滑屏(Swipe)
滑屏分左滑,右滑,上滑,下滑 swipe(start_x: int, start_y: int, end_x: int, end_y: int, duration: int = 0) Args: start_x: x-coordinate at which to start start_y: y-coordinate at which to start end_x: x-coordinate at which to stop end_y: y-coordinate at which to stop duration: time to take the swipe, in ms.
这里可以看到滑屏的话需要知道开始结束的坐标,那么除了获取屏幕尺寸get_windows_size的方法返回当前的width/height的字典值之外,还可以在开发者选项中打开被测终端的指针位置,这样就可以看到被测终端的坐标
window_size = driver.get_window_size()
x = window_size['width']
y = window_size['height']
driver.swipe(start_x=x*0.9, start_y=y*0.5, end_x=x*0.3, end_y=y*0.5, duration=1000)
// 左滑的话开x的始坐标要大于结束坐标, 同理右滑的话x的开始坐标小于x的结束左边,上滑下滑以此类推
//滑动的话用比例优于具体的坐标
如果需要滑多次可以写个for循环
4.2 模拟触屏(TouchAction)
TouchAction对象包含(tab)、press(短按)、move_to(滑动到某个坐标)等方法 通过TouchAction对象,添加tap、move_to等操作,然后perform()执行,可以实现解锁屏幕等功能
短按(press) 长按(LongPress) 点击(tap) 移动到(move_to) 等待(wait) 释放(release) 执行(perform) 取消(cancel)
例如: action=TouchAction(driver) action.press(x=220,y=700).move_to(x=840, y=700).move_to(x=220, y=1530).move_to(x=840, y=1530).release().perform()
4.3 多点触控(MultiAction)
通过MultiAction(driver).add()添加多个TouchAction操作,最后调用perform()一起执行这些操作, 可以实现一些放大或者缩小功能 action0 = TouchAction(driver).tap(element) action1 = TouchAction(driver).tap(element) MultiAction(driver).add(action0, action1).perform()
4.4 系统按键事件(press_keycode)
driver.press_keycode(keycode)
电话键
键名 描述 键值
KEYCODE_CALL 拨号键 5
KEYCODE_ENDCALL 挂机键 6
KEYCODE_HOME 按键Home 3
KEYCODE_MENU 菜单键 82
KEYCODE_BACK 返回键 4
KEYCODE_SEARCH 搜索键 84
KEYCODE_CAMERA 拍照键 27
KEYCODE_FOCUS 拍照对焦键 80
KEYCODE_POWER 电源键 26
KEYCODE_NOTIFICATION 通知键 83
KEYCODE_MUTE 话筒静音键 91
KEYCODE_VOLUME_MUTE 扬声器静音键 164
KEYCODE_VOLUME_UP 音量增加键 24
KEYCODE_VOLUME_DOWN 音量减小键 25
控制键
键名 描述 键值
KEYCODE_ENTER 回车键 66
KEYCODE_ESCAPE ESC键 111
KEYCODE_DPAD_CENTER 导航键 确定键 23
KEYCODE_DPAD_UP 导航键 向上 19
KEYCODE_DPAD_DOWN 导航键 向下 20
KEYCODE_DPAD_LEFT 导航键 向左 21
KEYCODE_DPAD_RIGHT 导航键 向右 22
KEYCODE_MOVE_HOME 光标移动到开始键 122
KEYCODE_MOVE_END 光标移动到末尾键 123
KEYCODE_PAGE_UP 向上翻页键 92
KEYCODE_PAGE_DOWN 向下翻页键 93
KEYCODE_DEL 退格键 67
KEYCODE_FORWARD_DEL 删除键 112
KEYCODE_INSERT 插入键 124
KEYCODE_TAB Tab键 61
KEYCODE_NUM_LOCK 小键盘锁 143
KEYCODE_CAPS_LOCK 大写锁定键 115
KEYCODE_BREAK Break/Pause键 121
KEYCODE_SCROLL_LOCK 滚动锁定键 116
KEYCODE_ZOOM_IN 放大键 168
KEYCODE_ZOOM_OUT 缩小键 169
组合键
键名 描述
KEYCODE_ALT_LEFT Alt+Left
KEYCODE_ALT_RIGHT Alt+Right
KEYCODE_CTRL_LEFT Control+Left
KEYCODE_CTRL_RIGHT Control+Right
KEYCODE_SHIFT_LEFT Shift+Left
KEYCODE_SHIFT_RIGHT Shift+Right
基本
键名 描述 键值
KEYCODE_0 按键'0' 7
KEYCODE_1 按键'1' 8
KEYCODE_2 按键'2' 9
KEYCODE_3 按键'3' 10
KEYCODE_4 按键'4' 11
KEYCODE_5 按键'5' 12
KEYCODE_6 按键'6' 13
KEYCODE_7 按键'7' 14
KEYCODE_8 按键'8' 15
KEYCODE_9 按键'9' 16
KEYCODE_A 按键'A' 29
KEYCODE_B 按键'B' 30
KEYCODE_C 按键'C' 31
KEYCODE_D 按键'D' 32
KEYCODE_E 按键'E' 33
KEYCODE_F 按键'F' 34
KEYCODE_G 按键'G' 35
KEYCODE_H 按键'H' 36
KEYCODE_I 按键'I' 37
KEYCODE_J 按键'J' 38
KEYCODE_K 按键'K' 39
KEYCODE_L 按键'L' 40
KEYCODE_M 按键'M' 41
KEYCODE_N 按键'N' 42
KEYCODE_O 按键'O' 43
KEYCODE_P 按键'P' 44
KEYCODE_Q 按键'Q' 45
KEYCODE_R 按键'R' 46
KEYCODE_S 按键'S' 47
KEYCODE_T 按键'T' 48
KEYCODE_U 按键'U' 49
KEYCODE_V 按键'V' 50
KEYCODE_W 按键'W' 51
KEYCODE_X 按键'X' 52
KEYCODE_Y 按键'Y' 53
KEYCODE_Z 按键'Z' 54
符号
键名 描述
KEYCODE_PLUS 按键'+'
KEYCODE_MINUS 按键'-'
KEYCODE_STAR 按键'*'
KEYCODE_SLASH 按键'/'
KEYCODE_EQUALS 按键'='
KEYCODE_AT 按键'@'
KEYCODE_POUND 按键'#'
KEYCODE_APOSTROPHE 按键''' (单引号)
KEYCODE_BACKSLASH 按键'\'
KEYCODE_COMMA 按键','
KEYCODE_PERIOD 按键'.'
KEYCODE_LEFT_BRACKET 按键'['
KEYCODE_RIGHT_BRACKET 按键']'
KEYCODE_SEMICOLON 按键';'
KEYCODE_GRAVE 按键'`'
KEYCODE_SPACE 空格键
小键盘
键名 描述
KEYCODE_NUMPAD_0 小键盘按键'0'
KEYCODE_NUMPAD_1 小键盘按键'1'
KEYCODE_NUMPAD_2 小键盘按键'2'
KEYCODE_NUMPAD_3 小键盘按键'3'
KEYCODE_NUMPAD_4 小键盘按键'4'
KEYCODE_NUMPAD_5 小键盘按键'5'
KEYCODE_NUMPAD_6 小键盘按键'6'
KEYCODE_NUMPAD_7 小键盘按键'7'
KEYCODE_NUMPAD_8 小键盘按键'8'
KEYCODE_NUMPAD_9 小键盘按键'9'
KEYCODE_NUMPAD_ADD 小键盘按键'+'
KEYCODE_NUMPAD_SUBTRACT 小键盘按键'-'
KEYCODE_NUMPAD_MULTIPLY 小键盘按键'*'
KEYCODE_NUMPAD_DIVIDE 小键盘按键'/'
KEYCODE_NUMPAD_EQUALS 小键盘按键'='
KEYCODE_NUMPAD_COMMA 小键盘按键','
KEYCODE_NUMPAD_DOT 小键盘按键'.'
KEYCODE_NUMPAD_LEFT_PAREN 小键盘按键'('
KEYCODE_NUMPAD_RIGHT_PAREN 小键盘按键')'
KEYCODE_NUMPAD_ENTER 小键盘按键回车
功能键
键名 描述
KEYCODE_F1 按键F1
KEYCODE_F2 按键F2
KEYCODE_F3 按键F3
KEYCODE_F4 按键F4
KEYCODE_F5 按键F5
KEYCODE_F6 按键F6
KEYCODE_F7 按键F7
KEYCODE_F8 按键F8
KEYCODE_F9 按键F9
KEYCODE_F10 按键F10
KEYCODE_F11 按键F11
KEYCODE_F12 按键F12
多媒体键
键名 描述
KEYCODE_MEDIA_PLAY 多媒体键 播放
KEYCODE_MEDIA_STOP 多媒体键 停止
KEYCODE_MEDIA_PAUSE 多媒体键 暂停
KEYCODE_MEDIA_PLAY_PAUSE 多媒体键 播放/暂停
KEYCODE_MEDIA_FAST_FORWARD 多媒体键 快进
KEYCODE_MEDIA_REWIND 多媒体键 快退
KEYCODE_MEDIA_NEXT 多媒体键 下一首
KEYCODE_MEDIA_PREVIOUS 多媒体键 上一首
KEYCODE_MEDIA_CLOSE 多媒体键 关闭
KEYCODE_MEDIA_EJECT 多媒体键 弹出
KEYCODE_MEDIA_RECORD 多媒体键 录音
手柄按键
键名 描述
KEYCODE_BUTTON_1 通用游戏手柄按钮
KEYCODE_BUTTON_2 通用游戏手柄按钮
KEYCODE_BUTTON_3 通用游戏手柄按钮
KEYCODE_BUTTON_4 通用游戏手柄按钮
KEYCODE_BUTTON_5 通用游戏手柄按钮
KEYCODE_BUTTON_6 通用游戏手柄按钮
KEYCODE_BUTTON_7 通用游戏手柄按钮
KEYCODE_BUTTON_8 通用游戏手柄按钮
KEYCODE_BUTTON_9 通用游戏手柄按钮
KEYCODE_BUTTON_10 通用游戏手柄按钮
KEYCODE_BUTTON_11 通用游戏手柄按钮
KEYCODE_BUTTON_12 通用游戏手柄按钮
KEYCODE_BUTTON_13 通用游戏手柄按钮
KEYCODE_BUTTON_14 通用游戏手柄按钮
KEYCODE_BUTTON_15 通用游戏手柄按钮
KEYCODE_BUTTON_16 通用游戏手柄按钮
KEYCODE_BUTTON_A 游戏手柄按钮 A
KEYCODE_BUTTON_B 游戏手柄按钮 B
KEYCODE_BUTTON_C 游戏手柄按钮 C
KEYCODE_BUTTON_X 游戏手柄按钮 X
KEYCODE_BUTTON_Y 游戏手柄按钮 Y
KEYCODE_BUTTON_Z 游戏手柄按钮 Z
KEYCODE_BUTTON_L1 游戏手柄按钮 L1
KEYCODE_BUTTON_L2 游戏手柄按钮 L2
KEYCODE_BUTTON_R1 游戏手柄按钮 R1
KEYCODE_BUTTON_R2 游戏手柄按钮 R2
KEYCODE_BUTTON_MODE 游戏手柄按钮 Mode
KEYCODE_BUTTON_SELECT 游戏手柄按钮 Select
KEYCODE_BUTTON_START 游戏手柄按钮 Start
KEYCODE_BUTTON_THUMBL Left Thumb Button
KEYCODE_BUTTON_THUMBR Right Thumb Button
待查
键名 描述
KEYCODE_NUM 按键Number modifier
KEYCODE_INFO 按键Info
KEYCODE_APP_SWITCH 按键App switch
KEYCODE_BOOKMARK 按键Bookmark
KEYCODE_AVR_INPUT 按键A/V Receiver input
KEYCODE_AVR_POWER 按键A/V Receiver power
KEYCODE_CAPTIONS 按键Toggle captions
KEYCODE_CHANNEL_DOWN 按键Channel down
KEYCODE_CHANNEL_UP 按键Channel up
KEYCODE_CLEAR 按键Clear
KEYCODE_DVR 按键DVR
KEYCODE_ENVELOPE 按键Envelope special function
KEYCODE_EXPLORER 按键Explorer special function
KEYCODE_FORWARD 按键Forward
KEYCODE_FORWARD_DEL 按键Forward Delete
KEYCODE_FUNCTION 按键Function modifier
KEYCODE_GUIDE 按键Guide
KEYCODE_HEADSETHOOK 按键Headset Hook
KEYCODE_META_LEFT 按键Left Meta modifier
KEYCODE_META_RIGHT 按键Right Meta modifier
KEYCODE_PICTSYMBOLS 按键Picture Symbols modifier
KEYCODE_PROG_BLUE 按键Blue “programmable”
KEYCODE_PROG_GREEN 按键Green “programmable”
KEYCODE_PROG_RED 按键Red “programmable”
KEYCODE_PROG_YELLOW 按键Yellow “programmable”
KEYCODE_SETTINGS 按键Settings
KEYCODE_SOFT_LEFT 按键Soft Left
KEYCODE_SOFT_RIGHT 按键Soft Right
KEYCODE_STB_INPUT 按键Set-top-box input
KEYCODE_STB_POWER 按键Set-top-box power
KEYCODE_SWITCH_CHARSET 按键Switch Charset modifier
KEYCODE_SYM 按键Symbol modifier
KEYCODE_SYSRQ 按键System Request / Print Screen
KEYCODE_TV 按键TV
KEYCODE_TV_INPUT 按键TV input
KEYCODE_TV_POWER 按键TV power
KEYCODE_WINDOW 按键Window
KEYCODE_UNKNOWN 未知按键
|