Appium常用定位方式

前言

与Web自动化测试一样,app自动化测试过程中最重要一个环节就是元素定位,只有准确定位到了元素才能进行相关元素的操作。appium继承了selenium的定位方法,并在其基础上进行了扩展,以适应移动端控件的定位。


id 定位

id定位是使用控件的resource-id进行定位的,如下图所示:


id定位

resourec-id定位方法如下:

driver.find_element_by_id("com.xueqiu.android:id/button_icon")

Class Name 定位

Class Name 定位是使用控件的class属性进行定位的,如下图所示:


class name定位

class 定位方法如下:

driver.find_element_by_class_name("android.widget.ImageView")

由于class属性的重复性很高,不一定能准确的定位到想要的控件,我们可以先定位一组控件,再进一步筛选。

# 先定位一组控件
list = driver.find_elements_by_class_name("android.widget.ImageView")
# 循环遍历所有控件
for i in list:
  print(i)

# 操作某一个控件
list[0].click() # 点击第一个控件
list[-1].click() # 点击最后一个控件

XPath 定位

xpath定位是一种路径定位方式,主要是依赖于元素绝对路径或者相关属性来定位,但是绝对路径xpath执行效率比较低(特别是元素路径比较深的时候),一般使用比较少。通常使用xpath相对路径和属性定位。
xpath定位语法

image.png

xpath方法如下:

# 绝对定位
driver.find_element_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.wid\
get.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.LinearLayout/androi\
d.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.view.ViewGroup/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.Relati\
veLayout[1]/android.widget.FrameLayout/android.widget.ImageView
")

# 相对定位
driver.find_element_by_xpath('//android.widget.EditText[@text="请输入用户名"]')
driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]')
# contains函数定位(支持模糊匹配)
driver.find_element_by_xpath(//*[contains(@resource-id, 'user_profile_icon') and contains(@class, 'Image')])
# 属性组合定位
//*[@text='基金' and contains(@resource-id, 'button')]
//*[@text='基金' and @index='1']
# list定位
(//*[@text='基金'])[1]
# 父子关系定位
//[contains(@resource-id, 'buttons_container')]//[@text='基金']

appium xpath定位与selenium xpath 定位有一点不一样的是,selenium xpath是通过元素标签一层一层往下找,而appium xpath定位是通过class属性来代替标签名。

层级定位

层级定位是先找到该元素的有对应属性的父元素节点,然后基于父元素进行元素定位。
层级定位方法如下:

# 先定位它的父级
root_element=driver.find_element_by_id('com.tal.kaoyan:id/activity_register_parentlayout')
# 然后通过父级定位它的子级
root_element.find_element_by_class_name('android.widget.ImageView').click()

Accessibility id 定位

该方法属于appium扩展的定位方法, 它的核心是找到控件的contentDescription属性。

  • 在Android中,content-desc属性对应AccessibilityId定位方式,如果这个属性不为空则推荐使用。
  • 在iOS中,label和name属性都对应AccessibilityId定位方式,如果有则推荐使用。

accessibility id定位方法如下:

driver.find_element_by_accessibility_id("天猫超市").click()

Android uiautomator 定位

该方法属于appium的扩展方法,并且只支持Android平台。支持元素全部属性定位.定位原理是通过android 自带的android uiautomator的类库去查找元素。 Appium元素定位方法其实也是基于Uiautomator来进行封装的。

Android uiautomator 定位方法如下:

# id 定位
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.tal.kaoyan:id/login_email_edittext")')

# text定位
driver.find_element_by_android_uiautomator('new UiSelector().text("请输入用户名")')

# class name定位
driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')

#组合定位id+text
id_text = 'new UiSelector().resourceId("com.baidu.yuedu:id/webbooktitle").text("小说")'
driver.find_element_by_android_uiautomator(id_text).click()

# 滚动到指定位置
self.driver.find_element_by_android_uiautomator('new UiScrollable('
                                                    'new UiSelector().scrollable(true).instance(0))'
                                                    '.scrollIntoView('
                                                    'new UiSelector().text("Views").instance(0));').click()

常用api

  • click 点击
  • send_keys 输入
  • get_attribute 获取某个属性
  • page_source 页面所有元素

你可能感兴趣的:(Appium常用定位方式)