[Appium] App自动化-元素定位

[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 常见问题

  1. 如果使用Appium Desktop Inspector过程中发现An unknown server-side error occurred while processing the command. Original error: Cannot read property ‘toLowerCase’ of undefined. 可能是因为单词拼写错误
    在这里插入图片描述
  2. 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元素操作

  1. App四大常用元素操作: click(),send_keys(),get_attribute(),text()
  2. 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 通用游戏手柄按钮 #1
KEYCODE_BUTTON_2 通用游戏手柄按钮 #2
KEYCODE_BUTTON_3 通用游戏手柄按钮 #3
KEYCODE_BUTTON_4 通用游戏手柄按钮 #4
KEYCODE_BUTTON_5 通用游戏手柄按钮 #5
KEYCODE_BUTTON_6 通用游戏手柄按钮 #6
KEYCODE_BUTTON_7 通用游戏手柄按钮 #7
KEYCODE_BUTTON_8 通用游戏手柄按钮 #8
KEYCODE_BUTTON_9 通用游戏手柄按钮 #9
KEYCODE_BUTTON_10 通用游戏手柄按钮 #10
KEYCODE_BUTTON_11 通用游戏手柄按钮 #11
KEYCODE_BUTTON_12 通用游戏手柄按钮 #12
KEYCODE_BUTTON_13 通用游戏手柄按钮 #13
KEYCODE_BUTTON_14 通用游戏手柄按钮 #14
KEYCODE_BUTTON_15 通用游戏手柄按钮 #15
KEYCODE_BUTTON_16 通用游戏手柄按钮 #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         未知按键
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值