菜鸟学Python,老司机给新手总结的Python实战问题

针对Python这一话题每天后台都会有不少小伙伴提出问题,下面我就将这些问题进行汇整,产出"Python实战问题篇",我认为这些问题非常具有代表性,希望可以帮到大家。

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

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

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

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

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

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

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

首先我们要知道Pykeyboard和Pymouse,Pywinauto此模块是使用Python语言,它是用于控制鼠标键盘以及控制运行在Windows上的程序。下面开始今天的话题:

1、为什么学Python?

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

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

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:在电脑1开发的脚本,可以正常运行,移植到电脑2就无法运行?

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

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

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

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

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

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

4)问题4:与Pykeyboard和Pymouse如何配合使用还是上面那个代码,有时我们必须调用windows自带的程序,我们在操作windows自动程序时,与操作第三方程序是不一样的,对于自动程序的控件定位更为困难,如果不相信,可以自己尝试试试看,通过pywinauto的方式操作控制面板或者网络连接等界面。所以就需要用到不需要定位的Pykeyboard和Pymouse两个模块辅助完成界面操作的工作。

例如对于上面的代码:对于CMD这样的windows系统自带的窗口,输入enter_key使用 keyboard模块,比较方便,那我们为什么不用这个模块呢?所以在使用pywinauto时需要根据实际情况来决定,千万不要企图对于一个项目,只是使用Pywinauto这一个模块来实现操作界面的工作,是否需要使用Pykeyboard或者Pymouse,关键看使用哪个模块方便。

5)问题5:对于“复杂控件”定位问题

例如Button Edit这样的控件,没法使用Spy++找到相关参数进行定位,而是通过Control type+Number进行定位的。使用dlg.print_control_identifiers()这个函数将窗口的控件以及控件属性打印出来,找出相关控件的Number即可。但是在实际开发中发现,使用打印的控件number定位的控件不是期望定位的控件。例如下面是打印的窗口控件及控件属性,使用Button3无法定位到About按键,这时候怎么办?怎么办?凉拌,使用最原始也是最有用的方法:只能一个个的试,(我认它狠,一个界面能有一个button,我目前的最高纪录也就是试10个button number,普通的情况试个3-4个就能解决问题吧,所以并不会太浪费时间)例如从Button1开始一个个的试,这时打印的属性就可以弃之不管。这个情况我们在开发中遇到很多次,所以也见怪不怪了唉所以实践才是检验真理的唯一方法,不要迷信打印出来的属性,它有时会出错的,而且出错的频率还不低呢。

6) 问题6:控件的属性在不同的电脑上会发生变化

例如Button3如果在电脑1上可以定位到About按键,但是电脑2就有可能无法定位到About按键,需要重新试,值得庆幸的是,同样的电脑,这些控件的属性是固定的(如果不

是固定的真的要崩溃)

四、有关架构问题

问题:使用python做自动化主要使用是的哪些工具和框架?

这个问题非常好,框架是个非常好的东西,大家在搭建自己的测试体系时,要先在网上尝试寻找有没有已经框架,因为框架这个东西是一个可以大大加快你的开发进度的非常非常好的东西,举个例子,对于自动化测试系统,都是执行一个个Case,不可能一个case一个脚本,我们需要将这些脚本组织起来,而且需要执行一个大功能块的test case,并需要有一个整体的报告产出。这个需求就需要用到Unittest此框架。

如果你想做“云”这个高大上的后端开发,就需要用到Django此框架。

综上,你想到使用框架,就是一个非常值得赞赏的想法,因为使用框架进行开发,就像站在巨人的肩膀上,可以的大大提高你的开发效率,至于到底需要什么框架,就要看你的工作需求了,我目前用的最多的是unittest。

五、总结

首先明确一个基本概念:Python首先是一个脚本语言,所以当然需要学习语言的基本语法,无论你的实际需求是什么这些基本语法是逃不掉的,但是更为重要的是Python有各种模块,每个模块有自己的功能,有的模块是Python自带的,有的模块是第三方模块,必须自己另外安装。

根据我的经验,第三方模块非常重要,一个模块可以解决一个方向的自动化测试。具备了上述知识后就可以着手开发了,在开发中会遇到很多棘手的问题,有不少问题在网上是无法搜到具体的解决方法,我将我们在开发中遇到的奇怪问题总结出来,相信会对你的实际开发有所帮助。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190902A0IRBG00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券