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

简介: 技术分享 | app自动化测试(Android)–高级定位技巧

XPath高级定位技巧

XPath 简介

XPath 的英文全称为:XML Path Language,意旨对 XML 中的元素进行路径定位的一种语言,它可适用 XML 标记语言,Html 标记语言,app Dom 结构。XPath 是自动化工具的定位基础,可适用于 Selenium 工具,Appium 工具,Appcrawler 工具。由于前面章节已经对 XPath 进行说明,本篇只做举例说明。

XPath 基本语法

下面是 XPath 的常用方法:

XPath 模糊定位技巧

contains( )方法是模糊匹配的定位方法,对于一个元素的属性不固定,就可以模糊匹配。如://[contains(@content-desc, ‘帮助’)],示例代码:

PYTHON 版本
driver.find_element(By.XPATH,
'//*[contains(@text, "注册")]')
driver.find_element(By.XPATH,
'//*[contains(@content-desc, "搜索")]')
driver.find_element(By.XPATH,
'//*[contains(@resource-id, "login_phone")]')
JAVA 版本
driver.findElement(By.xpath(
        "//*[contains(@text, \"注册\")]"));
driver.findElement(By.xpath(
        "//*[contains(@content-desc, \"搜索\")]"));
driver.findElement(By.xpath(
        "//*[contains(@resource-id, \"login_phone\")]"));

XPath 组合定位技巧

通过 XPath 可以同时匹配 2 个甚至多个属性来完成元素定位。这里常用的属性有 text、resource-id、class、index、content-desc 等,这些属性任意组合完成定位,示例代码:

PYTHON 版本
driver.find_element(
    By.XPATH,'//*[@text="我的" and @resource-id="tab_name"]'
    ).click()
driver.find_element(
    By.XPATH,'//*[@text="注册/登录" and @index="1"]'
    ).click()
JAVA 版本
driver.findElement(By.xpath( 
        "//*[@text=\"我的\" and @resource-id=\"tab_name\"]")).click();
driver.findElement(By.xpath(
        "//*[@text=\"注册/登录\" and @index=\"1\"]")).click();

XPath 层级定位

通常定位元素的时候可能会涉及到通过子元素去定位父元素,或者父元素定位子元素,或者定位兄弟元素,xpath 支持父子关系,兄弟关系元素的查找。示例代码如下:

PYTHON 版本
# 通过子元素定位父元素
# 方法一:..
driver.find_element_by_xpath(
    '//*[@text="手机号"]/..').tag_name
# 方法二  parent::*
driver.find_element_by_xpath(
    '[@text="手机号"]/parent::*').tag_name
#通过元素定位兄弟元素
driver.find_element_by_xpath(
    '//*[@text="手机号"]/../li'
    ).tag_name
JAVA 版本
// 通过子元素定位父元素
// 方法一:..
driver.findElement(By.xpath(
    "//*[@text=\"手机号\"]/..")).getTagName();
// 方法二  parent::*
driver.findElement(By.xpath(
    "[@text=\"手机号\"]/parent::*")).getTagName();
// 通过元素定位兄弟元素
driver.findElement(By.xpath(
    "//*[@text=\"手机号\"]/../li"
)).getTagName();

案例

场景一:

应用:雪球 apk

可以使用 uiautomatorviewer 工具进行 dom 分析,然后对分析到的元素进行 XPath 定位,比如下面的搜索框,可以使用元素的多种属性进行定位,常用的有 text,resource-id,class,content-desc 等属性。


推荐使用 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 父子关系来进行元素定

1080×545 215 KB

代码如下:

PYTHON 版本
curr_price = self.driver.find_element(
    MobileBy.XPATH,"//*[@text='BABA']/../../..\
    //*[@resource-id='com.xueqiu.android:id/current_price']")
JAVA 版本
MobileElement curr_price = driver.findElement(
            By.xpath("//*[@text=\"BABA\"]/../../..//\
            *[@resource-id='com.xueqiu.android:id/current_price']"));

Android UiAutomator定位技巧

UiAutomator 是 Android SDK 自带的一个测试框架,这个测试框架提供了一系列的 API,可以与 Android APP 进行交互,例如打开菜单,点击,滑动等。当 Appium 的 Caps 参数 uiautomationName 设置为 UiAutomator2 时,就能够实现与手机端的 UiAutomator 进行通信并且使用 UiAutomator 执行测试代码。如果不进行设置,默认也是使用 UiAutomator2 工作引擎。UiAutomator1 是较老的工作引擎,如果想测试较老版本的 Android 系统(低于 Android4.4 版本)需要设置 uiautomationName=“UiAutomator1”。

由于 Android UiAutomator 是 Android SDK 中自带的工作引擎,使用这种定位方式,速度上要比 Xpath 定位方式快很多。但由于写法比较特殊,调试起来要相对麻烦,如果定位语句编写不当,脚本编辑器也不会给出任何提示信息。只能在运行的时候校验对错。

下面就单独介绍基于 uiautomator 定位元素的方法,基本语法如下:

  • Python 版本
driver.find_element_by_android_uiautomator()
  • Java 版本
driver.findElement(MobileBy.AndroidUIAutomator());

常用的方法有:

UiSelector()  # 实现元素定位
UiScrollable() # 实现滚动查找元素
通过 TEXT 文本定位

UiSelector( ) 与 XPath 类似,可以通过元素的 text 属性来定位元素。语法格式如下:

new UiSelector().text("text文本")

同样也能用模糊查询的用法去定位元素

例如: new UiSelector().textContains(“手机”) 示例代码:

  • Python 版本
driver.find_element_by_android_uiautomator(
    'new UiSelector().textContains("手机")').click()
  • Java 版本
driver.findElementByAndroidUIAutomator(\
    "new UiSelector().textContains(\"手机\")").click();
通过 RESOURCEID 定位

uiautomator 同样也能进行 id 定位,格式为 new UiSelector().resourceId(“resource-id属性”),示例代码:

  • Python 版本
driver.find_element_by_android_uiautomator(
    'new UiSelector().resourceId("rl_login_phone")').click()
  • Java 版本
driver.findElementByAndroidUIAutomator("new UiSelector().\
resourceId(\"rl_login_phone\")").click();
通过 CLASSNAME 定位

页面上的 class 属性一般不唯一,此时可以根据下标进行定位,格式为 new UiSelector().className(“className”),一般会使用find_elements完成定位,示例代码:

  • Python 版本
driver.find_elements_by_android_uiautomator(
    'new UiSelector().\
    className("android.widget.TextView")')[5].click()
  • Java 版本
driver.findElementsByAndroidUIAutomator("new UiSelector().\
className(\"android.widget.TextView\")")[5].click();
通过 DESCRIPTION 定位

同样的,也支持 contenet-desc 定位方式,格式为:new UiSelector().description(“contenet-des属性”),示例代码:

  • Python 版本
driver.find_element_by_android_uiautomator(
    'new UiSelector().description("搜索")').click()
  • Java 版本
driver.findElementByAndroidUIAutomator("new \
UiSelector().description(\"搜索\")").click();
组合定位方式

Uiautomator 也支持组合元素查找功能,示例代码:

  • Python 版本
driver.find_element_by_android_uiautomator(
    'new UiSelector().resourceId(\
    "com.xueqiu.android:id/tv_login_phone").text("手机号")').click()
  • Java 版本
driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\
\"com.xueqiu.android:id/tv_login_phone\").text(\"手机号\")").click();
滚动查找元素

Uiautomator 使用 UiScrollable() 实现了滚动查找元素的功能,可以指定滑动到某个元素,示例代码:

  • Python 版本
driver.find_element_by_android_uiautomator(
    'new UiScrollable(new UiSelector().scrollable(true)\
    .instance(0)).scrollIntoView(new UiSelector()\
    .text("我的").instance(0));').click()
  • Java 版本
driver.findElementByAndroidUIAutomator(\
    "new UiScrollable(new UiSelector().scrollable(true)\
    .instance(0)).scrollIntoView(new UiSelector().\
    text(\"我的\").instance(0));").click();

上面的代码,在当前的页面滚动的查找 text 文本是“我的”这个元素,找到之后执行点击操作。

css selector元素定位

Appium Server 从 1.19.0 这个版本开始,元素定位增加了 css selector 的支持。appium-uiautomator2-driver 会将 css selector 定位器转化成 android uiautomator 定位方式。

注意:appium inspector 暂时没有添加这种定位方式。

由于 UiSelector() 的表达式是 Java 的语法格式,编写定位元素的表达式很复杂,代码编写工具(比如 Pycharm,VSCode,IntelliJ IDEA等)也不会有任何提示错误信息。只能是运行时才能发现表达式的错误。官方提供了 css selector 的语法,会自动转成 android uiautomator 的语法结构,这种原生的定位元素的方式,定位速度要更快一些。

详情参考官方:https://github.com/appium/appium-uiautomator2-driver/pull/410

源码地址:https://github.com/appium/appium-uiautomator2-driver/blob/master/lib/css-converter.js

id 定位

可以使用 css selector 语法定位。如下代码,#igk 表示 css selector 定位符

  • Python 版本
driver.find_element_by_css_selector('#igk')

对应 ID 定位器代码如下:

driver.find_element_by_id('android:id/igk')
  • Java 版本
driver.findElementByCssSelector("#igk").click();

对应 ID 定位器代码如下:

driver.findElementById("android:id/igk").click();

class name 定位

如下代码,表示 css selector 定位符为 .android.widget.ImageView 的元素

  • Python 版本
driver.find_element_by_css_selector('.android.widget.ImageView')

对应 class name 定位器代码如下:

driver.find_element_by_class_name("android.widget.ImageView")
  • Java 版本
driver.findElementByCssSelector(".android.widget.ImageView");

对应 class name 定位器代码如下:

driver.findElementByClassName("android.widget.ImageView");

text 定位

如下代码,表示 css selector 定位符为 *[text=‘工作台’]" 的元素:

  • Python 版本
driver.find_element_by_css_selector("*[text='工作台']")

对应 xpath 定位器代码如下:

driver.find_element_by_xpath("//*[@text='工作台']")
  • Java 版本
driver.findElementByCssSelector("*[text=\"工作台\"]");

对应 xpath 定位器代码如下:

driver.findElementByXPath("//*[@text=\"工作台\"]");

description 定位

如下代码,表示 css selector 定位符为 *[description=“ContentDescription”] 的元素:

  • Python 版本
driver.find_element_by_css_selector('*[description="ContentDescription"]')

对应 accessibility id 定位器代码如下:

driver.find_element_by_accessibility_id("ContentDescription")
  • Java 版本
driver.findElementByCssSelector("*[description=\"ContentDescription\"]");

对应 accessibility id 定位器代码如下:

driver.findElementByAccessibilityId("ContentDescription");

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!更多技术文章

相关文章
|
2月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
214 0
安卓项目:app注册/登录界面设计
|
1天前
|
安全 定位技术 API
婚恋交友系统匹配功能 婚恋相亲软件实现定位 语音社交app红娘系统集成高德地图SDK
在婚恋交友系统中集成高德地图,可实现用户定位、导航及基于地理位置的匹配推荐等功能。具体步骤如下: 1. **注册账号**:访问高德开放平台,注册并创建应用。 2. **获取API Key**:记录API Key以备开发使用。 3. **集成SDK**:根据开发平台下载并集成高德地图SDK。 4. **配置功能**:实现定位、导航及基于位置的匹配推荐。 5. **注意事项**:保护用户隐私,确保API Key安全,定期更新地图数据,添加错误处理机制。 6. **测试优化**:完成集成后进行全面测试,并根据反馈优化功能。 通过以上步骤,提升用户体验,提供更便捷的服务。
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
112 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
3月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
291 2
|
2月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
389 0
|
3月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。
|
XML Java 测试技术
技术分享 | app自动化测试(Android)--App 控件交互
通常获取到元素之后,可以调用 click() 方法来实现对这个元素的点击操作
|
2月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
767 1
|
4天前
|
JSON 缓存 前端开发
HarmonyOS NEXT 5.0鸿蒙开发一套影院APP(附带源码)
本项目基于HarmonyOS NEXT 5.0开发了一款影院应用程序,主要实现了电影和影院信息的展示功能。应用包括首页、电影列表、影院列表等模块。首页包含轮播图与正在热映及即将上映的电影切换显示;电影列表模块通过API获取电影数据并以网格形式展示,用户可以查看电影详情;影院列表则允许用户选择城市后查看对应影院信息,并支持城市选择弹窗。此外,项目中还集成了Axios用于网络请求,并进行了二次封装以简化接口调用流程,同时添加了请求和响应拦截器来处理通用逻辑。整体代码结构清晰,使用了组件化开发方式,便于维护和扩展。 该简介概括了提供的内容,但请注意实际开发中还需考虑UI优化、性能提升等方面的工作。
45 11
|
2天前
|
前端开发 数据库 UED
uniapp开发,前后端分离的陪玩系统优势,陪玩app功能特点,线上聊天线下陪玩,只要4800
前后端分离的陪玩系统将前端(用户界面)和后端(服务器逻辑)分开开发,前者负责页面渲染与用户交互,后者处理数据并提供接口。该架构提高开发效率、优化用户体验、增强可扩展性和稳定性,降低维护成本,提升安全性。玩家可发布陪玩需求,陪玩人员发布服务信息,支持在线聊天、预约及线下陪玩功能,满足多样化需求。[演示链接](https://www.51duoke.cn/games/?id=7)