在拜读虫师大神的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 webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import 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.driverdriver.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:Pycharm
Py:Python2.7.11"""
# -*- coding: utf-8 -*-
__Author__ = "xiewm"import time
from selenium import webdriver import HTMLTestRunner import unittest from PO_login import LoginPage class 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: filename = ‘E:\testresult.html’,如果是在windows环境,文件名要使用以下几种格式。

 ①filename = 'E:\\testresult.html’ ②filename = r'E:\testresult.html'  ③filename = 'E:/testresult.html' 

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

fp = open(filename, 'wb')
fp.close()

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下。

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

python Login.py

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

【我的栗子】

#栗子 生成测试报告:test_one.py

import HTMLTestRunnerfrom selenium.webdriver.common.by import  Byfrom selenium import webdriverimport unittest,time,os,sys

class Baidu(unittest.TestCase):    def setUp(self):        self.driver = webdriver.Chrome()        self.driver.implicitly_wait(10)        self.base_url = 'http://www.baidu.com/'        self.verificationsErrors = []

    def test_baidu_search(self):        '''百度搜索测试用例'''        driver = self.driver        driver.get(self.base_url)        driver.find_element(By.ID,'kw').send_keys('HTMLTestRunner')        driver.find_element(By.ID,'su').click()

    def tearDown(self):        self.driver.quit()        self.assertEqual([],self.verificationsErrors)

"""

if __name__ == '__main__':

    date = time.strftime("%Y%m%d")    time = time.strftime('%Y%m%d%H%M%S')    path = 'E:/Python/' + date + '/login/' + time + '/'    report_path = path + 'report.html'    if not os.path.exists(path):        os.makedirs(path)    else:        pass

    # 测试套件    testunit = unittest.TestSuite()    #添加测试用例到测试套件中    testunit.addTest(Baidu('test_baidu_search'))    #定义测试报告存放路径

    #定义测试报告    with open(report_path,'wb') as report:        runner = HTMLTestRunner.HTMLTestRunner(stream=report, title='百度搜索测试报告', description='用例执行情况:')        runner.run(testunit)"""

栗子:加入testSuite的测试报告:__init__.py
import unittestimport sys,time,osimport HTMLTestRunnersys.path.append('C:/Users/wangxue1/PycharmProjects/selenium2TestOne/Senior_test')import test_one

#构造测试集def creatsuite():    testunit = unittest.TestSuite()    #定义测试文件查找的目录    test_dir = 'C:/Users/wangxue1/PycharmProjects/selenium2TestOne/Senior_test'    #定义discover方法的参数    discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py',top_level_dir=None)    #discover方法筛选出来的用例,循环添加到测试套件中    for test_case in discover:        print(test_case)        testunit.addTest(test_case)    return testunit

if __name__ == '__main__':    now = time.strftime('%Y-%m-%d %H_%M_%S')    path = 'E:\\selenium\\report\\' + now + '\\'    report_path = path + 'result.html'    if not os.path.exists(path):        os.makedirs(path)    else:        pass    with open(report_path,'wb') as report:        runner = HTMLTestRunner.HTMLTestRunner(stream=report, title='百度搜索测试报告', description='用例执行情况:')        alltestnames = creatsuite()        runner.run(alltestnames)        report.close()

# 栗子 定时任务
import os,time

k=1while k<2:    now_time = time.strftime('%H_%M')    if now_time == '16_54':        print('开始运行脚本')        os.chdir('C:/Users/wangxue1/PycharmProjects/selenium2TestOne/Senior_test')        os.system('python __init__.py')        print('运行完成退出')        break    else:        time.sleep(10)        print(now_time)

#cmd 运行这个脚本#【结果】

# 栗子  不带附件的

from smtplib import SMTPfrom email.mime.text import MIMETextfrom email.header import Header

def send_email(SMTP_host, from_addr, password, to_addrs, subject, content):    email_client = SMTP(SMTP_host)    email_client.login(from_addr, password)    # create msg    #msg = MIMEText(content,'plain','utf-8')    msg = MIMEText('<html><h1>你好!</h1></html>', 'html', 'utf-8')    msg['Subject'] = Header(subject, 'utf-8')#subject    msg['From'] = from_addr    msg['To'] = to_addrs    email_client.sendmail(from_addr, to_addrs, msg.as_string())

    email_client.quit()

if __name__ == "__main__":    send_email("smtp.163.com","###@163.com","#######","#######@162.com","etty","etty")

#栗子  带附件
from email.mime.multipart import MIMEMultipartfrom smtplib import SMTPfrom email.mime.text import MIMETextfrom email.mime.application import MIMEApplication

def send_email(SMTP_host, from_addr, password, to_addrs,subject,content):    email_client = SMTP(SMTP_host)    email_client.login(from_addr, password)    msgtext = MIMEText(content, 'plain', 'utf-8')    msg = MIMEMultipart('related')    msg['Subject'] = subject    msg.attach(msgtext)    msg['From'] = from_addr    msg['To'] = to_addrs    att = MIMEApplication(open('C:\\Users\\wangxue1\\PycharmProjects\\selenium2TestOne\\Senior_test\\34.txt', 'rb').read())    att.add_header('Content-Disposition', 'attachment', filename='C:\\Users\\wangxue1\\PycharmProjects\\selenium2TestOne\\Senior_test\\34.txt')    msg.attach(att)    email_client.sendmail(from_addr, to_addrs, msg.as_string())    email_client.quit()

if __name__ == "__main__":    send_email("############","公司邮箱","####",','.join(['########@qq.com']),'ettywxue','ettywxue')【备注】163邮箱总是被当作垃圾邮件 554  详情参见 http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

# 栗子  综合  all_test.py
import unittestimport sys,time,osimport HTMLTestRunnersys.path.append('C:/Users/wangxue1/PycharmProjects/selenium2TestOne')import unittestTest.public.login as loginimport Senior_test.test_oneimport smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.mime.application import  MIMEApplication

#发送邮件def send_mail(file_new):    # 发送邮箱    mail_from = '#########'    # 收信邮箱    mail_to = ','.join(['#########'])    # 定义正文    f = open(file_new,'rb')    mail_body = f.read()    f.close()    msg = MIMEMultipart('related')    msg['Subject'] = u'自动化测试报告'    msg['date'] = time.strftime('%a, %d %b %Y %H:%M:%S %z')    msgText = MIMEText(mail_body, 'html', 'utf-8')    msg.attach(msgText)    att = MIMEApplication(open('C:\\Users\\wangxue1\\PycharmProjects\\selenium2TestOne\\Senior_test\\34.txt', 'rb').read())    att.add_header('Content-Disposition','attachment',filename='C:\\Users\\wangxue1\\PycharmProjects\\selenium2TestOne\\Senior_test\\34.txt')    msg.attach(att)    smtp=smtplib.SMTP()    smtp.connect('smtp.##########.net')    #用户名、密码    smtp.login('###########','########')    smtp.sendmail(mail_from,mail_to,msg.as_string())    smtp.quit()    print('email has send out!')

#===========================查找测试报告目录,找到最新生成的测试报告文件======================def send_report(testreport):    result_dir = testreport    lists = os.listdir(result_dir)    lists.sort(key=lambda fn:os.path.getmtime(result_dir + '\\' + fn))    #找到最新生成的文件    file_new = os.path.join(result_dir,lists[-1])    print(file_new)    #调用发邮件模块    send_mail(file_new)

#=============================添加用例到测试套件=======================================def creatsuite():    testunit = unittest.TestSuite()    #定义测试文件查找的目录    test_dir = 'C:/Users/wangxue1/PycharmProjects/selenium2TestOne/unittestTest'    #定义discover方法的参数    discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py',top_level_dir=None)    for test_case in discover:        print(test_case)        testunit.addTests(test_case)    return testunit

if __name__ == '__main__':    now = time.strftime('%Y-%m-%d %H_%M_%S')    testreport = 'E:\\selenium2\\report\\' + now + '\\'    filename = testreport + 'report.html'    if not os.path.exists(testreport):        os.makedirs(testreport)    else:        pass    with open(filename,'wb') as report:        runner = HTMLTestRunner.HTMLTestRunner(stream=report,title=u'自动化测试报告',description=u'用例执行情况: ')        alltestnames = creatsuite()        runner.run(alltestnames)    send_report(testreport)


转载于:https://www.cnblogs.com/suren2017/p/8297112.html

【Selenium2】【HTMLTestRunner】相关推荐

  1. 【快速上手mac必备】常用优质mac软件推荐(音视频、办公、软件开发、辅助工具、系统管理、云存储)

    本文章的主要内容是我作为一名大四学生.准程序员.up主这三种身份来给大家推荐一下 mac 上好用的软件以及工具.本人也是从去年9月份开始从windows阵营转移到了mac阵营,刚开始使用的时候,也曾主 ...

  2. 【bzoj 1833】【codevs 1359】 [ZJOI2010]count 数字计数(数位dp)

    1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MB Submit: 2774  Solved: 1230 [Submit ...

  3. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  4. (四)Asp.net web api中的坑-【api的返回值】

    (四)Asp.net web api中的坑-[api的返回值] 原文:(四)Asp.net web api中的坑-[api的返回值] void无返回值 IHttpActionResult HttpRe ...

  5. 【C++】【九】栈的应用

    [C++][九]栈的应用 就近匹配原理及其步骤: 中缀转后缀:

  6. 【跃迁之路】【495天】程序员高效学习方法论探索系列(实验阶段252-2018.06.15)...

    @(跃迁之路)专栏 实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. ...

  7. (10)Spring Boot修改端口号【从零开始学Spring Boot】

    Spring boot 默认端口是8080,如果想要进行更改的话,只需要修改applicatoin.properties文件,在配置文件中加入: server.port=9090 常用配置: #### ...

  8. 【跃迁之路】【725天】程序员高效学习方法论探索系列(实验阶段482-2019.2.15)...

    实验说明 从2017.10.6起,开启这个系列,目标只有一个:探索新的学习方法,实现跃迁式成长 实验期2年(2017.10.06 - 2019.10.06) 我将以自己为实验对象. 我将开源我的学习方 ...

  9. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  10. 【跃迁之路】【554天】程序员高效学习方法论探索系列(实验阶段311-2018.08.13)...

    @(跃迁之路)专栏 [跃迁之路]奖励金计划正式开始 从2018.7.1起,[跃迁之路]奖励金计划正式起航,从今以后,, 每月1日,我会将自己个人上月收入的1%计入[跃迁之路]奖励金池,积累到足够金额后 ...

最新文章

  1. R可视化多元线性回归模型
  2. c# Invoke和BeginInvoke 区别
  3. 保护眼睛的电脑设置_干货,怎么设置显示器,才能保护好我们的眼睛?
  4. 如何在html文件中包含其他html文件
  5. Python3解析XML文件(xml.etree.ElementTree)——以简单网络爬虫为例
  6. 禅道的安装与简单使用
  7. laravel 5 自定义全局函数,怎么弄呢?
  8. 工程数学(数值分析)第四讲:插值逼近
  9. Openstack api 使用方法
  10. Springboot中使用JWT
  11. 图解设计模式:行为型模式之责任链模式
  12. 人工智能在电力行业的应用,电力人工智能技术
  13. 会员制玩法解说 JAVA会员制商城系统开发
  14. 反激开关电源变压器设计实例讲解(定明芳)
  15. 传统蓝牙HCI搜索流程介绍(bluetooth inquiry)
  16. unity隐藏鼠标光标的2种方法
  17. 忘记ISO-8859-1
  18. ffmpeg 音频合并
  19. 数字全角转半角VBA
  20. element+后台管理系统数据导出为excel+进度条导出

热门文章

  1. lol游戏挂机软件_“本不想挂机,但系统不让重连!”LOL成“挂机联盟”,5局3挂机...
  2. 父shell和子shell
  3. vue3 Vite 2.0 Vue-Router 4.0 TypeScript elementPlus admin 须弥戒后台案例小结
  4. Java 匿名内部类、Java 中 == 与 equals 的区别
  5. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_15-webpack研究-webpack-dev-server-程序调试...
  6. Python3初级知识整理
  7. 剑指offer-数值的整数次方
  8. [LeetCode]168. Excel Sheet Column Title
  9. bzoj1043 下落的圆盘
  10. [bzoj1066] [SCOI2007]蜥蜴