• 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
  • 相关阅读:
    VS2015 C#利用QrCodeNet生成QR Code
    開玩樹莓派(二):配置IP,實現無顯示器局域網內Putty連接和RDP遠程
    開玩樹莓派(一):安裝Raspbian系統
    LINQ查询返回DataTable类型[轉]與将DataTable序列化为Json格式【轉】
    LINQ to Entities不支持Convert.ToDateTime方法解決一例
    ASP.Net MVC 控制@Html.DisplayFor日期显示格式
    jQuery在$(function(){})中調用函數
    ASP.NET MVC Identity 兩個多個連接字符串問題解決一例
    C#的WinForm中Label透明一例
    再centos7上添加新网卡eth1
  • 原文地址:https://www.cnblogs.com/wangyadong/p/12966671.html
Copyright © 2020-2023  润新知