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

技术分享 | 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父子关系来进行元素定
技术分享 | app自动化测试(Android)--高级定位技巧
文章图片
代码如下:
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版本