分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 前端开发

【Selenium2】【HTMLTestRunner】

发布时间:2023-09-06 01:36责任编辑:苏小强关键词:HTML

  在拜读虫师大神的Selenium2+Python2.7时,发现生成HTMLTestRunner的测试报告使用的HTMLTestRunner的模块是用的Python2的语法。而我本人比较习惯与Python3。而且自己也是用的Python3.4的环境,在网上找了很多资料,修改了下HTMLTestRunner.py

参考:http://bbs.chinaunix.net/thread-4154743-1-1.html

下载地址:http://tungwaiyip.info/software/HTMLTestRunner.html

修改后下载地址:http://pan.baidu.com/s/1tp3Ts?

修改汇总:

第94行,将import StringIO修改成import io

第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO()

第642行,将if not rmap.has_key(cls):修改成if not cls in rmap:

第766行,将uo = o.decode(‘latin-1‘)修改成uo = e

第775行,将ue = e.decode(‘latin-1‘)修改成ue = e

第631行,将print >> sys.stderr, ‘\nTime Elapsed: %s‘ % (self.stopTime-self.startTime)修改成print(sys.stderr, ‘\nTime Elapsed: %s‘ % (self.stopTime-self.startTime))

在Python3.4下使用HTMLTestRunner,开始时,引入HTMLTestRunner模块报错。

在HTMLTestRunner的94行中,是使用的StringIO,但是Python3中,已经没有StringIO了。取而代之的是io.StringIO。所以将此行修改成import io

在HTMLTestRunner的539行中,self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer = io.StringIO()

修改以后,成功引入模块了

执行脚本代码:

# -*- coding: utf-8 -*-#引入webdriver和unittest所需要的包from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support.ui import Selectfrom selenium.common.exceptions import NoSuchElementExceptionfrom selenium.common.exceptions import NoAlertPresentExceptionimport unittest, time, re#引入HTMLTestRunner包import HTMLTestRunner ??class Baidu(unittest.TestCase): ???#初始化设置 ???def setUp(self): ???????self.driver = webdriver.Firefox() ???????self.driver.implicitly_wait(30) ???????self.base_url = "http://www.baidu.com/" ???????self.verificationErrors = [] ???????self.accept_next_alert = True ???????#百度搜索用例 ???def test_baidu(self): ???????driver = self.driver ???????driver.get(self.base_url) ???????driver.find_element_by_id("kw").click() ???????driver.find_element_by_id("kw").clear() ???????driver.find_element_by_id("kw").send_keys("Selenium Webdriver") ???????driver.find_element_by_id("su").click() ???????time.sleep(2) ???????driver.close() ???def tearDown(self): ???????self.driver.quit() ???????self.assertEqual([], self.verificationErrors)if __name__ == "__main__": ???#定义一个测试容器 ???test = unittest.TestSuite() ???#将测试用例,加入到测试容器中 ???test.addTest(Baidu("test_baidu")) ???#定义个报告存放的路径,支持相对路径 ???file_path = "F:\\RobotTest\\result.html" ???file_result= open(file_path, ‘wb‘) ???#定义测试报告 ???runner = HTMLTestRunner.HTMLTestRunner(stream = file_result, title = u"百度搜索测试报告", description = u"用例执行情况") ???#运行测试用例 ???runner.run(test) ???file_result.close()

运行测试脚本后,发现报错:

File "C:\Python34\lib\HTMLTestRunner.py", line 642, in sortResult

if not rmap.has_key(cls):

所以前往642行修改代码:

运行后继续报错:

AttributeError: ‘str‘ object has no attribute ‘decode‘

前往766, 772行继续修改(注意:766行是uo而772行是ue,当时眼瞎,没有注意到这些,以为是一样的,导致报了一些莫名其妙的错误,折腾的半天):

修改后运行,发现又报错:

File "C:\Python34\lib\HTMLTestRunner.py", line 631, in run

print >> sys.stderr, ‘\nTime Elapsed: %s‘ % (self.stopTime-self.startTime)

TypeError: unsupported operand type(s) for >>: ‘builtin_function_or_method‘ and ‘_io.TextIOWrapper‘

前往631查看,发现整个程序中,唯一一个print:

print >> sys.stderr, ‘\nTime Elapsed: %s‘ % (self.stopTime-self.startTime

这个是2.x的写法,咱们修改成3.x的print,修改如下:

print(sys.stderr, ‘\nTime Elapsed: %s‘ % (self.stopTime-self.startTime))

继续运行脚本,OK运行成功

查看指定的目录生成了result.html

点击打开报告:

【常见问题】

1. 不生成测试报告

解决办法:

使用Python ,HTMLTestRunner 生成测试报告时,遇到很奇怪的问题,明明运行的结果,没有任何报错,就是不生成测试报告,纠结好久。google+baidu搜索结果也不满意,最后终于解决,先总结下。

代码示例 
Login.py

"""OS:W7 64位IDE:PycharmPy:Python2.7.11"""# -*- coding: utf-8 -*-__Author__ = "xiewm"import timefrom selenium import webdriverimport HTMLTestRunnerimport unittestfrom PO_login import LoginPageclass Login(unittest.TestCase): ???def setUp(self): ???????self.driver = webdriver.Firefox() ???????self.username = ‘xxxxx‘ ???????self.password = ‘xxxxx‘ ???def test_user_login(self): ???????driver = self.driver ???????username = self.username ???????password = self.password ???????login_page = LoginPage(driver) ???????login_page.open() ???????login_page.type_username(username) ???????login_page.type_password(password) ???????login_page.submit() ???????time.sleep(3) ???def tearDown(self): ???????self.driver.quit()if __name__ == ‘__main__‘: ???suite = unittest.TestSuite() ???suite.addTest(Login(‘test_user_login‘)) ???filename = ‘E:\\testresult.html‘ ???with open(filename, ‘wb‘) as fp: ???????runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u‘测试报告‘, description=u‘用例执行详情:‘) ???????runner.run(suite)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

解决方法

1: filename = ‘E:\testresult.html’,如果是在windows环境,文件名要使用以下几种格式。

 ①filename = ‘E:\\testresult.html’ ?②filename = r‘E:\testresult.html‘ ??③filename = ‘E:/testresult.html‘ ?
  • 1
  • 2
  • 3

2:若不是使用with做文件的上下文管理,记得要fp.close() 关闭打开的文件,才可以保存。

fp = open(filename, ‘wb‘)fp.close()
  • 1
  • 2

3:第三种就奇葩了,看截图(截图为同一代码)(Pycharm IDE) 
图一 

图二 

如果是以图一方式运行,就不会有报告生成,至于原因,可能是因为if name == ‘main‘。的原因


2016年11月25日09:01:08,大概知道什么原因了,因为Pycharm 自带测试框架,在右上角, 点击Edit Configurations→Python tests→选中你要删除的项目删除,这样就不会自动执行unittest。


4:又遇到一种情况,按照以上3个方法都不行,使用快捷键:Ctrl+shift+F10 还是无法生成report,最后在pycharm的右上角,发现了一个按钮(shift + F9)如图 
 
这样就可以运行了,⊙﹏⊙b汗。(前提是必须在Edit Configurations 中配置好,你需要运行的.py Script Path 的文件路径)

如下图配置。


5:又遇到无法生成测试报告的问题了,按照之前总结的各种方法还是不行,最后,原来就仅仅修改一行代码就可以 了,在此记录下。

#原 if __name__ == ‘__main__‘:if __name__ == ‘interface_demo‘:# 把main修改成自己的文件夹名就可以了至于if__name__ == ‘__main__‘ ?的作用,google下。
  • 1
  • 2
  • 3
  • 4
  • 5

6: 如果还是不行的话,换个IDE(例如Atom Eclipse ) or 直接在cmd 中运行

python Login.py

就总结这么多。以上几种方法应该可以解决大部分的问题,如果有遇到其他的情况,也会继续总结

【Selenium2】【HTMLTestRunner】

原文地址:https://www.cnblogs.com/suren2017/p/8297112.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved