51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2104|回复: 3
打印 上一主题 下一主题

Appium之主要的元素定位疑点难点

[复制链接]
  • TA的每日心情
    无聊
    2024-9-27 10:07
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2018-1-31 15:00:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 海鸥一飞 于 2018-1-31 15:19 编辑

           前言
      测试APP时,有时候会遇到上下左右滑动的界面、遇到native 和 webview 切换的界面、弹
           框界面、元素坐标定位等等情况。下面将分别对这几个难点做主要解析:
      一、滑动界面的元素定位
      1.查看APPIUM API源码语法,起点和终点四个坐标参数,duration是滑动屏幕持续的时间,
           时间越短速度越快。默认为None可不填,一般设置500-1000毫秒比较合适。
      swipe(self, start_x, start_y, end_x, end_y, duration=None)
      Swipe from one point to another point, for an optional duration.
      从一个点滑动到另外一个点,duration是持续时间
      :Args:  - start_x - 开始滑动的x坐标
      - start_y - 开始滑动的y坐标
      - end_x - 结束点x坐标
      - end_y - 结束点y坐标
      - duration - 持续时间,单位毫秒
      :Usage:  driver.swipe(100, 100, 100, 400)
      2.手机从左上角开始为0,横着的是x轴,竖着的是y轴


           3由于不同手机屏幕的分辨率不一样,
    所以同一个元素在不同手机上的坐标也是不一样的,滑

    动的时候坐标不能写死了。可以先获取屏幕的宽和高,再通过比例去计算
                      
    获取屏幕宽度和高度
      

      4.为了后续方便调用滑动封装函数,下面示例代码就把滑动进行封装
      >swipe函数参数说明:
      参数1:driver设备
      参数2:t是持续时间
           参数3:n滑动次数

                 滑动封装函数

      二、native与webview的切换
      现在大部分app都是混合式的native+webview,对应native上的元素通过
    uiautomatorviewer很容易定位到,webview上的元素就无法识别了。
      1.认识识webview
      >用uiautomatorviewer定位工具查看app页面,发现页面上有些区域无法定位到,如下图左
    边红色区域,只能定位到这个大框框,红色框里面的元素是无法识别的。
      >这时候可以查看元素属性,如右图它的class属性,上面写着WebView,那毫无疑问这种页
    面就是webview了。


                         webview页面

                                  
      2.、接触contexts
      context的中文翻译是上下文环境,学过selenium的同学,也可以理解为句柄(handle),
    其实是一回事,反正知道是两个不同的环境就行了。
      先获取页面是contexts环境,如下图红色区域,获取的是一个list列表:
      NATIVE_APP:这个就是native,也就是原生的
      WEBVIEW_com.xxxx :这个就是webview
      当看到打印出来有下图两个,就说明获取到webview的context了(当然也有的app有坑,
    可能明明有webview,
    却通过contexts获取不到,这种需要特殊处理



                   获取webview 的context
               

      3.换到webview
      >要想操作webview上的元素,第一步需要切换环境(跟selenium的切换iframe,切换handle
    思路是一样)
      >切换方法:switch_to.context(参数是webview的context)
      >由于第二步已经获取到contexts是一个list对象,取这个list的第二个参数就行,也就是
    contexts[1]


                      换到webview页面


            

    4.切回native
      >webview上操作完后,想回到native上操作,这时候需要先切回来,切回native有两个方
    法:
      方法1:driver.switch_to.context("NATIVE_APP") # 这个NATIVE_APP是固定的参数
      方法2:driver.switch_to.context(contexts[0]) # 从contexts里取第一个参数



                         切回native页面




















    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2024-9-27 10:07
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]测试旅长

    2#
     楼主| 发表于 2018-1-31 15:25:28 | 只看该作者
     5.示例代码



             示例代码


          三、弹框界面的定位
      appium脚本在拿到大量安卓手机执行的时候,app在很多手机上会跳出请求权限的弹框,弹
    框无法点掉,导致脚本定位元素失败。APP里的弹框一般提示有两种,一种是弹出需要点击确定
    的提示框,这种直接获取元素定位即可;另一种是toast,安卓页面上弹出的提示框,这种提示框
    出现在屏幕上大概3秒左右就会消失。用uiautomatorviewer根本定位不到。查了下iOS端定位
    APP弹框资料,可以通过在 desirede_capabilities 设置 autoAcceptAlerts = true。Android端却
    找不到好版本定位,为此,特总结Android端APP弹框定位方法,如下:
      1.切换成真机之后,用automatorviewer定位工具去定位(很多情况下真机环境比模拟环境定位要好)
      2.系统弹框是返回的event是null,可以通过AccessibilityServer获取到系统权限弹框的event
      3.可以尝试用 driver.switch_to_alert().text[0:] 语句定位  #会显示alert上的信息




                           弹框定位



          相关资料:
      1.弹窗处理
      四、元素坐标定位
      面试问题:有时候在定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?现在
    你就可以回答:定位元素所在位置的坐标即可
      1.tap 是模拟手指点击,一般页面上元素的语法有两个参数,第一个是 positions,是 list 类
    型最多五个点,duration是持续时间,单位毫秒
      tap(self, positions, duration=None):
      Taps on an particular place with up to five fingers, holding for a certain time
      模拟手指点击(最多五个手指),可设置按住时间长度(毫秒)
      :Args:
      - positions - list 类型,里面对象是元组,最多五个。如:[(100, 20),(100, 60)]
      - duration - 持续时间,单位毫秒,如:500
      :Usage:
      driver.tap([(100, 20), (100, 60), (100, 100)], 500)
      2.坐标定位方法
      >如下图定位"去看看"这个按钮的坐标,可以看到右侧bonds属性:[374,831][654,906]



           坐标定位

     >点右上角"搜索"按钮,查看bonds属性:[615,52][690,146]




                   bonds属性

        3.示例代码





    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-14 13:33 , Processed in 0.065436 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表