首页 > 其他分享 >自动化工具之Appium元素操作小技巧

自动化工具之Appium元素操作小技巧

时间:2023-08-04 14:04:16浏览次数:36  
标签:Appium 技巧 driver getByLocator getLocatorApp 自动化 element id 测试方法

背景

      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这样的开始执行。

自动化工具之Appium元素操作小技巧_测试方法

如果想改变执行规则可以增加priority注解

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

说明:

description:表示注释

testName:标志测试类

priority:表示执行顺序

实战

案例一

下载京东APP

启动app就能看到,每次启动都会提示这个,那么在写代码的时候咱们把这个方法:

自动化工具之Appium元素操作小技巧_测试方法_02

类似这样的在写测试用例的时候可以这样写,之后其他类集成这个即可:

自动化工具之Appium元素操作小技巧_测试类_03

技巧二

如图:


自动化工具之Appium元素操作小技巧_测试类_04

类似中间这些应该怎么定位才最好,我们观察下面定位,可以采用xpath定位

自动化工具之Appium元素操作小技巧_ide_05

代码示例

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

    点击进入京东超市后再判断是否登录成可以:

    自动化工具之Appium元素操作小技巧_测试类_06

    上可以采用id定位

    自动化工具之Appium元素操作小技巧_ide_07

    代码示例

    编写通用判断类

    1.  /**
    2.      * 统一判断是否通过
    3.      *
    4.      * @param driver 传driver
    5.      * @param elemn  定元素
    6.      * @param des    描述
    7.      */
    8.     public void assertTrue(AndroidDriver<AndroidElement> driver, String elemn, String des) {
    9.         WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp(elemn), des);
    10.         element = driver.findElement(getByLocator.getLocatorApp(elemn));
    11.         String text = element.getText();
    12.         if (text != null) {
    13.             Assert.assertTrue(true, des + "验证成功");
    14.         } else {
    15.             //如果失败系统会自动截图
    16.             Assert.fail("跳转失败");
    17.         }
    18.     }

    完整代码

    元素:

    #点击首页
    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='京东超市']


    代码示例

    1.  private GetByLocator getByLocator;
    2.     private WebElement element = null;
    3. 
    4.     /**
    5.      * 构造函数
    6.      */
    7.     public CartProvider() {
    8.         this.getByLocator = new GetByLocator("loginElement.properties");
    9.     }
    10. 
    11.     /**
    12.      * 点击首页
    13.      */
    14.     public void clickCart(AndroidDriver<AndroidElement> driver) {
    15.         WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "点击首页");
    16.         element = driver.findElement(getByLocator.getLocatorApp("clickCart"));
    17.         element.click();
    18.     }
    19. 
    20.     /**
    21.      * 点击百宝箱
    22.      * @param driver
    23.      */
    24.     public void clickbaibao(AndroidDriver<AndroidElement> driver) {
    25.         WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("clickCart"), "百宝箱");
    26.         String[] name = {"京东超市", "数码电器", "京东服饰", "京东生鲜"};
    27.         for (int i = 0; i < name.length; i++) {
    28.             element = driver.findElement(getByLocator.getLocatorApp("Jingdong_supermarket".replace("京东超市", name[i])));
    29.             element.click();
    30.             //断言
    31.             assertTrue(driver, "assertTitile", name[i] + "跳转成功");
    32.             //退回
    33.             WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("home_back"), "退回");
    34.             driver.findElement(getByLocator.getLocatorApp("home_back"));
    35. 
    36.         }
    37.     }
    38. 
    39.     /**
    40.      * 统一判断是否通过
    41.      *
    42.      * @param driver 传driver
    43.      * @param elemn  定元素
    44.      * @param des    描述
    45.      */
    46.     public void assertTrue(AndroidDriver<AndroidElement> driver, String elemn, String des) {
    47.         WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp(elemn), des);
    48.         element = driver.findElement(getByLocator.getLocatorApp(elemn));
    49.         String text = element.getText();
    50.         if (text != null) {
    51.             Assert.assertTrue(true, des + "验证成功");
    52.         } else {
    53.             //如果失败系统会自动截图
    54.             Assert.fail("跳转失败");
    55.         }
    56.     }

    测试类

      1. import appout.appcase.data.CartProvider;
      2. import org.testng.annotations.Test;
      3. 
      4. /**
      5.  * @author liwen
      6.  * @Title: CartTest
      7.  * @Description: 测试类
      8.  * @date 2019/11/23 / 19:57
      9.  */
      10. public class CartTest extends BestRuner {
      11. 
      12.     CartProvider cartProvider = new CartProvider();
      13. 
      14.     @Test(description = "点击首页百宝箱", testName = "点击百宝箱", priority = 1)
      15.     public void T002() {
      16.         cartProvider.clickHome(driver);
      17.         cartProvider.clickbaibao(driver);
      18.     }
      19. 
      20. }

      xpath语法

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


      遍历技巧二

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

      自动化工具之Appium元素操作小技巧_ide_08

      观察定位方式:

      自动化工具之Appium元素操作小技巧_ide_09


      在工作中我是这样写的

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


      代码

        1.  /**
        2.      * 分类写法
        3.      * @param driver
        4.      */
        5.     public void categorylist(AndroidDriver<AndroidElement> driver) {
        6.         WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("categorylist"), "遍历分类");
        7.         //获取全部数据挨个遍历
        8.         List<AndroidElement> categorylist = driver.findElements(getByLocator.getLocatorApp("categorylist"));
        9.         for (int i = 0; i < categorylist.size(); i++) {
        10.             String text = categorylist.get(i).getText();
        11.             //输出遍历name
        12.             LogUtil.info(text);
        13.             categorylist.get(i).click();
        14.         }
        15.     }

        属性判断写法

        查看如下图:想知道该商品是否关注,应该这么写?


        通过观察他的属性:

        自动化工具之Appium元素操作小技巧_测试方法_10

        收藏属性

        自动化工具之Appium元素操作小技巧_ide_11

        通过观察,代码写法:

        1、获取该元素的地位

        自动化工具之Appium元素操作小技巧_ide_12

        元素为:

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

        简单代码

        1. /**
        2.      * 收藏
        3.      *
        4.      * @param driver
        5.      */
        6.     public void productdetail(AndroidDriver<AndroidElement> driver) {
        7.         WaitUtil.waitWebElement(driver, getByLocator.getLocatorApp("productdetail"), "收藏");
        8.         AndroidElement detail = driver.findElement(getByLocator.getLocatorApp("productdetail"));
        9.         String attribute = detail.getAttribute("selected");
        10.         if (attribute.equals(true)) {
        11.             LogUtil.info("目前商品收藏,目前的属性为:" + attribute);
        12.         } else {
        13.             LogUtil.info("商品没有收藏,目前的属性为:" + attribute);
        14.         }
        15.     }

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

        总结

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


        送大家一篇文章

        庖丁解牛

        先秦:庄周

          吾生也有涯,而知也无涯 。以有涯随无涯,殆已!已而为知者,殆而已矣!为善无近名,为恶无近刑。缘督以为经,可以保身,可以全生,可以养亲,可以尽年。

          庖丁为文惠君解牛,手之所触,肩之所倚,足之所履,膝之所踦[yǐ],砉[huā]然向然,奏刀騞[huō]然,莫不中音。合于《桑林》之舞,乃中《经首》之会。

          文惠君曰:“嘻,善哉!技盖至此乎?”

                              

        自动化工具之Appium元素操作小技巧_ide_13


        标签:Appium,技巧,driver,getByLocator,getLocatorApp,自动化,element,id,测试方法
        From: https://blog.51cto.com/u_15181572/6961719

        相关文章

        • BJL制胜技巧打法分享,教你无限连胜
          BJL我也玩了五年的时间了,中途大红过也连黑过,其中的心酸苦楚想必大家也都懂,下面,我为讲解的几个要点,胜在柱码以及规划上,本人从当初亏损八十多个,到如今还清负债开盈利,也全都是靠着这套玩法窍诀技巧一,顺势而为,不要逆势而上,推荐罔止787887点tv 探讨交流Q368827563 我想这句话......
        • Xshell使用技巧及常用配置
          Xshell使用1、调整Xshell的终端显示和回滚缓冲区大小磨刀不误砍柴工,为了更方便地学习Linux,首先得对终端进行一些调整,步骤如下:首先通过xshell顶部菜单中的文件-->属性,打开会话属性窗口,然后点终端,按下图配置:调整终端显示和回滚缓冲区的说明如下。终端选择为Linux(有网......
        • 如何维护自动化测试
          毫无疑问,自动化测试已改变了软件开发的工作方式。如果不是Selenium自动化测试,测试人员将花费大量精力进行各种各样的无错误Web应用程序测试。有一部分人认为程序最终将为他们完成越来越多测试工作,最终使整个测试过程自动化。但,这并不代表可以一劳永逸!这并不是说他们做不到,越是依赖......
        • 【图像分类】没有人工收银,吃饭买单全自动化,是谁的功劳?
          不知道你是否已经发现我们平常购买商品的时候越来越少需要人工收银笔者逛商场的时候就特别喜欢去自助小餐厅从选菜到结账完全只需要自己参与不仅减少了排队结算时间还给吃饭带来了仪式感自助收银这背后的技术就是图像识别包括图像分类与目标检测作为计算机视觉的核心部分图像分类的......
        • 微服务架构实战指南:分布式系统的设计与部署技巧
          微服务架构实战指南:分布式系统的设计与部署技巧分布式微服务架构是一种将大型应用程序划分为多个小型服务的设计方法。这种方法可以提高应用程序的可扩展性、灵活性和可靠性。以下是设计和实施分布式微服务架构时应考虑的关键要点和策略:1、服务拆分和设计:首先需要对应用程序......
        • IOS自动化—将WDA打包ipa批量安装驱动
          文章目录前言必要条件为何做这个一、下载WebDriverAgent二、进行打包WDA.ipa1、指定xcode运行路径报错解决一:pathdoesnotexist报错解决二:notcontainanXcodeproject,workspaceorpackage.2、按步骤执行命令第一步第二步第三步三、安装ipa文件下载tidevice安装四、启动WebD......
        • ios自动化-Xcode、WebDriverAgent环境部署
          环境准备:Mac电脑一台(更新到最新的macOS,此文档使用的为macOS12.3.1,Intel芯片)Xcode最新稳定版(此文档使用的为13.4.1)IOS设备(此文档使用了10.3.3-15.1均有,且都安装WebDriverAgent成功)保证自己电脑有大于25G的可用内存空间,Xcode很大!Xcode下载https://developer.apple.com/xcode/r......
        • python-windows命令行启动appium及杀掉对应接口进程
          文章目录windows命令行启动appium及杀掉对应接口进程一.环境配置1.安装命令行版appium2.安装appium-doctor检测3.python安装Appium-Python-Client:4.定位uiautomatorviewer.bat5.查看主包名主类名Activity二.python-appium启动app1.appium启动一加计算器相关参数:2.windows查看端口......
        • 【华秋干货铺】PCB布线技巧升级:高速信号篇
          如下表所示,接口信号能工作在8Gbps及以上速率,由于速率很高,PCB布线设计要求会更严格,在前几篇关于PCB布线内容的基础上,还需要根据本篇内容的要求来进行PCB布线设计。 高速信号布线时尽量少打孔换层,换层优先选择两边是GND的层面处理。尽量收发信号布线在不同层,如果空间有限,需收发......
        • mac 开发环境常用技巧
          话说Mac一般来讲不需要什么重装啊,不过世事无绝对啊,有时候人就是喜欢作死!!!比如前几天的我~~~算了,具体情况就不说了,反正就是作死,Mac系统出了问题。本来想着用TimeMachine恢复一下就得了,也省事。不过仔细想了一想,很想自己安装一遍(博主的折腾精神有时候很是让自己“佩服”),然后就开始了M......