移动端自动化测试工具 Appium 之元素操作小技巧

文章目录

  • 一、背景
  • 二、TestNG常用注解
  • 三、实战
    • 3.1、集成启动类
    • 3.2、采用xpath定位元素
    • 3.3、编写通用判断类
    • 3.4、编写测试类
    • 3.5、遍历实现
  • 四、总结

一、背景

appium自动化工作中,元素操作最常用的就是Id/xpath,因为【appium1.5.0后,不支持使用name定位】所有大家在工作中使用id/xpath定位;如果还是想用name定位,需要修改源码,具体大家自己去查,但在工作中id/xpath已经够用。

今天介绍目前我作最常用的一些方法,希望能帮到大家,少走弯路。

二、TestNG常用注解

为什么要学习testng注解,因为在写测试类的时候需要,通过小小注解让他帮我们干活,所有需要先了解下:

TestNG简单介绍几种注解:

注解描述
@BeforeSuite在该套件的所有测试都运行在注释的方法之前,仅运行一次
@AfterSuite在该套件的所有测试都运行在注释方法之后,仅运行一次
@BeforeClass在调用当前类的第一个测试方法之前运行,注释方法仅运行一次
@AfterClass在调用当前类的第一个测试方法之后运行,注释方法仅运行一次
@BeforeTest注释的方法将在属于test标签内的类的所有测试方法运行之前运行
@AfterTest注释的方法将在属于test标签内的类的所有测试方法运行之后运行
@BeforeGroups配置方法将在之前运行组列表。此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行
@AfterGroups此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行
@BeforeMethod注释方法将在每个测试方法之前运行
@AfterMethod注释方法将在每个测试方法之后运行
@DataProvider标记一种方法来提供测试方法的数据。注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称
@Factory将一个方法标记为工厂,返回TestNG将被用作测试类的对象。该方法必须返回Object []
@Listeners定义测试类上的侦听器
@Parameters描述如何将参数传递给@Test方法
@Test将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法

注意:
在使用 @test 注解用例的时候,最好使用T001做方法名称,这样test在跑的时候会根据0–1这样的开始执行。
在这里插入图片描述
如果想改变执行规则可以增加 priority 注解:

@Test(description = "初始化登录启动", testName = "进入首页", priority = 0)

说明:

  • description:表示注释t
  • estName:标志测试类
  • priority:表示执行顺序

三、实战

3.1、集成启动类

下载京东APP

启动app就能看到,每次启动都会提示这个,那么在写代码的时候咱们把这个方法:
在这里插入图片描述
类似这样的在写测试用例的时候可以这样写,之后其他类集成这个即可:
在这里插入图片描述

3.2、采用xpath定位元素

如图:
在这里插入图片描述
类似中间这些应该怎么定位才最好,我们观察下面定位,可以采用xpath定位。
在这里插入图片描述

代码示例:

/**
* 点击购物车
*/
public void clickbaibao(AndroidDriver < AndroidElement > driver)
{WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "百宝箱");String[] name = {"京东超市", "数码电器", "京东服饰", "京东生鲜"};for(int i = 0; i < name.length; i++){element = driver.findElement(By.xpath("//android.widget.TextView[@text='京东超市']".replace("京东超市", name[i])));element.click();}
}

点击进入京东超市后再判断是否登录成可以:
在这里插入图片描述
上可以采用id定位
在这里插入图片描述

3.3、编写通用判断类

编写通用判断类

 /*** 统一判断是否通过** @param driver 传driver* @param elemn  定元素* @param des    描述*/public void assertTrue(AndroidDriver < AndroidElement > driver, String elemn, String des){WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp(elemn), des);element = driver.findElement(getByLocator.getLocatorApp(elemn));String text = element.getText();if(text != null){Assert.assertTrue(true, des + "验证成功");}else{//如果失败系统会自动截图Assert.fail("跳转失败");}}

完整代码
元素:

#点击首页
clickCart=xpath>>//android.view.View[@content-desc='首页']#跳转成功
assertTitile=id>>com.jingdong.app.mall:id/fd#退回
home_back=id>>com.jingdong.app.mall:id/fe#百宝箱名字
Jingdong_supermarket=xpath>>//android.widget.TextView[@text='京东超市']

代码示例

private GetByLocator getByLocator;
private WebElement element = null;/*** 构造函数*/public CartProvider() {this.getByLocator = new GetByLocator("loginElement.properties");}/*** 点击首页*/
public void clickCart(AndroidDriver < AndroidElement > driver) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "点击首页");element = driver.findElement(getByLocator.getLocatorApp("clickCart"));element.click();}/*** 点击百宝箱* @param driver*/public void clickbaibao(AndroidDriver < AndroidElement > driver) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "百宝箱");String[] name = {"京东超市", "数码电器", "京东服饰", "京东生鲜"};for(int i = 0; i < name.length; i++) {element = driver.findElement(getByLocator.getLocatorApp("Jingdong_supermarket".replace("京东超市", name[i])));element.click();//断言assertTrue(driver, "assertTitile", name[i] + "跳转成功");//退回WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("home_back"), "退回");driver.findElement(getByLocator.getLocatorApp("home_back"));}}/*** 统一判断是否通过** @param driver 传driver* @param elemn  定元素* @param des    描述*/public void assertTrue(AndroidDriver < AndroidElement > driver, String elemn, String des) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp(elemn), des);element = driver.findElement(getByLocator.getLocatorApp(elemn));Stringtext = element.getText();if(text != null) {Assert.assertTrue(true, des + "验证成功");} else {//如果失败系统会自动截图Assert.fail("跳转失败");}
}

3.4、编写测试类

测试类:

import appout.appcase.data.CartProvider;
import org.testng.annotations.Test;/*** @author liwen* @Title: CartTest* @Description: 测试类* @date 2019/11/23 / 19:57*/public class CartTest extends BestRuner {CartProvider cartProvider = new CartProvider();@Test(description = "点击首页百宝箱", testName = "点击百宝箱", priority = 1)publicvoidT002() {cartProvider.clickHome(driver);cartProvider.clickbaibao(driver);}
}

xpath语法:
https://www.w3school.com.cn/xpath/xpath_syntax.asp

3.5、遍历实现

观察如图:如果想遍历推荐分类每个商品应该怎么写?是每个写一个还是执行一个list之后挨个遍历?还是这么写?

在这里插入图片描述

观察定位方式:
在这里插入图片描述

在工作中我是这样写的

#分类
categorylist=id>>com.jd.lib.category:id/a1z

代码示例:

 /*** 分类写法* @param driver*/public void categorylist(AndroidDriver < AndroidElement > driver) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("categorylist"), "遍历分类");//获取全部数据挨个遍历List < AndroidElement > categorylist = driver.findElements(getByLocator.getLocatorApp("categorylist"));for(int i = 0; i < categorylist.size(); i++) {String text = categorylist.get(i).getText();//输出遍历nameLogUtil.info(text);categorylist.get(i).click();}}

属性判断写法

查看如下图:想知道该商品是否关注,应该这么写?
在这里插入图片描述
在这里插入图片描述
通过观察,代码写法:
1、获取该元素的地位

在这里插入图片描述
元素为:

#收藏
productdetail=id>>com.jd.lib.productdetail:id/afr

简单代码:

/*** 收藏** @param driver*/public void productdetail(AndroidDriver < AndroidElement > driver) {WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("productdetail"), "收藏");AndroidElement detail = driver.findElement(getByLocator.getLocatorApp("productdetail"));String attribute = detail.getAttribute("selected");if(attribute.equals(true)) {LogUtil.info("目前商品收藏,目前的属性为:" + attribute);} else {LogUtil.info("商品没有收藏,目前的属性为:" + attribute);}
}

通过得取属性就知道下一步怎么操作。

四、总结

上面简单介绍几个测试用例写法,随着大家不断熟悉移动端UI自动化,技能会逐渐增加,希望给大家带去一点帮助,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/8258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决在Outlook中预定Teams会议不显示入会链接的问题

今天遇到一个很蛋疼的teams问题&#xff0c;花了点时间才解决。本来以为是很简单的问题&#xff0c;随便网上冲浪一下就能找到答案的&#xff0c;结果根本就没有好的解决方案&#xff0c;所以我分享出来希望后来的老哥少走点弯路。 问题描述 简单来说&#xff0c;就是在Outlo…

IST——In-System-Test

1、背景 安全性是自动驾驶平台的关键特性之一&#xff0c;而这些架构中使用的半导体芯片必须保证ISO 26262标准所要求的功能安全方面。为了监控由于现场缺陷导致的故障&#xff0c;在启动和/或关闭期间会自动运行系统内结构测试。当系统内测试&#xff08;IST&#xff0c;In-Sy…

【声明ACL权限】

声明ACL权限 当应用在申请权限来访问必要的资源时&#xff0c;发现部分权限的等级比应用APL等级高&#xff0c;开发者可以选择通过ACL方式来解决等级不匹配的问题。 举例说明&#xff0c;如果应用需要使用全局悬浮窗&#xff0c;需要申请 ohos.permission.SYSTEM_FLOAT_WINDO…

探索Python的魔力:构建一个简单的网页爬虫

在当今数字化时代&#xff0c;数据无处不在。Python&#xff0c;作为一门强大且易于学习的编程语言&#xff0c;为我们提供了从互联网上抓取数据的利器。本文将向您展示如何使用Python构建一个简单的网页爬虫&#xff0c;帮助您快速获取所需信息。 为什么选择Python进行网页爬…

shell脚本脚本变量

shell脚本的概念&#xff1a; 1.讲要执行的命令按顺序保存到一个文本文件 2.给文件可执行权限 3.可以结合各种shell控制语句以完成更复杂的操作 linux中包含shell的文件有 [rootlocalhost ~]# cat /etc/shells /bin/sh #UNIX最初使用的 shell&#xff0c;已经被…

Temu、阿里国际站、TikTok的“速度战役”

事实上&#xff0c;经过多年的发展&#xff0c;电商早已深入到了人们的日常生活中&#xff0c;消费者也越来越习惯网上购物了。伴随着消费者网购需求的攀升&#xff0c;电商行业也跑出了诸多企业&#xff0c;时至今日&#xff0c;新老玩家在电商领域的“角力”仍在持续进行中。…

正点原子i.MX 93开发板,双核A55+M33+NPU,双路RS485FDCAN千兆网,异核/AI/工业开发!

正点原子i.MX 93开发板新品上市&#xff01;双核A55M33NPU&#xff0c;双路RS485&FDCAN&千兆网&#xff0c;异核/AI/工业开发&#xff01; NXP的i.MX系列是一系列面向多媒体和工业应用的ARM架构微处理器。从i.MX6U到i.MX93&#xff0c;这一系列经历了显著的发展&#x…

Vue框架学习记录

概览 前置知识 准备工作 安装环境准备 #安装node.js #安装npm #安装vue cli基于脚手架创建前端工程 方式一 #创建一个保存vue项目的目录&#xff0c;如vue_project #在vue_project下进入cmd vue create vue-demo-1方式二 #在cmd下输入 vue ui选择vue2#成功之后的界面#打开…

WebAssembly(Wasm)

WebAssembly (Wasm) 是一种在现代Web浏览器中运行的二进制指令格式。它被设计为一种可移植、可执行的代码格式&#xff0c;可以在现代Web浏览器中安全、快速地运行。Wasm 最初是为了解决JavaScript 在某些领域&#xff08;如3D图形、物理模拟、视频处理等&#xff09;性能不足的…

[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位

键盘改造 &#x1f94b; 回忆上次内容 上次练习了复制粘贴 按键 作用 <kbd>y</kbd><kbd>y</kbd> 复制光标行代码 到剪贴板 <kbd>p</kbd> 粘贴剪贴板中的内容 <kbd>i</kbd> 切换到 插入模式 <kbd>h</kbd>…

DC-DC电路中电感的下方该不该挖空

DC-DC电路中的电感下方该不该挖空&#xff1f; 在回答这个问题之前&#xff0c;先来了解一下DC-DC电路中常见的功率电感类型 一&#xff0e;DC-DC电路常用功率电感类型 图1 DC-DC电路常用电感类型 这四种类型电感&#xff0c;按照无屏蔽电感→磁封胶半屏蔽电感→组装式全屏蔽…

DDM-MIMO-FMCW雷达MATLAB仿真

本文在前期TDM和BPM体制的基础上&#xff0c;仿真DDM体制下的调制解调和信号处理测距、测速、测角流程。 TDM和BPM相关可以看这两篇博文TDM(BPM)-MIMO-FMCW雷达仿真-CSDN博客&#xff0c;确定性最大似然&#xff08;DML&#xff09;估计测角-CSDN博客TDM(BPM)-MIMO-FMCW雷达仿真…

Gartner发布应对动荡、复杂和模糊世界的威胁形势指南:当前需要应对的12种不稳定性、不确定性、复杂和模糊的安全威胁

当今世界是动荡&#xff08;Volatile&#xff09;、复杂&#xff08;Complex&#xff09;和模糊&#xff08;Ambiguous&#xff09;的&#xff0c;随着组织追求数字化转型以及犯罪分子不断发展技术&#xff0c;由此产生的安全威胁也是波动性、不确定性、复杂性和模糊性的&#…

快分销商家电话采集软件使用指南

如果你是一家快分销商家&#xff0c;你可能会发现电话营销是一种简单而有效的方式来吸引更多的潜在客户和增加销售额。但是&#xff0c;寻找这些电话号码可以是一项费时费力的任务。为了帮助你简化这个过程&#xff0c;我们推荐使用快分销商家电话采集软件。本文将为你提供使用…

Python中DataFrame常用统计方法

目录 1.示例数据准备 2.重要参数说明 axis参数说明 skipna参数 3.常用统计方法 求和 求平均 累计求和 最小值/最大值 最小值/最大值的索引 累计最小值/最大值 累计乘积 一阶差分 非空值个数 df中等于某个值的索引 样本的分位数 方差和标准差 样本的偏度和峰度…

【LeetCode刷题记录】简单篇-108-将有序数组转换为二叉搜索树

【题目描述】 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 【测试用例】 示例1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,…

【功耗问题排查】

一、如何处理具体功耗case 在手机功耗测试中&#xff0c;因为我们在功耗测试中&#xff08;电源电压&#xff09;为固定值&#xff08;老手机一般为3.8V左右&#xff0c;现在的大多项目采用4V左右&#xff09;&#xff0c;那么的大小直接由决定&#xff0c;所以&#xff0c;在沟…

Consul 配置文件深入解析

Consul是一个分布式服务发现和配置共享系统&#xff0c;它通过一个分布式的键值存储来实现服务的注册与发现。在这篇文章中&#xff0c;我们将深入探讨Consul的配置文件&#xff0c;并通过一些最佳实践来提高其专业性和逻辑性&#xff0c;以吸引更多的技术读者。 配置文件概览…

webassembly入门详解(C++)

一、环境配置 环境说明,操作系统为window操作系统。 1.1 下载和安装python 下载 需要python版本至少3.6版本 python下载地址:https://www.python.org/getit/ 安装 检测安装结果 win+R组合键->cmd->输入python->回车 1.2 下载和安装emsdk 下载 下载地址:https://gi…

vs2019 - 替换vs2019自带的cmake

文章目录 vs2019 - 替换vs2019自带的cmake概述笔记启动vs2019本地x64命令行的脚本查看vs2019自带的cmake的位置删掉旧版cmake将新版cmake的安装目录内容替换过来。查看vs2019本地x64命令行中的cmake版本配置为vs2019x64工程END vs2019 - 替换vs2019自带的cmake 概述 在看一个…