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搞不就行了?无非是网址不同,浏览器窗口大小不同而已···

 

菜齐了!

 

 

 

原文地址:https://www.cnblogs.com/dianxiao2/p/5553584.html