闲逸笔记

keep it simple & stupid

Python + Selenium Web UI 自动化测试框架 Knitter

1). 简介

这个框架是自己多年自动化测试的一个总结。整个设计的思想最初在 QTP 上实践,后来在 Python 环境中使用 Selenium 完整实现。由于自身的懒惰,直到最近才写了下大致的文档,并发布到 GitHub 及 PyPI 中。

名字叫 Knitter,只是随手起的,方便管理而已。开源,BSD License。

2). 设计思想

  • 页面元素识别、页面元素操作、测试用例设计、测试数据维护(部分)、测试用例的执行,完全分离,便于维护。

  • 清晰的分层设计。添加页面元素时只关心元素识别方式,添加测试用例时则只关心用例逻辑及测试数据。

  • 配备完善、详细的日志系统。

  • 配备完善的错误、异常处理系统。

  • 支持基于 Excel 的数据驱动测试。

  • 支持自由地进行编码扩展。

3). 依赖条件

目前的测试程序都是在 Windows 下运行。需要安装 Python 2.7,推荐 Eclipse + PyDev 配置开发环境。

支持 IE, Firefox, Chrome。IE/Chrome 需要下载 driver 文件。

4). 代码及文档等

5). 后续

对于不常见的页面测试情况尚不完善,后续会持续更新。

  • 2016-08-21: 更新至版本 0.4.0,同时支持 Python 2.7 和 Python 3.5。

    • 建议 Firefox 不要使用最新版,Selenium 的支持可能跟不上。可以使用老一点的版本如 42.0。

    • 可能会有些新兼容问题,将会持续保持更新。


Permalink [http://sleepycat.org/blog/33]


评论区

 

Elson   2017-08-08 23:44  在此条评论下回复 ▼ 

你好,最近在琢磨者公司一个UI自动化测试,一直在思考如何将UI和逻辑分离,见到你写的框架,茅塞顿开,打算仔细研读你的代码,请问有没有中文说明文档,Python语言还不是很到家,希望有什么不懂的地方,还望大神不吝赐教

Henry    Blog Author  2017-08-11 17:15

请参考:http://sleepycat.org/blog/39/

 

 

dashial   2017-07-18 14:58  在此条评论下回复 ▼ 

WebBrowser.SwitchToFrame(frame)

这个frame是要填什么类型啊提示我说我的frame不是一个JSOM 序列

Henry    Blog Author  2017-07-20 10:20

应该是一个 frame 的对象,参考:
https://stackoverflow.com/questions/28723143/function-for-switching-frames-in-python-selenium
https://stackoverflow.com/questions/23302769/python-selenium-switch-into-an-iframe-within-an-iframe

 

 

 

  2017-07-09 17:39  在此条评论下回复 ▼ 

打算学习,刚好搜到大神的博客,knitter的代码没看懂,准备花时间好好研究一下,求一份详细一点的使用说明文档,非常感谢!516727324@qq.com

Henry    Blog Author  2017-07-11 15:37

你好,抱歉我也没写太详细的文档,主要看这篇文档就差不多够了:http://sleepycat.org/blog/39/,并没有什么很高深的技术,只要 selenium 基础好,多跑下代码基本就可以理解了。:)

 

gavin   2017-03-01 21:52  在此条评论下回复 ▼ 

WebBrowser.SwitchToFrame(frame)时遇到问题,这个frame是通过xpath获取到的数组中的一个值,不知道该怎么处理了,请问怎么解决?

 

 

阿狸   2017-02-21 17:31  在此条评论下回复 ▼ 

问一个很老的问题了,你们验证码是怎么处理的啊。我看了很多资料,有用ocr的也有用session的,还有万能验证码或者直接频闭掉的,就想问问大大会不会用session或者ocr,看不懂的说。

Henry    Blog Author  2017-02-23 17:35

没处理过这种问题……但验证码就是为了防止程序自动登陆的,如果可以轻松破解岂不是毫无用处了 @_@

 

 

xx   2017-02-06 16:54  在此条评论下回复 ▼ 

在用例的管理方法有没有更好的方法。比如nose可以打tag。

Henry    Blog Author  2017-02-16 09:20

目前还没有。只是一组用例用 Python Module 分类,单个用例用 Python Function 编写。

 

 

 

 

Anna   2017-01-06 12:08  在此条评论下回复 ▼ 

如果方便求一份knitter代码详细一点的使用说明文档,非常感谢!758293934@qq.com

Henry    Blog Author  2017-01-08 21:02

抱歉这个还真没有。只有博客里讲到的这些。@_@
而且目前已经出到 Python 3.6 和 Selenium 3.0 版本了,这套框架很多设计方面需要提高,最近挺忙的,我有时间会尽量更新。

 

Anna   2017-01-06 12:06  在此条评论下回复 ▼ 

你好,Henry
我想请教一个比较初级的问题,Python自动化选择开发工具,那么我该选择Eclipse 还是选择pycharm,Python技术讨论群里面建议使用pycharm,说是low人才用那个,我有点动摇了,因为个人比较喜欢Eclipse编码,两者之间优势在哪里我了解不多,因为我对pycharm还不太了解,个人较为喜欢Eclipse编码

Henry    Blog Author  2017-01-08 20:58

工具而已,没必要纠结这些事情。哪个顺手用哪个。先把 Python 用熟练了,IDE 可以随时换,换起来也很容易。新手的话尤其不要在这种无聊的事情上浪费时间。
我也很 low,但我觉得 low 不 low 是写代码的水平,跟 IDE 完全没关系。;)
eclipse + PyDev 插件的开发环境我已经写过很多项目了,不管代码水平如何,这个开发环境对我来说足够了,所以也一直没有换。PyCharm 是收费的,刚刚查了下有社区免费版的,但 eclipse 一直用的挺好,就懒得换了。有那个精力还不如好好看看代码。

Henry    Blog Author  2017-01-24 10:28

今天试用了一下 PyCharm,在语法解析方面的确要优于 Eclipse + PyDev。Python 熟练了的话可以尝试一下这个工具,很简单。

 

 

maso   2016-10-01 23:50  在此条评论下回复 ▼ 

大神,好!请教个问题:
这套框架,如果不想将报错信息写报错模板页面,而是直接在python的调试页面显示出报错信息,这个要在哪个地方进行注释掉?非常感谢哈!!

Henry    Blog Author  2016-10-02 21:21

如果想把代码运行错误信息打印到终端,修改 knitter.common.exception_error() 函数,在 return error_message 前加一句 print(error_message) 应该就可以。

如果是要把测试用例验证失败的信息(比如期望显示2,实际却显示3,这种失败信息)也显示到终端,则修改 knitter.log.step_fail(message) 函数,也是加几句适当的 print() 就可以。

 

maso   2016-10-01 23:50  在此条评论下回复 ▼ 

大神,好!请教个问题:
这套框架,如果不想将报错信息写报错模板页面,而是直接在python的调试页面显示出报错信息,这个要在哪个地方进行注释掉?非常感谢哈!!

 

 

maso   2016-09-08 20:48  在此条评论下回复 ▼ 

非常感谢大神热心的回复!!!!

Henry    Blog Author  2016-09-09 15:18

不用客气 :),不是大神…… @_@

 

 

 

 

maso   2016-09-07 23:57  在此条评论下回复 ▼ 

大神,再请教一下,什么情况下,cls.index会不等于0?

Henry    Blog Author  2016-09-08 09:57

在通过 by, value 无法完全定位的时候,如,各属性都相同的多个 button, 可能通过 index=0, 1, 2, ... 来区分。

 

maso   2016-09-07 23:13  在此条评论下回复 ▼ 

还有一个问题也请教一下:
两点有些selenium框架直接用unittest,但是knitter用的是自己写的一套多线程测试框架,之前在网上查了一下,unittest不支持多线程,问一下,是因为要实现多线程才不用unittest的嘛?
我是初学的,所以很多问题问的也不太具体,还请帮忙讲解一下,非常感谢!

Henry    Blog Author  2016-09-08 09:59

多线程这一块是因工作方面的需求而添加的功能。要做成一台测试机器上多个测试用例同时并发运行。这样可以节省时间。

 

maso   2016-09-07 23:09  在此条评论下回复 ▼ 

你好,最近一直在看你的源码的,受益很多的,非常感谢你无私的分享!
webelement模块中的类compatiblemethod,你的代码注释与道:This is an extention version for "@classmethod", used for multi-thread issues of the framework。
我这边也是刚学不久,能否帮忙讲讲这个用来做什么的不,只是传递类或实例的对象?如果传的是实例的话,cls.__name__这个也会报错呀。

Henry    Blog Author  2016-09-08 10:12

@compatiblemethod 这个装饰器是这样的,原先使用 @classmethod,可以支持如下的用例操作:
SignIn.AnswerOfQuestion.Set("this is a test string.")

但有的情况,可能需要传递参数给 AnswerOfQuestion,如:
SignIn.AnswerOfQuestion(2).Set("this is a test string.")
这时,在调用类AnswerOfQuestion(WebElement)的属性变量的时候会有问题。
所以写了这个装饰器,使 Set, Click 这些方法可以同时支持类、类实例的使用。

当时也是摸索着写的,运行成功后就没再管了,注释中关于 multi-thread 的部分,可能是写混了吧,记不清了~ 0_0,我有时间再查查看。

 

 

 

testboss   2016-08-16 10:50  在此条评论下回复 ▼ 

有没有计划 啥时候 在Python 3 版本上迁移

Henry    Blog Author  2016-08-17 09:35

好的,我尽快找时间做一下。

Henry    Blog Author  2016-08-21 18:54

代码已经升级到 0.4.0 版本,可以同时支持 Python 3.5 和 Python 2.7。https://pypi.python.org/pypi/knitter/0.4.0
若有使用问题欢迎与我联系,这个库并不复杂,也可以自己改进源代码 :)

 

 

cty   2016-08-12 16:13  在此条评论下回复 ▼ 

请问这个框架 Python 3.0以上的支持吗

Henry    Blog Author  2016-08-13 22:52

非常抱歉,由于工作很忙,一直还没有时间往 Python 3 版本上迁移。目前只用在 Python 2.7 上。

 

cty   2016-08-12 15:44  在此条评论下回复 ▼ 

需要安装 Python 3.5,推荐 Eclipse + PyDev 配置开发环境

 

 

jone   2016-06-19 10:16  在此条评论下回复 ▼ 

pydev debugger: starting (pid: 5860)
Traceback (most recent call last):
File "D:\Program Files\eclipse\plugins\org.python.pydev_4.4.0.201510052309\pysrc\pydevd.py", line 2364, in <module>
globals = debugger.run(setup['file'], None, None, is_module)
File "D:\Program Files\eclipse\plugins\org.python.pydev_4.4.0.201510052309\pysrc\pydevd.py", line 1784, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "D:\workspace\knitter_web\src\example\run.py", line 8, in <module>
executer.run(conf.ChromeDemo, testcase.validations.TestCase001_NormalInputTest)
AttributeError: 'module' object has no attribute 'validations'
楼主 你好,请问这个怎么解决;代码看得不怎么懂,可否发一份详细的说明书

Henry    Blog Author  2016-06-22 14:12

您好,请检查一下 example/demopej/testcase/__init__.py 文件,其中是否有一句: import validations,如果没有,添加上试试。
另外因为时间原因文档写的不好,也不全面,后面我会找时间完善,很抱歉。

 

 

hello   2015-12-28 16:06  在此条评论下回复 ▼ 

出现了这样的错误,去env.py看了一下,发现CASE_NAME是被注释掉的。那么在env里面是没有这个变量的。尝试改了一下代码还是出现一样的错误。
Traceback (most recent call last):
File "D:\Java\kniff\src\run.py", line 9, in <module>
executer.run(conf.MultiBrowsersDemo,testcase.validations.TestCAse001_login)
File "C:\Python27\lib\site-packages\knitter\executer.py", line 227, in handle_args
common.parse_conf_class(args[0])
File "C:\Python27\lib\site-packages\knitter\common.py", line 190, in parse_conf_class
log.step_warning("conf [%s] not found in module env." % conf)
File "C:\Python27\lib\site-packages\knitter\log.py", line 269, in step_warning
screenshot_name = "Warning__%s__%s__%s.png" % (common.stamp_datetime_coherent(), env.threadlocal.CASE_NAME, env.threadlocal.TESTING_BROWSER)
AttributeError: 'thread._local' object has no attribute 'CASE_NAME'

Henry    Blog Author  2016-01-03 10:25

试了下的确存在这个问题。原因是测试用例运行的时候才开始使用多线程。而您的代码的 conf 配置文件中,配置了一个不存在的变量,导致这个问题。修正下 conf.py 中的配置变量就可以避免这个问题了。我会在后面升级代码。谢谢!

 

 

alina   2015-10-19 11:39  在此条评论下回复 ▼ 

您好,请教一下,我在conf里面配置了BASE_URL = "http://test.com/login/",
为什么运行后,只是打开了http://test.com的页面呢?打开login页面需要再配置什么吗?

Henry    Blog Author  2015-10-19 16:45

这个问题应该不是测试框架的问题,我直接在浏览器中打开 http://test.com/login/, 地址也被重定向到了 https://www.test.com/ ,所以这应该是那个网站的 URL 配置的问题。请再看一下呢。

 

 

peter   2015-08-25 17:59  在此条评论下回复 ▼ 

大侠请问怎么在这个github下载您的源码

Henry    Blog Author  2015-08-26 13:15

在页面 https://github.com/hww712/knitter 的右下方,有个 "Download ZIP" 的链接,可以通过这里下载。或者直接使用 git 克隆整个项目到本地。

 

 

 

因为有你   2015-06-18 09:19  在此条评论下回复 ▼ 

楼主,你好。
已下载knitter,想好好研究一下框架,麻烦你也给我发一份详细的说明文档好吗?
邮箱:450869892@qq.com

Henry    Blog Author  2015-06-29 09:54

感谢关注,请参考:http://sleepycat.org/blog/39/

 

Alice   2015-06-18 09:02  在此条评论下回复 ▼ 

楼主,你好。我下了你的knitter,想好好研究一下。。麻烦你也给我发一份详细的说明文档好吗? 605585248@qq.com

Henry    Blog Author  2015-06-29 09:54

感谢关注,请参考:http://sleepycat.org/blog/39/

 

 

Kevin   2015-06-11 16:02  在此条评论下回复 ▼ 

问题已经解决
非常感谢!

Henry    Blog Author  2015-06-11 16:37

ok! :)

 

 

Kevin   2015-06-11 13:55  在此条评论下回复 ▼ 

请问一下,那个env配置文件里,DRIVER_OF_CHROME 的路径怎么写?
试了过
DRIVER_OF_CHROME = "C:\Python27\chromedriver_win32.exe"
但是依然找不到

Henry    Blog Author  2015-06-11 14:13

配置文件是单独在 conf.py 中以 class 的方式保存的,使用的时候导入相应的 class 即可。
参考例子:https://github.com/hww712/knitter/blob/master/example/demoprj/conf.py

开始运行测试程序后,会将这里的配置 class 中的参数的值赋给 knitter.env 中的对应的值。具体实现在: knitter.common.perse_conf_class(conf_class)

 

 

kaige   2015-06-09 18:03  在此条评论下回复 ▼ 

公司准备开展web自动化,刚好搜到大神的博客,knitter的代码没看懂,准备花时间好好研究一下,求一份详细一点的使用说明文档,非常感谢!xxk-student@hotmail.com

Henry    Blog Author  2015-06-11 09:11

感谢关注,已发邮件。

  2017-07-09 17:42

可以把博主发你的说明文档发我一下吗?谢谢

 

 

帅可敌国   2015-02-04 13:45  在此条评论下回复 ▼ 

你好,执行了demo的runner并没有反应:
2014/09/22 02:31 <DIR> .
2014/09/22 02:31 <DIR> ..
2015/02/04 11:38 412 conf.ini
2015/02/04 11:36 <DIR> data
2014/09/22 02:31 <DIR> drivers
2015/02/04 13:27 <DIR> page
2014/09/22 02:31 <DIR> result
2015/02/04 13:40 239 runner.py
2015/02/04 13:27 <DIR> testcase
2 个文件 651 字节
7 个目录 7,458,672,640 可用字节

E:\Cloud2\ForNew\Scripts\webpage\knitter-master\examples\DemoProject>python runn
er.py



单独执行命令行会报import error
>>> executer.run_case("demo_module", "TestCase001_Normal_Input_Test")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\knitter-0.3.3-py2.7.egg\knitter\executer.
y", line 143, in run_case
testmodule = importlib.import_module("testcase.%s" % module_name)
File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named testcase.demo_module
>>>


请问怎么解决?

Henry    Blog Author  2015-02-05 09:43

抱歉,这个的确是我的代码问题,因为以前没有在 Windows 命令行运行过测试。现在已经完成了升级,请 update 下代码,或者用 > pip install knitter --upgrade 升级一下,再试试应该就可以了。

 

发表评论

top bottom