首页 > 技术文章 > Appium常用定位方法讲解

djl-0628 2021-05-07 17:18 原文

Appium常用定位方法讲解

对象定位是自动化测试中很关键的一步,也可以说是 最关键的一步,毕竟你对象都没定位那么你想操作也不行,下面我们来看常用的一些定位方式。

ID定位(取resource-id的值)

​ 无论是在web自动化还是app自动化中id都是唯一的,可能有的小伙伴看到这里会有疑问,因为有的资料说是通过name定位是唯一的,为什么你这里是id呢,其实这个在之前是不冲突的,但是如果你用的是appium较新版本是不行的,在新版本中name定位被去掉了,所以在以后的定位中不会有name定位了,通常情况下我们也更喜欢用id进行定位。这里可能刚学的小伙伴会有疑问。

​ 有的时候你的应用为什么没有id,或者说在这个手机上有但是另外的手机上没有

1.开发没有添加。2.android版本是4.4以下的

如果我们需要对'7'这个数字进行点击操作

driver.find_element_by_id("com.android.calculator2:id/digit7").click()

通过name定位元素(一般text属性认为是name)

driver.find_element_by_name("5").click()

className定位

​ 在实际工作中classname定位用的相对而言会比较少。当你经常去看class时你会发现很多的classname是一样的,你没有办法对其进行唯一定位,下面我们看下面两张图片

我们可以仔细看一下这两张图片中手机号,密码两个输入框中的classname都是一样的,如果在这种情况下你使用

driver.find_element_by_class_name("android.widget.EditText").send_keys("111111")

这种方式去定位,你会发现你永远定位不了密码栏,这是为什么呢?因为在设计的时候如果你查找的元素在页面有多个,系统会自动给你选择第一个,所以你永远操作不了后面

text定位(需要使用uiautomator)

driver.find_elements_by_android_uiautomator("new UiSelector().text('7')")

使用这里需要注意以下,如果通过text定位的结果是个list,不能直接click。所以如果要点击需要取数组的值,比如下面是点击找到的第一个元素

driver.find_elements_by_android_uiautomator("new UiSelector().text('7')")[0].click()

xpath定位

​ xpath定位在web自动化中是最常见的,而且也是最有效的,使用xpath定位避免了找不到元素导致报错的问题,但是在app中使用xpath定位是一件很low的事情。只要遇见使用xpath定位元素它的反应就会比较慢,自动化的目的是为了提高效率,但是使用xpath后会降低效率,所以这里很low.

在上面两张图片中我们能够清除的看见他们的id,classname都是一样的,这样的情况下不用层级定位方式我们只能够采用xpath来进行定位,首先根据前面web的学习大家可以思考一下该怎么定位。

driver.find_element_by_xpath("//android.widget.TextView[@text='JavaScript']").click()

在xpath里面我们的语法是这样“//android.widget.TextView[@text='JavaScript']”,这个和我们之前web的xpath一样,意思是查找所有节点中节点为android.widget.TextView (这里使用的是className,也可以使用id,系统会依次去找)并且他的text属性值为JavaScript,这样是否更容易理解呢?下来多练习。这样的定位方式不推荐,效率很慢。

css_selector定位(webview)--加载网页--css

只适用于webview的html页面,继承自webdriver,与pc版本的UI测试一致

driver.find_element_by_css_selector()

只适用于webview容器中的html页面,继承自webdriver,与pc版本的UI测试一致

driver.find_element_by_link_text()

源代码

coding:utf-8
from appium import webdriver
#desired_caps是一个字典
desired_caps = {}
#你要测试的手机操作系统
desired_caps['platformName'] = 'Android'
#手机操作系统的版本
desired_caps['platformVersion'] = '7.0'
#使用的手机类型或模拟器类型
desired_caps['deviceName'] = 'XPUDU17113015063'
 #deviceName你的模拟器名字,就是在下载AVD的时候,你填写的,忘了的回头去找,或者在模拟器顶部会显示
 #所运行的app包名
desired_caps['appPackage'] = 'com.example.login'
#app运行的事件
desired_caps['appActivity'] = '.MainActivity'
#启动打开app
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
#根据元素定位,执行点击操作
# user= driver.find_element_by_name("请输入用户名")
# user = driver.find_element_by_id("com.example.login:id/et_username")
driver.find_element_by_class_name("android.widget.EditText").send_keys("jilidaxue")
# driver.find_element_by_id("com.example.login:id/et_password").send_keys("66889558")
# user.send_keys("liangyibo")
driver.find_element_by_xpath("//android.widget.EditText[@text='请输入密码']").send_keys("233254545")

# pwd = driver.find_element_by_name("请输入密码")
# pwd.send_keys("123456")
# # driver.find_element_by_xpath("//android.widget.FrameLayout[1]//android.widget.LinearLayout[3]").click()
driver.find_element_by_xpath("//android.widget.Button[@text='登录']").click()
driver.quit()

推荐阅读