Appium appium 关键字驱动自动化测试

周小丽 · 2016年03月21日 · 最后由 Criss Wang 回复于 2019年02月12日 · 8936 次阅读

好久没发过帖子了,在狂沙大神的指导下完成了 appium 关键字驱动自动化测试,可能设计方法有所缺陷,欢迎指正,另外尤其是断言方面欠缺比较多。

设计思路

1、将 appium 的关键字存放在 excel 表中。
2、然后通过 jxl 读取 excel 表的关键字进行元素查找、执行等相关动作。
3、测试相关数据存放在 excel 另一 sheet 表中,主表和子表根据测试用例 ID 号进行关联。
4、用例断言只要是采用截图对比以及元素文本获取对比的方式。
5、最后将断言结果写在 excel 相应的表格中。

先贴张 excel 的布局图吧!

接下来还是贴代码吧!

excel 表关键字获取

File file = new File("e:\\data.xls");   //采用的是jxl.jar读取写入表格方式
    InputStream in = new FileInputStream(file);  //新建一可读取本地内容的文件
    Workbook workbook = null;
    workbook = Workbook.getWorkbook(in);  //获取本地可读取的文件
    mworkbook =  workbook;
    Sheet sheet0 = mworkbook.getSheet(0);   //获取第一个sheet表
    int rowLength0 = sheet0.getRows();  

    for(int k=0;k<2;k++){ //测试用例执行的遍数
        for(int i=1;i<rowLength0;i++){
            Cell FI = sheet0.getCell(5, i);  //获取sheet0表的第i行第5列
            String strFI = FI.getContents();  //获取该单元格的内容
            mstrFI = strFI;
          //  定位方式

            Cell GI = sheet0.getCell(6, i);
            String strGI = GI.getContents();   
            mstrGI = strGI;
           // 测试对象实体

            Cell HI = sheet0.getCell(7, i);
            String strHI = HI.getContents();
            mstrHI = strHI;
          //  操作方法  

            Cell AI = sheet0.getCell(0, i);
            String strAI = AI.getContents();
            mstrAI = strAI;
         //  测试用例ID

            Cell II = sheet0.getCell(8, i);
            String strII = II.getContents();
            mstrII = strII;

读取子表的测试数据

if(parameter.equals(mstrII)){      
  // System.out.println(i); 
   Sheet sheet1 = mworkbook.getSheet(1);   
   msheet1=sheet1;
   int rowLength1 = sheet1.getRows();
   for(int n=1;n<rowLength1;n++){
       Cell AJ = sheet1.getCell(0, n);  
       String strAJ_1 = AJ.getContents(); 
       String strAJ = parameter_1 + ":" + strAJ_1;
       if(strAJ.equals(mstrII)){   //根据测试用例ID将主表的测试用例与子表的测试数据进行关联
           m =n;
           int j;
           j=m+k;  //获取下一轮对应测试用例ID号的行值,K为执行测试用例的遍数
           mj=j;
           System.out.println("j"+j); 

           //如下为将j的行值存到list中,然后判断list中数据,如果元素相当则执行getsunlist(),如果不相当,则释放list,然后将参数初始化,并重新将数据添加到list中
           mList.add(j);  
           if (mList.size() > 1) { 
               for (int ii=0;ii<mList.size();ii++) {
                   for (int iii=ii+1;iii<mList.size();iii++) {
                       if (mList.get(iii) != mList.get(ii)){
                           // System.out.println("不等于");
                            mList.clear(); 
                            mList.add(j);
                            a=2;
                          // return;
                       }
                       break;  
                   }
               }
               getSublist();

           }
           else if (mList.size() == 1) {                            
               getSublist();
           }
           break;  //每读取完一次子表的测试数据后即跳出子表,回到主表继续寻找控件并执行相关动作
       } 
       else{
           continue;  //如果在子表没找到对应的测试ID号,则continue继续查找
       }
   }

将断言结果写入对应的表格位置

     //如下方法是将子表中各字段的断言结果存到list中有进行布尔运算后存到子表对应位置
     boolean b1= result1.equals("true") ? true : false;    //将子表string的值转换成布尔值
     mListC.add(b1);
     boolean b2=true;
     for(int c=0;c<mListC.size();c++){
         if(mListC.get(c)==false){
             b2=false;
         }
         else{
             b2=true;
         }   
     }
    String strb2;
    strb2 = String.valueOf(b2);
    sheet1_1.addCell(new Label(1,mj,strb2)); 
}

else{
    Thread.sleep(500);   
    getActions(mstrHI,null,driver);  //null为空测试数据,获取元素的执行动作
    getResult(driver);   //根据控件不同的执行动作做不同的断言方式
    sheet0_1.addCell(new Label(9+k,i,result));   //将相应的断言结果插入到主表对应的位置
共收到 54 条回复 时间 点赞

狂沙。。卖苹果的那小伙啊。。结果直接反应到表格了啊,不错呀

不错,已经有二次封装的模型了,

#2 楼 @hlf837739109 我落伍啊,能问下二次封装的模型不

我咋发现你发啥都是我想找的呢。

这样做是最省心的做法了,也是成功的第一步,建议在测试组内全员推行,挖掘 ui 自动化的最大价值,使其发挥最大作用。默默玩耍的结果会导致 ui 自动化被淡出。。。妹子加油哦~~

#5 楼 @xushizhao 嗨,大哥,看到你说关键字驱动只是成功的第一步,我很高兴,因为我现在遇到瓶颈了,不知道 appium 再如何应用下去,不知道如何发挥它的强大精髓,还能再怎么用呢

  • 为啥要用 excel,宁愿用 xml 来管理?如 python yaml -element_info: /android.widget.ListView/android.widget.LinearLayout[@index='7'] operate_type: click findElemtType: xpath
  • 结果也是不建议用 excel 展示,用 html 页面展示效果如何?
  • 还有建议用智能等待元素的方法,如果到指定时间无法找到页面元素,捕获异常返回 false,如: WebDriverWait(self.cts, 10).until(lambda x: x.find_element_by_name(self.element_info))

#6 楼 @xiaoli 让它动起来,光你自己用最后的结果。。。。
建议测试全员培训学习使用,你只负责核心代码的维护,所有测试脚本,全体人员集体维护,抽取大家认为有需要监控的 CASE, 进行日常监控,冒烟测试

#8 楼 @lose ,◾还有建议用智能等待元素的方法,如果到指定时间无法找到页面元素,捕获异常返回 false,,,这想法不错,谢谢。。然后 html 的还不会,回头学习下

我也差不多是这样,真是英雄所见略同啊,哈哈

我以前在 web 上 selenium,然后通过反射,action(click+wait 等)+path(id,xpath)+ 方式(byxx),写个一个 demo,后来发现组内的人 还是不太喜欢用。。就放弃了。。

关键字驱动还是不错的,学习一下,以后看看能不能用上@xiaoli

我是你的粉,所以必须顶~~~

如果提供一个简单的 demo 就更好了。

匿名 #17 · 2016年04月16日

我理解的关键字,以为是那种调用式的,通过封装控件,调用方法,通过点,点出来的……

—— 来自 TesterHome 官方 安卓客户端

@xiaoli 问一下 ,各种断言要如何体现在这个 excel 上呢

#18 楼 @kuroky 将断言结果输出到 excel 指定的单元格位置

@xiaoli 我的意思 比如我要校验一个元素的 content-desc 的值是否包含 XXXXX 怎么在 excel 中配置
比如 我要判断一个元素 是否在界面显示,且可操作 怎么配置

#20 楼 @kuroky if(driver.findElementByName(mstrBJ).getText().equals(mstrBJ)){ //断言:如果 strBJ 输入框中的获取的文本与 strBJ 一致,则断言成功

@xiaoli 明白了,你这个关键字驱动还是需要编写用例代码的,是吗?
我以为你这个不需要编码,直接写在文件里的,然后代码读取文件执行,比如一个 tab 页就是一个用例,所以我问你 excel 怎么配置。

#22 楼 @kuroky 我这是一框架,框架是需要写代码的,一但好了之后,其他人只需要在 excel 写用例,不用管代码,你只需要维护优化框架就可以了

那就又回到我以前的问题了,你这个 2 维的表格,如果解决有些元素我需要获得 content-desc,有些需要获得 text,断言的时候有些事 contaions,有些是 equals,或者是其他的,还有就是有些时候断言可能是一个 for 循环,在循环里面加各种断言。
我以前也考虑过这种方式,试图使测试人员不用写代码,直接配置 excel,但是后来发现有很多问题一个 2 维表格解决不了就放弃了,改为封装平台差异,减少代码量

匿名 #25 · 2016年04月25日

用例承载测试逻辑,由关键字组合组成,这样关键字承载的细节实现变化后,改关键字细节即可,用例不需要变化。

#24 楼 @kuroky 根据不同的关键字 做不同的断言方式,用 if 语句,比如当为 click 时,采用截图对比 click 前后的图片;比如 sendkey,就用 if(driver.findElementByName(mstrBJ).getText().equals(mstrBJ)) 断言

高手啊,能否指点一下我啊

#26 楼 @xiaoli 测试数据那列的数据来自哪里,这个框架你封装了多少个测试方法

#26 楼 @xiaoli 你好,想问一下关键字驱动后,就是一个表格对应一个测试步骤吗?比如登录或者下单,都分别放在不同的表格中,如果不是的话怎么处理用例之间的前后关系?

#26 楼 @xiaoli 先赞个,哈哈~你这个有用到 maven,gradle 或者 testng 么,自动化测试跑之前的的数据清理/制造&落地数据的校验请问你是如何实现的呢?

#30 楼 @sigma 用到了 testng,用例跑之前的数据来源于 excel(前提得先在 excel 中录入用例的参数),数据校验:和你写的预期值进行校验,预期值事先写到了脚本中

#29 楼 @mingyuwang ,用到了 2 个表格,主表是测试用例,子表是测试用例用到的具体参数,主表和子表是一对多的关系,通过用例 ID 进行关联

#31 楼 @xiaoli 预期值也可以考虑写在 excel 中哇,这样就完全脱离硬编码了~

#33 楼 @sigma 想法不错,可是不太可行,因为我这是批量执行用例,是根据用例的类型进行粗略断言的。如果写在 excel 中要精准断言的话,那就复杂了,比如 第一次 click 操作后进入的是 A 页面,再 click 进入的是 B 页面,那我怎么写断言,我需要对不同的页面以及页面中的内容(若 sendkey)进行判断?

#34 楼 @xiaoli 可以考虑 java 的反射,通过字符串解析方法 method.getName() == yourMethod,比如填入 Assert.assertEquals(${实际值}, 期望值)然后通过占位符的方式在代码里做替换(这块的处理逻辑会很复杂),不过我做的是接口测试,UI 的话我还真没啥经验~

大神还很谦虚

#35 楼 @sigma 接口测试,我倒是将期望值写到了表格中,和实际值进行对比,因为这个的期望值就是一输出,比较明确,好比较

楼主,刚接触这个时间不长,我想问下怎么用 Appium+java 测试的时候在安卓模拟器里面实现从键盘输入内容?

def test_gestureUnlock(self):
#time.sleep(5)
el1 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[10]")
print el1
time.sleep(2)
el2 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[13]")
print el2
time.sleep(2)
el3 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[16]")
print el3
time.sleep(2)
el4 = self.driver.find_element_by_xpath("//UIAApplication[1]/UIAWindow[1]/UIAButton[17]")
print el4
time.sleep(2)
Gesture = TouchAction().press(el1).move_to(el2).move_to(el3).move_to(el4).release()
print Gesture
time.sleep(2)
Gesture.perform()

请问 手势密码这一段有什么问题啊 一直提示如下错误:

File "/Library/Python/2.7/site-packages/appium/webdriver/common/touch_action.py", line 94, in perform
self._driver.execute(Command.TOUCH_ACTION, params)
AttributeError: 'NoneType' object has no attribute 'execute'

#39 楼 @yifenzhonghuxi ,line 94 的代码是什么啊?这涉及到前后文的关系, 就这样 我看不出什么问题哦

#38 楼 @yk617558302 capabilities.setCapability("restKeyboard","True"); //重置输入法为系统默认;;或者在安卓手机的系统设置中找到输入法的设置,将其设为 appium 的输入法

#40 楼 @xiaoli 知道问题了,TouchAction 需要传一个参数

@xiaoli 如果要写 selenium 的建议先参考一些开源的轮子。其实断言也可以封装关键字后,以反射的方式找到关键字对应的测试方法并使用。另外,的确如 xushizhao 所说,不要默默一个人用,最好能尽快推出来全组用,而且最好是分层化测试,你来管理核心关键字开发的框架,其他人来基于你的框架写脚本,当然,如果有水平达到的能和你一起维护也是不错的选择。因为很多中小公司对 UI 自动化都是觉得是可有可无的,不尽快推广的话最后可能还没见光就死了。

#43 楼 @testercc 理解,可我们公司现在推行不起来,因为测试就 2 人,而且还要着急上线,呵呵,所以我只能先自己琢磨怎么用

执行用例的代码在哪呢? 另外我觉得你可以把 Cell FI = sheet0.getCell(5, i) 类似这种的 5 6 7 8 列编号拉出来管理,比如 public static Integer COLUMN_FI = 5; //说明这是什么. 这样如果你 EXCEL 结构有调整也方便一些。

楼主!!!刚好需要做关键字驱动的 appium 测试。。实在是心有余力不足,能不能发一段比较完整的代码 demo 参考一下!!跪谢!!!512957863@qq.com

#8 楼 @lose 您好,我最近也在琢磨 python 的关键字驱动,但是没有头绪,希望您有时间能够指点一下您说的 xml 配置数据是一个怎么样的实现方式?

不错,不错,读文件代码部分待封装,excel 文件名可以是代码文件名一致;excel 的 sheet 名可以与方法名保持一致。

看了你的文章感觉你的思路很好。很厉害,有没有完整的案例 demo 提供下 参考下啊

能说下为什么要用关键字驱动。或者数据驱动么?规避代码?平台化?详细说下好么

避免别人动你的代码,万一动了哪块导致程序运行不起来,这维护量大,另外用 excel 定制好,其他人只需要填写某些字段,这样上手也快

douhaipeng 回复

没有做 demo 哦

这种从 excel 表格中读取数据的方法应该可以换为直接从数据库读取吧,然后通过搭建一个 web 前台页面,将步骤写入到数据库再调用 appium 服务执行用例,一个 UI 自动化的测试平台应该就可以实现了,不知楼主有没有往这方面研究的兴趣呀,可以一起讨论讨论😄

这是关键字驱动么?问号脸。。。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册