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

news/2024/9/22 23:19:22/

文章目录

  • 一、背景
  • 二、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.ppmy.cn/news/1458021.html

相关文章

C++Linux系统编程——Linux基本命令(究极全)

1.Linux常见目录介绍 /&#xff1a;根目录&#xff0c;一般根目录下只存放目录&#xff0c;在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”&#xff0c;你其实是在告诉电脑&#xff0c;先从/&#xff08;根目录&#xff09;开始&#xff0…

分布式关系型数据库管理系统 OceanBase 安装和配置教程

&#x1f30a; 分布式关系型数据库管理系统 OceanBase 安装和配置教程 &#x1f680; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝…

银河麒麟QT项目打包详细教程

银河麒麟QT项目打包详细教程 一、QT项目打包 下载linuxdeployqt&#xff0c;下载地址&#xff1a;https://github.com/probonopd/linuxdeployqt/releases 安装Linuxdeployqt 2.1 为了安装方便&#xff0c;将下载下来的文件名称改短些 mv linuxdeployqt-6-x86_64.AppImage lin…

醛固酮(Aldosterone)/Aldosterone ELISA kit--比色竞争法酶免疫检测试剂盒

醛固酮&#xff08;Aldosterone&#xff09;是一种由肾上腺皮质中的胆固醇合成的类固醇激素。醛固酮在肾脏和肝脏中代谢&#xff0c;并作为控制钠钾平衡的关键盐皮质激素发挥作用。肾上腺合成和释放醛固酮主要受肾素-血管紧张素-醛固酮系统&#xff08;RAAS&#xff09;的调节&…

Isaac Sim 3(学习笔记5.8)

Isaac Sim 利用深度学习获取mask掩码图 参考内容 Kubernetes官网 在 Linux 系统中安装并设置 kubectl | Kubernetes准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如&#xff1a;v1.30 版本的客户端能与 v1.29、 v1.30 和 v1.31 版本的控制面通信。 用…

微信在线投票送礼物票选小程序源码系统 带完整的安装代码包以及安装搭建教程

在数字化时代&#xff0c;互动与参与成为吸引用户的关键。为了满足广大用户对于在线投票和礼物赠送的需求&#xff0c;我们特别推出了这款微信在线投票送礼物票选小程序源码系统。该系统不仅提供完整的安装代码包&#xff0c;还附带详细的安装搭建教程&#xff0c;让用户轻松搭…

韩国站群服务器如何提升网站性能与用户体验?

韩国站群服务器如何提升网站性能与用户体验? 在当今数字化时代&#xff0c;网站性能和用户体验对于吸引和保留用户至关重要。为了提供快速、稳定和优质的服务&#xff0c;越来越多的网站管理员开始利用韩国站群服务器来优化其网站性能。本文将探讨如何利用韩国站群服务器来提…

Liunx系统怎么设置免密登录?看这一篇!

远程口令爆破也是黑客常用的手段&#xff0c;有些人安全意识薄弱的会设置一些简单的密码&#xff0c;这样分分钟会被黑客爆破进去&#xff0c;一旦操作系统沦陷&#xff0c;里面的数据必将被黑客一览无余&#xff0c;使用免密登录可以有效降低密码被爆破的风险&#xff0c;具体…