app自动化测试原理和元素定位

基本概念&工作原理:

1.Appium Clients

appium官方提供了一套appium client,涵盖多种语言ruby/java/python等,这些client库是对原生的webdriver进行了一些移动端的扩展,加入了一些方便的方法,也就是我们之前安装的Appium-Python-Client

2.Appium Server

这就是每次我们在命令行用appium命令或app/exe直接打开的东⻄。

3.Desired Capabilities

Desired Capabilities携带了一些配置信息,可以理解成java里的map,python里的字典,ruby里的hash以及js里的json对象。实际上Desired Capabilities在传输时就是json对象。
Desired Capabilities最重要的作用是告诉server本次测试的上下文:要进行测试的是浏览器还是移动端?android还是ios?哪个app?等。简单理解就是告诉server,我们这次要测试的是什么东⻄。也就是本次测试的配置信息。

4.Session

session就是一个会话,在webdriver/appium,你的所有工作永远都是在session start后才可以进行的。一般来说,通过POST/session这个URL,然后传入Desired Capabilities就可以开启session了。 开启session后,会返回一个全局唯一的session id,以后几乎所有的请求都必须带上这个session id,因为这个seesion id代表了你所打开的浏览器或者是移动设备的模拟器。由于session id是全局唯一,那么在同一台机器上启动多个session就变成了可能。

5.工作原理

appium的核心其实是一个暴露了一系列REST API的server。这个server的功能其实很简单:监听一个端口,然后接收由client发送来的command。翻译这些command,把这些command转成移动设备可以理解的形式发送给移动设备,然后移动设备执行完这些command后把执行结果返回给appium server,appium server再把执行结果返回给client。在这里client其实就是发起command的设备,也就是执行我们编写的appium测试代码的机器。狭义点理解,可以把client理解成是代码,这些代码可以是java/ruby/python/js的,只要它实现了webdriver标准协议就可以。 这样的设计思想带来了一些好处:

1.可以带来多语言的支持;

2.可以把server放在任意机器上,哪怕是云服务器都可以;(appium和webdriver天生适合云测试)

UI-Automator

UI自动化测试框架,安卓移动端app,要求Android4.3以上
提供了一系列API:执行UI测试在系统或者第三方app上面
允许在被测设备上执行操作,比如打开系统设置菜单
适合编写黑盒自动化测试
框架的主要特点:
元素定位:uiautomatorviewer 扫描、分析待测应用的UI组件的图像工具
元素操作:Accessing device state 在目标设备和app上的各种操作
元素识别:UIAutomator APIs 在多个应用程序中捕获和操作UI组件

 app页面元素定位

通过id定位元素:resource-id
通过ClassName定位:classname
通过Accessibilityid定位:content-desc
通过AndroidUiAutomator定位--Java编写的,参考API文档
通过Xpath定位--不推荐,很慢
以上5种搞不定只能使用坐标,但不稳定
API - TouchAction&键盘操作
1.TouchAction:Appium的辅助类,主要针对手势操作,比如滑动、⻓按、拖 动等。
原理:
1.先获取设备的屏幕大小(长,宽)
2.再设置滑动的距离与屏幕大小的百分比
3.调用滑动接口执行滑动操作
获取当前窗口大小的接口---get_window_size返回窗口的宽和高
滑动接口---swipe(起始x,起始y,结束x,结束y)

press( el
=None, x=None, y=None, pressure=None): 方法说明:开始按压一个元素或坐标点(x,y),通过手指按压手机屏幕的某个位置。 pressure:ios only
使用方法:TouchAction(driver).press(x
=1052,y=940).release().perform() 或 TouchAction(driver).press(button).release().perform() 注意:
1.第二种方法中的button是获取的元素变量 2.release() 结束的行动取消屏幕上的指针。释放,相当于松手 3.Perform() 执行的操作发送到服务器的命令操作。
long_press(el=None, x=None, y=None, duration=1000):
方法说明:开始按压一个元素或坐标点(x,y)。longPress()多了一个入参,按压时间。duration以毫秒为单位。1000表示按一秒钟。 使用方法:TouchAction(driver).longPress(button, duration
=1000).perform().release() 或 TouchAction(driver).longPress(x=200 , y=200, duration=1000).perform().release() tap(element=None, x=None, y=None, count=1) 方法说明:对一个元素或控件执行点击操作。用法参考press()。count:Appium-Python-Client包里的方法没有说明,猜测是点击几下。 使用方法同press。
move_to(el
=None, x=None, y=None)方法说明:将指针(光标)从之前的位置移动到指定的元素或点。 使用方法同press。
wait(ms
=0)方法说明:暂停执行,单位为毫秒。 使用方法:TouchAction(driver).wait(1000) 2.键盘操作:模拟键盘输入 send_keys(*value) 方法说明:模拟在元素中键入内容,value:要键入的字符串,对于文件输入这里是一个文件本地路径。 使用方法:driver.find_element_by_xpath('//android.widget.EditText[@content- desc="请输入QQ号码或手机或邮箱"]').send_keys("") press_keycode(keycode, metastate=None, flags=None) 方法说明:android only,发送一个键码的操作。keycode:键码;后两个参数没搞懂啥意思。
使用方法:driver.press_keycode(
29) 常用按键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 API - 应用(APP)操作
close_app() 方法说明:停止在Desired Capabilities中指定的正在运行的应用程序。(据说是相当于home键,试过发现不是,可能是模拟器的问题,可以用真机再试试) 使用方法:driver.close_app()
launch_app() 方法说明:启动在Desired Capabilities中指定的应用程序。 使用方法:driver.launch_app()
background_app(seconds) 方法说明:将当前应用程序置于设备后台数秒。 使用方法:driver.background_app(
3)
install_app(self, app_path, **options) 方法说明:安装应用到设备中去。需要apk包的路径。
remove_app(self, app_id,
**options) 方法说明:从设备中删除应用。需要传入应用包的名字。 is_app_installed(self, bundle_id)
方法说明:检查应用是否已经安装。需要传入应用包的名字。
app和html切换:
基于UiAutomator+Chromedriver
native部分走uiautomator,webview部分走chromedriver,二者结合
要求:
Android4.4+
webview必须为debug版本
获取webview页面的三种方式:
chrome://inspect,需要FQ
使用driver.page_source获取html页面
找开发人员要源文件
uc-devtools不需要FQ
常见问题:
contexts只能获取native_app,无法获取webview?
使用uiautomator定位元素,显示class值为:android.webkit.WebView.但是driver.contexts只打印出了'NATIVE_APP'
解决方法:
1.app打包的时候需要开户webview的debug属性setWebContentDebuggingEnabled(true),这个直接让开发加上就好
2.模拟器的contexts中有webview,但有些手机没有?
官方给出的答案是:需要将手机root,然后再去获取
3.开启webview可见?
https://develpoers.google.com/web/tools/chrome-devtools/remote-debugging/webviews

上下文切换:
可用的上下文:列出所有可用的上下文-->driver.contexts
driver.window_handles
当前上下文:列出当前的上下文-->driver.current_context
切换至默认的上下文(一般就是原生上下文NATIVE_APP):driver.switch.contexts(None)
当前Activity:获取当前的Activity。仅支持Android-->driver.current_activity
当前包名:获取当前包名。仅支持Android-->driver.current_package
原文地址:https://www.cnblogs.com/wangyadong/p/12966671.html