Appium元素定位

元素定位

第一种:android ADT自带的工具:uiautomatorviewer.bat
在这里插入图片描述
在这里插入图片描述
注意点:对安卓9、安卓9的支持不太友好

第二种:appium自带的检查器
在这里插入图片描述
在这里插入图片描述
第三种:Python版UIAutomator2中的weditor
安装:pip install uiautomator2
安装定位工具:pip install weditor
初始化:python -m uiautomator2 init
注意点:安装失败时,加上-i换国际源
-i https://pypi.tuna.tsinghua.edu.cn/simple
启动:cmd中输入webditor
在这里插入图片描述
在这里插入图片描述

app常用交互方法:

1、点击:ele.click()
2、输入:send_keys()
3、清空输入框:ele.clear()
4、获取文本:ele.text
5、获取属性值:get_attribute()

常用的元素定位方法:

1. 通过id定位
在这里插入图片描述

# 元素定位
agree_continue_id = "com.baidu.searchbox:id/positive_button"
 
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.ID, agree_continue_id)))
driver.find_element_by_id(agree_continue_id).click()

2. 通过className定位
在这里插入图片描述

# 元素定位,注意我这里的写法,用的是find_elements_by_class_name,另外还要加索引
agree_continue_class = "android.widget.Button"
 
WebDriverWait(driver, 10, 1).until(EC.visibility_of_all_elements_located((MobileBy.CLASS_NAME, agree_continue_class)))
driver.find_elements_by_class_name(agree_continue_class)[1].click()

3. 通过AccessibilityId定位
在这里插入图片描述

# 元素定位
from appium.webdriver.common.mobileby import MobileBy
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

tiku_AccessibilityId = "题库"
WebDriverWait(driver,10,1).until(EC.visibility_of_all_elements_located((MobileBy.ACCESSIBILITY_ID, tiku_AccessibilityId)))
driver.find_element_by_accessibility_id(tiku_AccessibilityId).click()

4. 通过xpath定位
4.1 常规定位
比如我要用text属性的文本值定位,这时候只需要写成xpath表达式
在这里插入图片描述

# 元素定位
agree_continue_xpath = "//*[@text='同意并继续']"
 
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.XPATH, agree_continue_xpath)))
driver.find_element_by_xpath(agree_continue_xpath).click()

4.2 contains模糊定位
这种经常用于获取toast的时候,toast文本内容较长,可以采用contains包含部分文本的匹配方式。当然,可以用来模糊匹配上面的文本属性“同意并继续”
在这里插入图片描述

# 元素定位
agree_continue_xpath = "//android.widget.Button[contains(@text, '并继续')]"
 
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.XPATH, agree_continue_xpath)))
driver.find_element_by_xpath(agree_continue_xpath).click()

4.3 组合定位
比如xpath中同时包含class和text两个属性
在这里插入图片描述

# 元素定位
agree_continue_xpath = "//*[@class='android.widget.Button' and @text='同意并继续']"
 
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.XPATH, agree_continue_xpath)))
driver.find_element_by_xpath(agree_continue_xpath).click()

4.4 层级定位
使用lazy uiautomatorviewer,可以看到底下有个fullIndexXpath,这种是全路径的形式,也是层级的形式
在这里插入图片描述

# 元素定位
agree_continue_xpath = "//android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.Button[2]"
 
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.XPATH, agree_continue_xpath)))
driver.find_element_by_xpath(agree_continue_xpath).click()

5. 通过Android UIAutomator定位
android uiautomator原理是通过android 自带的android uiautomator的类库去查找元素,其实和appium的定位一样,或者说他比appium的定位方式更佳多以及更佳适用,它也支持id、className、text、模糊匹配等进行定位。

5.1 text定位
在这里插入图片描述
根据text属性为“请输入手机号”查找元素。

ele = self.driver.find_element_by_android_uiautomator('new UiSelector().text("请输入手机号")')
ele.send_keys("123")

5.2 text模糊定位
模糊定位故名思义,通过text的部分信息就能够进行定位,我们直接看代码:

ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("请输入手")')
ele.send_keys("123")

在上面的代码中我们只是将.text()的方法变成了.textContains(),在方法中传入模糊的数据就好。看到这里是否有人思考过一个问题,既然有类似的模糊寻找,那么有没有像正则表达式一样的查找呢?答案是肯定的,看我们下面的方法。

5.3 textStartsWith定位

# 以text什么开始
driver.find_element_by_android_uiautomator('new UiSelector().textStartsWith("请输入")')

5.4 textMatches 正则匹配查找
textMatches故名思义就是通过正则的来进行查找定位,他也是通过text的属性来进行正则匹配,我们直接看代码:

ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^请输入手.*")')
ele.send_keys("123")

5.5 resourceID定位
resourceId定位和appium封装好的id定位是一样的,只是这里将写法变成了uiautomator的写法而已,看下面代码

ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("cn.com.open.mooc:id/et_phone_edit")')
ele.send_keys('234')

通过上面的代码和之前的代码对比大家可能发现其实他们前面都是一样的,只是在定位的时候发生了一些变化,text变换成了resourceID即可,也就是页面对象属性的信息进行变更了,其他方法都是一样。下面其他方法我就不浪费篇幅,只给大家做一个简单的案例展示。

5.6 resourceIDMatches 定位
通过id进行正则匹配定位

ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+et_phone_edit")')
ele.send_keys('234')

5.7 className定位
通过调用android uiautomator使用className进行定位

ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
ele.send_keys('234')

5.8 classNameMatches定位
通过className正则匹配进行定位

ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")')
ele.send_keys('234')

5.9 组合定位

#组合定位
self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/tab_name").text("我的")').click()

或者

# 组合定位,一般组合用id,class,text这三个属性会比较好一点
# id+class 属性组合
id_class = 'resourceId("com.xyh.commerce:id/ll_personal").className("android.widget.LinearLayout")'
driver.find_element_by_android_uiautomator(id_class).click()

5.10 父子关系、兄弟关系定位

#父子关系定位
self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/title_container").childSelector(text("股票"))')
#兄弟关系定位
self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/title_container").fromParent(text("股票"))')

6. LazyUiAutomatorViewer
使用lazy uiautomatorviewer,可以看到底下有个uiaSelector,将其拷贝到代码
在这里插入图片描述

# 元素定位
agree_continue_android_uiautomator = "new UiSelector().className(\"android.widget.Button\").textContains(\"同意并继续\").resourceId(\"com.baidu.searchbox:id/positive_button\")"
 
WebDriverWait(driver, 10, 1).until(EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR, agree_continue_android_uiautomator)))
driver.find_element_by_android_uiautomator(agree_continue_android_uiautomator).click()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值