写这一篇确实有点累,因为定位是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搞不就行了?无非是网址不同,浏览器窗口大小不同而已···
菜齐了!