专栏名称: 51Testing软件测试网
51Testing软件测试网,人气最旺的软件测试技术门户,提供软件测试社区交流,软件测试博客,人才服务,测试沙龙,测试杂志,测试资料下载等全方位信息服务,是国内最专业的软件测试就业培训、企业服务供应商...
目录
相关文章推荐
51好读  ›  专栏  ›  51Testing软件测试网

测试女巫之Python实战问题篇

51Testing软件测试网  · 公众号  · 测试  · 2017-07-31 17:30

正文


  摘要:Pykeyboard和Pymouse,Pywinauto此模块是使用Python语言,它是用于控制鼠标键盘以及控制运行在Windows上的程序。

  一、前言:

  我们已经学习了几个常见的模块,也讲解了如何应用到工作中,不知道大家是否跟着女巫真的改善了自己的工作,因为近期女巫在51Testing软件测试网上参加了"你来问我来答"以及"51 tesing13周年庆"这两个活动,遇到了不少学员提出的问题,这期我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家。

  二、第一类问题:基础问题(小白问题)

  这类问题比较多,一般都是还未接触到Python不知道它为何物,它能在哪些方面帮到自己的小白提出的,这样的问题我找出几个有代表性的如下:

  a.如何从黑盒测试升级到自动化测试,学习Python的方法?

  b.你是如何从一个纯黑盒手动测试发展为一个全能测试的?

  c.我想自学Python,现在的工作中又用不到,不知道有没有什么好的学习方法?

  d.你好,我从事软件测试6年时间了,但是绝大多数都是黑盒测试,再北大青鸟学习过编程,想使自己能有质的提升,请帮忙指点该学习哪方面的知识使自己能有足够竞争力。

  上述问题我将其总结:为什么学Python,以及如何学习Python?

  1.为什么学Python?

  1)我先回顾一下我为什么学Python。我学习Python已经5年了,为什么学习Python是因为当时公司在做智能手机,希望可以对手机一些测试项目实现自动化,找到了Monkeyrunner这个模块,所以才进一步接触到了Python这个语言。

  2)因为好用呗,我是5年前学Python的,那时它还没这么火,现在是越来越火,从我这几年的使用看,它的实用性非常强,对于工作中遇到的问题,我都能找到相关的模块去解决,这个真的太牛了!至于实际应用的项目,例如手机测试可以用它的Monkeyrunner模块,路由器项目可以用它的selenium模块,需要调用运行在操作系统上的软件可以用pywinauto模块。如果您再问,那如何具体用到这些工作中,那就请看我的Python系列课程吧,那里有详细的说明。

  3)因为怕被淘汰,说起淘汰姐就有一把辛酸泪,我所在的公司经历了多少次针对QA的裁员,至少5次以上。我就是在一次又一次的裁员洗礼下明白了,只是做点点界面的测试真的太不安全了,一有裁员需求,第一个考虑的就是QA。我认为未来的测试应该是以自动化为主,手动测试为辅。所以测试人员必须要学会编程,测试是一个无穷尽的工作,如何体现测试人员的价值,就是在单位时间内能有更多的产出,有让老板瞠目结舌的产出,我觉得以往的那些只凭手工测试就完成一个项目的测试,会渐渐减少,甚至消失,所以如果你是个测试人员建议现在就开始学习Python,只要愿意学习,永远不会晚……

  4)最后给大家两个应用例子来说明为什么要学Python

  Pywinauto我们完成的两类开发项目(注意是两类,不是两个,项目的数量是很多滴):

  对于工厂开发的生产工具的验证:压力测试验证->这些工具都是安装运行在Windows上的,所以首先使用Spy++查找工具的窗口属性,然后将窗口控件的属性打印出来,先确认是否可以定位。一般都可以^_^,如果不可以请看下面总结的几个问题,然后就可以根据需要开始根据测试流程组织逻辑了。如下图

  b.对于硬件测试的开发:某日硬件同事需要使用QRCT此工具(熟悉硬件测试的人员应该很熟这个软件吧)测试产品,麻烦的是需要将产品放到高低温箱中,测试一夜,需要定期点击这个页面上的两个按钮。问题来了:谁能一夜不睡,去做这个无聊且没价值的工作?当然有:Python,而且代码就是如下12行,这个理由是不是很震撼?

  2.如何学习Python?

  1)首先明确Python是一个语言,一个脚本语言,所有的语言都是从Hello world开始,首先都要学习它的基本语法,变量;它的数据结构;它的各种语句写法等等,然后对于这些基本语言,写各种对应的代码,目的是帮助我们更好理解这些基础的知识。

  2)问问自己学它是为了什么,目的性一定要强,我们总不会为了考试是吗,总归有相关的工作需求你才会想学python,根据你的工作需求确认一下你需要学习什么模块,python是有非常非常丰富的第三方模块,可以帮助你快速完成你所需要的自动化开发工作。

  3)Python有很多模块,这些模块可以帮你实现很多功能,所以千万不要尝试自己写测试库,请先尝试找相关的模块,这些模块可以让你事半功倍,当然它也有自己的架构,例如unittest架构等,所以千万千万不要上来就想所有的功能都要靠自己写。另外我还想多说两句:万事开头难,刚开始学习一定会很枯燥痛苦,但是一定要坚持,撑下去,学语言一定要实践,不能看死书,多做小例子,最好把自己看过的内容,用自己的语言写出文档,这样会加深你的认识,另外学语言不能就事论事,一定要扩展,例如你看到资料上有例子,也在编辑器上写了,也正常运行了,就结束了嘛,不,你还要想,这个例子我如果这样改会怎样?通过不断改例子,会更加加深你的认识,学习起来也不会这样枯燥。

  三、第二类问题:Pywinauto实际应用中的问题(进阶的问题)

  我们使用Pywinauto开发的项目都是其它部门嗷嗷待哺的项目,说他们嗷嗷待哺,并不是贬低他们,容我解释一下:即恨不得,这一刻提出需求,下一刻就可以稳定运行,当然对于Python玩的比较转的我们来说,当然没有问题(再此可以嘚瑟一下)。所以这类项目都是操作简单,但是时效性要求非常高,这种类型的项目使用Python实在太适合了!对了,说明一下,如果只是对一个应用程序的界面进行操作,每一次操作不需要将应用程序打开和关闭,可以手动将这个程序打开,然后就直接使用Connect函数定位即可,没必要使用start函数打开。因为什么?因为其它部门""嗷嗷待哺"嘛。

  如果你的脚本出了错误,嗯,不要乱,(出问题太正常了,问题出现就是提高你能力的机会)请回归问题的本质:想想Pywinauto的作用是什么?对了:定位、操作,所以厘清问题也要从这两方面入手,不要发散问题,千万不要发散问题!告诉大家一个秘密:

  通过我们的实践,发现出现的问题主要在"定位"上。

  一般厘清问题的方法

  一定要抓本质,一定要先确认定位是否正常。简单的厘清方法如下:使用window函数定位:dlg=app.window_(title_re="aaa")然后用dlg.close()此函数确认这个窗口是否可以被关闭,如果可以关闭就可以认为此窗口可以被正常定位。如果没有被正常定位就需要看下面的几个特定问题的厘清方法了。

  特定问题的厘清方法:

  1)问题1:如果使用Spy++查到的title这个属性来定位窗口,一直出错,该怎么办?

  我之前的文章,已经跟大家分享过定位应用程序以及窗口,都是使用Spy++这个工具查看这个工具的属性:多用Class或者Title这两个属性,就可以了吗?但是有时就是不能定位,一直有错误信息跳出来,怎么办?要静下心看错误信息,才能慢慢靠近问题本质,千万不能一出问题,不管三七二十一就到网上一通乱搜,越搜越糊涂,要相信自己可以慢慢厘清。

  例如:

  app=application.Application().connect_(title_re='?Torrent 3.2')执行后得到错误信息

  从以上错误信息有充足的理由怀疑'?'出了问题,应该不是单纯的英文单词,因为错误信息打印出来的?竟然是一个中文字前面加u转化为UTF格式试试,成功了。(如果要问我,你怎么知道要加u,我告诉你,因为错误信息说明是编码的问题,这个正常人都能想到,然后再在网上搜有关字符串编码的问题,就很容易找到u这个方法)

  app=application.Application().connect_(title_re=u'?Torrent 3.2')所以不管title是不是中文,前面统统加u转化格式,一般这样就不会有这样的问题出现。

  2)问题2:在电脑1开发的脚本,可以正常运行,移植到电脑2就无法运行?

  我们在开发时遇到上述问题,开发者开始一直纠结是电脑环境的问题,问题一直在发散,一直在发散,最后问题越来越复杂,搞到最后不可收拾......,最后他告诉我,这个开发任务无法进行,这个小伙子成功在他的小主管的心里留下了:解决实际问题差的印象......他的问题在于没有回到问题的本质:Python的作用是定位,操作;我帮他厘清问题就首先回到确认窗口是否定位的思路上(当时他竟然还质疑他的小主管:窗口肯定定位了,因为在他的开发电脑上都是定位的好好的):真的发现窗口没有被成功定位。开发者就很困惑,为什么在电脑1是好的,电脑2就不行。他根本没想到是定位出的问题,所以连简单的确认动作也没做!然后再网上一通乱搜,真的越搜越晕,越搜问题越发散。

  使用Spy++发现:窗口的Title在电脑1和电脑2确实发生了变化,所以才会出现这个问题,然后问题解决的就简单了,更改titles字串就可以了。

  请不要问,为什么,我也不知道为什么,如果各位学员有时间,可以慢慢研究,对于外部门嗷嗷待哺的需求,实在没时间研究为什么,首要的问题是先解决问题,后续有时间再慢慢了解为什么。

  3)问题3:通过start函数自动调出来的窗口与用户手动打开的窗口不一致也就是说使用start函数自动调出来的窗口,后续无法定位其中的控件。

  一般情况下,手动打开的窗口与通过函数自动调出的窗口是相同的,但是在我们开发的项目中,就遇到一次这样的情况:不仅手动打开的窗口与通过函数自动调出的窗口不同,而且自动调出的窗口无法定位,更无法定位相关的控件。是不是这样的情况我们就放弃开发自动化了?当然不是,换一个角度考虑问题,这个看起来无法解决的问题就能解决!

  解决方式:调出CMD窗口使用dos命令将此程序调用出来,这种方式调出来的程序与手动打开程序的窗口是一样的就可以解决这个问题。首先我们通过Pywinauto将dos界面调出来,然后定位dos界面,在dos界面输入dos命令,这些dos命令就是进入这个应用程序的路径,并在此路径下运行此应用程序,这样的方式调出来的窗口就与手动打开程序的窗口一致,完美的解决了这个问题。

......

源自《51测试天地》原创测试文章(四十六)

 
推荐阅读

点击阅读☞测试女巫之接口测试篇

点击阅读☞测试女巫之Python Unit Test篇

点击阅读☞测试女巫之控制鼠标键盘篇

点击阅读☞测试女巫之控制Windows上的软件篇

点击阅读☞测试女巫之Python学习回顾篇



点击左下角“阅读原文”,查看全文内容