• NO.4 appium-定位


    写这一篇确实有点累,因为定位是appium最庞大的一个API群体,真数下来应该有10多个。今天这是一桌酒席啊~

    好嘞~上菜!!!


    首先,我用来查看元素的工具是安卓SDK下面自带的一个工具,路径:sdk oolsuiautomatorviewer.bat

    打开以后长这个样子:

     

    有两个连接方式,第一个是,我叫它‘分层显示’,看截图感受一下:

    一层叠一层

     

    第二个是,我叫它‘平铺显示’,看截图感受一下:

    和楼上是同一个界面的截图

     

    1.find_element_by_id(self, id_)Finds an element by id.
     
    :Args:
     - id\_ - The id of the element to be found.
     
    :Usage:
        driver.find_element_by_id('foo')

    这个API的大概意思:用ID元素去定位

     

    贴代码之前,先看一下界面:

     

     

    我选择的是账号框,这个resource-id后面显示的一串,就是我们要用来定位的id,用法超简单。

    执行代码

    driver.find_element_by_id('XX:id/login_username').click()
    driver.find_element_by_id('XX:id/login_username').set_text('123')

    结果:

    账号框输入了‘123’

     

    2.find_element_by_name(self, name)

    Finds an element by name. 

    :Args:
     - name: The name of the element to find.
     
    :Usage:
        driver.find_element_by_name('foo')

    这个API的大概意思:用name元素去定位


    这次看看登录按钮:

    注意一点,text后面的‘登录’,可以用来当作name使用,然而并不确定text就是name,后面举例子。在id不可用的时候,text也是可以拿来顶一顶的。

    执行代码

    driver.find_element_by_name('登录').click()

    结果:

    因为点击了登录,所以提示‘请输入密码’

     

     

    用text来当name使用,有一个小坑:如果是一些无法改变的按钮那么你可以用text当name用,但如果是下面这样就要格外注意。

    注意看,刚刚账号框的text=‘用户名’,而现在text=‘tt’,所以账号框最好别用text当name用。

     

     

     

    3.find_element_by_class_name(self, name)

    Finds an element by class name.
    :Args:
     - name: The class name of the element to find.
    :Usage:
        driver.find_element_by_class_name('foo')

    这个API的大概意思:用class元素去定位


    其实我个人觉得这个class在android里面用来定位,有那么点尴尬~原因很简单,看图:

     

     

     

    注意看class,账号框和密码框是一样的,在app中class一样,这种请况多的数不过来。

     用法跟前几个一样,不过多举例了~

     

    4.find_element_by_xpath(self, xpath)

    Finds an element by xpath.
    :Args:
     - xpath - The xpath locator of the element to find.
    :Usage:
        driver.find_element_by_xpath('//div/td[1]')

    这个API的大概意思:用XPATH(路径)方式去定位

    什么时候用xpath呢?就是在没有可用元素的时候:

     

    被选中的”伸展运动10分钟“,没有id,没有name,这个时候就要上xpath了。

     

    首选不要慌,记住xpath的诀窍,‘自己没有找长辈,长辈没有看晚辈’:

    通过观察可以发现,虽然”伸展运动10分钟“没有任何可用的属性,但是它的长辈有‘ID’可用,这就足够我们来写xpath了。

     

    执行代码:

    driver.find_element_by_xpath('//android.view.View[@resource-id="xx:id/tagView1"]/android.view.View[3]').click()

    结果:

    这个xpath大概意思是”定位‘android.view.View’‘resource-id="xx:id/tagView1’的第三个‘android.view.View’控件

    需要注意的几个点:

      1.xpath写id的时候一定要用”resource-id=XXX“,不能简写”id=xxx“

      2.视图上层级显示的”View“其实是简写,一定要用class元素显示的”android.view.View“

      3.实在看不懂这个xpath,建议去http://www.w3school.com.cn,看一下xpath的语法和轴

    5.find_element_by_accessibility_id(self, id)

    Finds an element by accessibility id. 

    :Args:
     - id - a string corresponding to a recursive element search using the
     Id/Name that the native Accessibility options utilize
    :Usage:
        driver.find_element_by_accessibility_id()

    这个API的大概意思:用accessibility_id元素去定位(我也不知道这个是啥)

    android总会有那么一些比较特殊的元素,需要这么一些比较特殊的方法去定位:

     

     

    注意看,没有id和text,但是有个‘content-desc’,不过这个界面点了也没啥用,所以我们试试看啥反应。

    执行代码:

    driver.find_element_by_accessibility_id('步态训练').click()

    结果:跟预期一样,啥都没有。但是没报错,就证明定位方式是对的。

     

    为了进一步实验,我们加用get_attribute()配合一下,get_attridute()可以获取元素的值

    执行代码:

     

    a = driver.find_element_by_accessibility_id('步态训练').get_attribute('checkable')
    print(a)

    结果:flase

    跟界面显示的结果一致,前面说过text并不是真正的name,我为啥这么说呢?我们获取一下‘name’试试。

     

     

    a = driver.find_element_by_accessibility_id('步态训练').get_attribute('name')
    print(a)

     

    结果:步态训练

    ·······这就是让我懵逼的地方,’沃特?‘,’name‘返回的是’content-desc‘,那我就把它当name在试试效果。

    a = driver.find_element_by_name('步态训练').get_attribute('name')
    print(a)

    结果:步态训练

    我就尴尬癌晚期了·····这是什么鬼?如果’name‘就可以定位’content-desc‘,那么要这个’accessibility_id‘何用?何用?何用?

    最好的解释是,我还没发现它的真正价值........

     

     6.find_element_by_android_uiautomator(self, uia_string)

    Finds element by uiautomator in Android.
    :Args:
     - uia_string - The element name in the Android UIAutomator library
    :Usage:
        driver.find_element_by_android_uiautomator('.elements()[1].cells()[2]')

    这个API的大概意思:没整明白···以后再填吧。


    从selenium继承过来的还有css、tag_name等等,可以用在web页面上,我还没用到过先放放吧。如果真要测web,直接pc搞不就行了?无非是网址不同,浏览器窗口大小不同而已···

     

    菜齐了!

     

     

     

  • 相关阅读:
    db4o 7.4 for .net3.5试用手记
    ruby学习笔记(2)类的基本使用
    温故而知新:设计模式之适配器模式(Adapter)
    Silverlight:Dependency Property(依赖属性)学习笔记
    Silverlight中的帧
    关闭与恢复visual studio实时调试器
    温故而知新:设计模式之桥接模式(Bridge)
    温故而知新:设计模式之单件模式(Singleton)
    一段oracle中的“复杂”分组统计sql
    VisualTreeHelper
  • 原文地址:https://www.cnblogs.com/dianxiao2/p/5553584.html
Copyright © 2020-2023  润新知