6.1 python+appium元素定位方式(登录app)
1.0.0 :常见的十种元素定位方式
1.driver.find_element_by_id() #id定位
2.driver.find_element_by_name() #name定位(已经凉了,不支持)
3.driver.find_element_by_xpath() #xpath定位
4.find_element_by_class_name #class_name定位
5.driver.find_element_by_css_selector() #css定位
6.driver.find_element_by_link_text() #link定位
7.driver.find_element_by_tag_name() #tag定位
8.driver.find_element_by_partial_link_text() #partial定位
9.driver.find_element_by_accessibility_id() #accessibility_id定位
10.driver.find_element_by_android_uiautomator() #原生定位
其中1、2、3、4、9、10这五种是用的最多的!本章介绍1.2.3.4,下章介绍9.10
下面来实例操作一边各种方式的定位技巧,启动app的脚本仍然是之前的脚本,我们接着操作(目前的内容没有使用unittest行为框架,后续会逐步加入框架,万丈高楼平地起,基础很重要!)
准备工作:
a. 之前的环境仍然是ok的
b. 手机链接电脑,adb devices,保证设备正常链接
c. 打开 uiautomatorviewer
d. 手机以及安装好了我们需要测试的app
e. 建议先注册一个账号,我们这里使用手机号码+密码登陆
(如果想使用手机号码+手机验证码完成登陆,后续会讲到)
1. id定位:driver.find_element_by_id()
脚本写了之后报错:An element could not be located on the page using the given search parameters ,通过给定参数没有找到元素—大概这个意思------这里是新同学最容易犯的一个错误,就是页面跳转是需要时间的,但是代码执行是很快的,这里没有找到元素是因为,在获取【收入手机号码】id时,手机页面还没有进入到登陆页面,所以在页面上找不到元素
所以记下笔记:几乎在所有页面跳转的时候,我们都需要判断页面是否正常跳转,否则会报错
所以在启动app的时候加一个隐性等待:driver.implicitly_wait(10)
这个东西是什么意思呢: 比如老王和小张吃完饭约好去按摩,小张说要去尿个尿,老王对小张说,就等你十秒,如果这十秒你还没有来,我就先去了,以后咱两绝交,如果这十秒内你来了,咱两就一起去,还是好朋友
放在这个页面上说,就是 如果app启动后,等待十秒,如果十秒后下一个页面没有加载出来,那就报错, 如果十秒内加载出来了就仍然可以正常执行!
但是呢这种隐性等待仍然有弊端,比如一个页面存在多个接口请求,部分元素使用的请求不一样,导致页面只加载一半,还是可能报错--(这里纯属个人理解,看看就好)一般我不太爱用这个,我个人比较喜欢显性等待!
那么我脚本叫上隐性等待,结果执行发现还是报错,
原因:app启动之后会出现一个中间加载页,他还是找不到元素!…所以报错! 如果我们在这里加上一个 强制等待:time.sleep(3) 等待三秒试一下或者用WebDriverWait获取登录界面元素进行显示等待!
结果发现通过id定位手机已经输入了 手机号码和密码!
2.name定位:driver.find_element_by_name() ——不支持
3.xpath 定位:driver.find_element_by_xpath()
a.绝对路径定位点击登录
driver.find_element_by_xpath('//android.widget.RelativeLayout/android.widget.RelativeLayout[2]/android.widget.Button').click()
#‘注意看上图三种颜色标示,记住xpath 索引是从1 开始!为什么第二个要取[2]android.widget.RelativeLayout[2],因为图中有两个android.widget.RelativeLayout ,
我们需要取第二个,所以就这样!
b.相对路径,这种的定位方式就比较多了!
#Xpath-text:实际上就是class+text的组合
#完整的text定位元素 ‘登录‘
driver.find_element_by_xpath('//android.widget.Button[@text="登录"]').click()
#或者:
driver.find_element_by_xpath('//*[@text="登录"]').click()
#备注:整个页面 登录这个text是唯一 ,如果存在 【账号登录】 登录这个词汇仍然是唯一的!【*】在这里代表所有的class
#关键词定位‘登‘或者’录‘
driver.find_element_by_xpath('//android.widget.Button[contains(@text,"登")]').click()
#或者
driver.find_element_by_xpath('//*[contains(@text,"录")]').click()
#发现点击的不是我们想要的,所以关键字和全局搜索定位 不能不推荐同时使用,因为整个页面中是存在很多个【录】这个字的,所以全局加关键字可能定位不到
#xpath-id:
driver.find_element_by_xpath('//android.widget.Button[@resource-id="com.yce.deerstewardphone:id/btn_submit"]').click()
#备注:同样的道理,这样定位元素需要保证class(android.widget.Button)中,这个id是唯一的,不然他会取第一个id点击!
#同理另一种写法全局定位:
driver.find_element_by_xpath('//*[@resource-id="com.yce.deerstewardphone:id/btn_submit"]').click()
#xpath-index:
driver.find_element_by_xpath('//android.widget.Button[@index="2"]').click()
#或者
driver.find_element_by_xpath('//*[@class="android.widget.Button" and @index="2"]').click()
##等等xpath定位方式,花里胡哨很多种,写多了自己就可以随手就来,到最后你会发现下面讲的这些你可能整个项目下来用的定位方式就那么几个!
#class_name定位:find_element_by_class_name class唯一直接用就可以了,简单
driver.find_element_by_class_name('android.widget.Button').click()