技术分享 | app自动化测试(Android)--高级定位技巧( 二 )

文章图片
推荐使用resource-id进行定位 , 通常情况下 , 它是页面唯一的属性 , 其XPath如下:
PYTHON版本
driver.find_element(
By.XPATh,'//*[contains(@resource-id,"tv_search")]')
#或者也可写成下面这样
driver.find_element(By.ID,'tv_search')
JAVA版本
driver.findElement(By.xpath("//*[contains(@resource-id,
"tv_search")]"));
//或者也可写成下面这样
driver.findElement(By.id("tv_search"));
场景二:
如下图 , 获取“BABA”所对应的股票价格“187.11” , 可以使用XPath父子关系来进行元素定

文章图片
代码如下:
PYTHON版本
curr_price=self.driver.find_element(
MobileBy.XPATH,"//*[@text='BABA']/../../..
//*[@resource-id='com.xueqiu.android:id/current_price']")
JAVA版本
MobileElementcurr_price=driver.findElement(
By.xpath("//*[@text="BABA"]/../../..//
*[@resource-id='com.xueqiu.android:id/current_price']"));
AndroidUiAutomator定位技巧
UiAutomator是AndroidSDK自带的一个测试框架 , 这个测试框架提供了一系列的API , 可以与AndroidAPP进行交互 , 例如打开菜单 , 点击 , 滑动等 。 当Appium的Caps参数uiautomationName设置为UiAutomator2时 , 就能够实现与手机端的UiAutomator进行通信并且使用UiAutomator执行测试代码 。 如果不进行设置 , 默认也是使用UiAutomator2工作引擎 。 UiAutomator1是较老的工作引擎 , 如果想测试较老版本的Android系统(低于Android4.4版本)需要设置uiautomationName="UiAutomator1" 。
由于AndroidUiAutomator是AndroidSDK中自带的工作引擎 , 使用这种定位方式 , 速度上要比Xpath定位方式快很多 。 但由于写法比较特殊 , 调试起来要相对麻烦 , 如果定位语句编写不当 , 脚本编辑器也不会给出任何提示信息 。 只能在运行的时候校验对错 。
下面就单独介绍基于uiautomator定位元素的方法 , 基本语法如下:Python版本
driver.find_element_by_android_uiautomator()Java版本
driver.findElement(MobileBy.AndroidUIAutomator());
常用的方法有:
UiSelector()#实现元素定位
UiScrollable()#实现滚动查找元素
通过TEXT文本定位
UiSelector()与XPath类似 , 可以通过元素的text属性来定位元素 。 语法格式如下:
newUiSelector().text("text文本")
同样也能用模糊查询的用法去定位元素
例如:newUiSelector().textContains("手机")示例代码:Python版本
driver.find_element_by_android_uiautomator(
'newUiSelector().textContains("手机")').click()Java版本
driver.findElementByAndroidUIAutomator(
"newUiSelector().textContains("手机")").click();
通过RESOURCEID定位
uiautomator同样也能进行id定位 , 格式为newUiSelector().resourceId("resource-id属性") , 示例代码:Python版本
driver.find_element_by_android_uiautomator(
'newUiSelector().resourceId("rl_login_phone")').click()Java版本
driver.findElementByAndroidUIAutomator("newUiSelector().
resourceId("rl_login_phone")").click();
通过CLASSNAME定位
页面上的class属性一般不唯一 , 此时可以根据下标进行定位 , 格式为newUiSelector().className("className") , 一般会使用find_elements完成定位 , 示例代码:Python版本
driver.find_elements_by_android_uiautomator(
'newUiSelector().
className("android.widget.TextView")')[5].click()Java版本
driver.findElementsByAndroidUIAutomator("newUiSelector().
className("android.widget.TextView")")[5].click();
通过DESCRIPTION定位
同样的 , 也支持contenet-desc定位方式 , 格式为:newUiSelector().description("contenet-des属性") , 示例代码:Python版本
- 微信更新正式版!“清理缓存”功能变强,小程序终于能分享到朋友圈
- 为什么现在很少有人提及“克隆技术”了?“克隆技术”有何缺点?
- A股:光伏电池片技术的“杀手锏”,HJT电池真正龙头仅有这5只!
- Apple Watch|稳了,iPhone 息屏显示功能来了
- 电信|印度电信和IT部长:印度本土研发的5G技术有潜力赢得全球市场
- 罗斯威尔坠毁了3架UFO?逆向工程研究早已开始,外星技术已被掌握
- NVIDIA的DLSS技术已经深受玩家和开发者认可|性能2倍于DLSS!AMD游戏神技FSR 2.0正式支持Xb
- Apple Watch|爆料指Apple Watch Series 8晶片沿用6代!将推极限运动版
- 闲鱼|闲鱼app或暗藏“灰色”交易?内行人道出实情,你经历过吗?
- 电子商务|3D打印机有多强大?科学家曾利用3D打印技术打印出火箭喷射器
