二,appium移动端自动化常用的元素定位方法
appium继承了selenium框架中webdriver提供的元素定位方法,接下介绍几种常用的方法。
1,find_element_by_id()
如果某个元素的resource-id对应的值在app当前页面是唯一,那么就可以优先通过id定位该元素。以上图中点击【发布】按钮为例,写法如下
driver.find_element_by_id("com.ss.android.article.news:id/cde").click()
2,find_element_by_class_name()
元素的class属性值唯一,可以通过class name定位。如下图中所指的元素,其class属性值在当前页面唯一
写法如下
find_element_by_class_name("android.widget.HorizontalScrollView")
3,find_element_by_xpath()
这大概是元素定位过程中用的最多的方法,使用比较灵活。以下是xpath的具体实现方式。
3.1,使用text文本构造xpath
如果当前页面某元素的text属性值唯一,就可以使用text文本构造xpath,如【发布】按钮
# "//*[@text='发布']"该字符串表示:当前页面下所有元素里面text='发布'的元素 drvier.find_element_by_xpath("//*[@text='发布']").click()
3.2,使用class与其他属性结合构成xpath
class唯一的话可以使用find_element_by_class_name()定位,但大部分情况向class都不是唯一的,此时可以用class与其他属性结合构成xpath,如:
# class与text driver.find_element_by_xpath("//android.widget.TextView[@text='消息通知']").click() # class、text、resource-id结合,注意text与id之间使用and driver.find_element_by_xpath("//android.widget.TextView[@text='消息通知' and @resource-id='com.ss.android.article.news:id/c_3']").click()
3.3,通过父元素定位子元素
在实际项目中,我们可能通过UI的层级结果进行定位。如下图,我们要定位【收藏】按钮,除了使用2方外,还可以它的上一级元素定位。
# 父元素下面有4个class相同的子元素,子元素后面不加索引,则默认定位的是第一个子元素 driver.find_element_by_xpath("//androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout")
子元素有多个,通过class的索引定位
# 后面的2表示索引,注意uiautomatorviewer里显示的是从0开始的,而xpath里面是从1开始 driver.find_element_by_xpath("//androidx.recyclerview.widget.RecyclerView/android.widget.RelativeLayout[2]")
3.4,通过元素子元素定位父元素
即通过下一级元素定位上一级元素。
# 后面的/..表示当前级的上一级,此处即整个下载管理按钮区域 driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/..")
同样定位元素的上一级的上一级(孙子定位爷爷),如下
driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/../..")
3.5,定位兄弟元素
通过同级元素定位,下面以定位【下载管理】上的图标为例
# 兄->父->兄 driver.find_element_by_xpath("//android.widget.TextView[@text='下载管理']/../android.widget.ImageView")
三,总结。
- 具体使用什么样的方式定位,与app开发框架有关,一般使用id与xpath使用的比较多。需要注意的是,能使用的id定位元素的话就不要使用xpath定位,因为id定位元素方便维护的同时,效率也相对xpath更高。
- xpath语法的基础知识需要有所了解,这样有助于能更好的理解元素定位。
- 当然appium还有其他的定位元素方法,这里不做过多的介绍,有兴趣的话可以去百度其他方法。实际使用过程中,常用的就是以上几种方法。