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

周小丽 · March 21, 2016 · Last by Criss Wang replied at February 12, 2019 · 5435 hits

好久没发过帖子了,在狂沙大神的指导下完成了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再如何应用下去,不知道如何发挥它的强大精髓,还能再怎么用呢

#4楼 @t880216t ,嘻嘻

  • 为啥要用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, 进行日常监控,冒烟测试

周小丽 #10 · March 22, 2016 作者

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

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

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

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

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

周小丽 #15 · April 08, 2016 作者

#14楼 @aduocd 谢谢

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

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

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

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

周小丽 #19 · April 22, 2016 作者

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

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

周小丽 #21 · April 22, 2016 作者

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

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

周小丽 #23 · April 25, 2016 作者

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

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

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

周小丽 #26 · April 25, 2016 作者

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

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

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

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

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

周小丽 #31 · May 11, 2016 作者

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

周小丽 #32 · May 11, 2016 作者

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

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

周小丽 #34 · May 12, 2016 作者

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

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

大神还很谦虚

周小丽 #37 · May 13, 2016 作者

#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'

周小丽 #40 · May 19, 2016 作者

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

周小丽 #41 · May 19, 2016 作者

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

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

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

周小丽 #44 · May 20, 2016 作者

#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提供下 参考下啊

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

周小丽 #51 · May 26, 2017 作者

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

周小丽 #52 · May 26, 2017 作者
douhaipeng 回复

没有做demo哦

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

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

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up