Python HTMLTestRunner生成网页自动化测试报告时中文编码报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6
1. 由于使用Python Selenium做网页自动化测试时,有截取网页上的中文信息保存到测试结果中,最终出现编码错误如下:
File "D:/PycharmProjects/AutoTest/TestZone/RunTest.py", line 25, in <module>
runner.run(discover)
File "D:\PycharmProjects\AutoTest\Base\HTMLTestRunner.py", line 631, in run
self.generateReport(test, result)
File "D:\PycharmProjects\AutoTest\Base\HTMLTestRunner.py", line 678, in generateReport
report = self._generate_report(result)
File "D:\PycharmProjects\AutoTest\Base\HTMLTestRunner.py", line 745, in _generate_report
test_list = ''.join(rows),
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 84: ordinal not in range(128)
2. 百度了多种方案,通过设置默认的编码格式可解决,通过如下代码:
1 import sys 2 reload(sys) 3 sys.setdefaultencoding('utf-8')
设置默认编码的时候可能提示sys模块不存在'setdefaultencoding'
sys.setdefaultencoding('utf-8')
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
这是因为python2.5以后的版本已经移除了'setdefaultencoding',通过reload(sys)即可重新加载出'setdefaultencoding'。
3. 问题原因:
Pyhton2.x版本中,默认情况下,Python采用的是ascii编码方式,如下所示:
而Python在进行编码方式之间的转换时,会将 unicode 作为“中间编码”,但 unicode 最大长度为 128 ,
当尝试将 ascii 编码字符串转换成"中间编码" unicode 时,如果字符串超出了其范围,就抛出了如上错误。