Selenium基本使用(十二)测试报告生成
报告目录结构

Reporter根目录
|
|-------------LOGS
| |
| 2017-09-21_12-34-39 每次按日期时间动态生成报告目录
| |
| Image 用于存储每个功能点,验证截图,这个会显示在报告上
|
|--- LOG.XSLT #报告样式及格式
1、使用xslt,来设定样式
<?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/">
<html>
<Head>
<style type="text/css"> body {
background:#fff;
margin:0;
padding:40px 20px;
font-family: "Arial", Arial, Sans-serif;
font-size: 16px;
color:#000;
} table {
margin:5px 5px 0;
border:0px solid #222;
font-size: 0.8em;
} td {
margin:5px 5px 0;
padding:10px 10px 10px 10px;
vertical-align:text-top;
border:1px solid #222;
border-width:1px 1px 1px 1px;
} td.light {
border:0px solid #222;
} td.number {
text-align:right;
} td.status {
text-align:right;
vertical-align:text-bottom;
} </style> </Head>
<body>
<!--OVER RESULT -->
<xsl:variable name="OVER_STATUS" select="REPORT/OVER_STATUS"/>
<xsl:variable name="STATUS" select="REPORT/LOG_ENTRY/STATUS"/> <h2>自动化测试执行报告</h2>
<!--table -->
<table border="1">
<!--all result value-->
<tr bgcolor="white" height = "35">
<td>Overall Test Result</td>
<td><xsl:value-of select="$OVER_STATUS"/></td>
<td colspan="8"> </td>
</tr> <tr bgcolor="#D8BFD9" height = "35">
<th>Step</th>
<th>Execute Time</th>
<th>Step Result</th>
<th>Description</th>
<th>Step Description</th>
<th>Action</th>
<th>Index</th>
<th>Element</th>
<th>Value</th>
<th>Expected Results </th>
</tr> <!--select font color -->
<xsl:variable name="fontColor">
<xsl:choose>
<xsl:when test="$STATUS = FAILED or $STATUS = PASSED">
<xsl:text>white</xsl:text>
</xsl:when>
<xsl:otherwise>black</xsl:otherwise>
</xsl:choose>
</xsl:variable> <!-- Compute the background color according to the overall test result -->
<xsl:variable name="StatusBackgroundColor">
<xsl:choose>
<xsl:when test="$STATUS = 'FAILED'">
<!--<xsl:text>rgb(158, 48, 57)</xsl:text> -->
<xsl:text>rgb(255, 40, 38)</xsl:text>
</xsl:when>
<xsl:when test="$STATUS = 'WARNING'">
<xsl:text>rgb(132, 76, 84)</xsl:text>
</xsl:when>
<xsl:when test="$STATUS = 'PASSED'">
<xsl:text>rgb(121, 180, 112)</xsl:text>
</xsl:when>
<xsl:when test="$STATUS = 'DONE'">
<xsl:text>white</xsl:text>
</xsl:when>
<xsl:when test="$STATUS = 'INFO'">
<xsl:text>white</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>white</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable> <!--log entry-->
<xsl:for-each select = "REPORT/LOG_ENTRY"> <tr>
<td><xsl:value-of select="STEP"/></td>
<td><xsl:value-of select="EXECUTION_TIME"/></td>
<td bgcolor="{$StatusBackgroundColor}"><xsl:value-of select="STEP_RESULT"/></td>
<td><xsl:value-of select="DESCRIPTION"/></td>
<td><xsl:value-of select="STEP_DESCRIPTION"/></td>
<td><xsl:value-of select="ACTION"/></td>
<td><xsl:value-of select="INDEX"/></td>
<td><xsl:value-of select="ELEMENT"/></td>
<td><xsl:value-of select="VALUE"/></td>
<td><xsl:value-of select="EXPECTED_RESULTS"/></td>
</tr>
<!-- Store image path -->
<xsl:variable name="Image">
<xsl:value-of select="IMAGE_PATH"/>
</xsl:variable>
<!-- If XML contains an image path then display it according to the following -->
<xsl:choose>
<xsl:when test="normalize-space($Image)!=''">
<!-- Comment the Next line to Stop showing embedded image in log and change the width number to make image size change-->
<tr>
<td colspan="10">
<a href="{$Image}" target="_blank" >
<img src="{$Image}" width="300"></img>
</a>
</td>
</tr>
</xsl:when>
</xsl:choose>
</xsl:for-each> <tr bgcolor="white">
<font color="{$fontColor}">
<td colspan="10">Overall Test Result: <xsl:value-of select="$OVER_STATUS"/></td>
</font>
</tr>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
2、生成xml报告(python代码会自动生成)
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="../../LOG.XSLT" type="text/xsl"?>
<REPORT>
<OVER_STATUS>PASSED</OVER_STATUS>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>2</STEP>
<EXECUTION_TIME>2017-09-21_12-34-47</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION>普惠家登录</DESCRIPTION>
<STEP_DESCRIPTION>输入'用户名'</STEP_DESCRIPTION>
<ACTION>input</ACTION>
<INDEX>By.XPATH</INDEX>
<ELEMENT>//Input[@id='userName']</ELEMENT>
<VALUE>msh195</VALUE>
<EXPECTED_RESULTS></EXPECTED_RESULTS>
<IMAGE_PATH></IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>3</STEP>
<EXECUTION_TIME>2017-09-21_12-34-48</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION></DESCRIPTION>
<STEP_DESCRIPTION>输入'密码'</STEP_DESCRIPTION>
<ACTION>input</ACTION>
<INDEX>By.XPATH</INDEX>
<ELEMENT>//Input[@id='password']</ELEMENT>
<VALUE>112233</VALUE>
<EXPECTED_RESULTS></EXPECTED_RESULTS>
<IMAGE_PATH></IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>4</STEP>
<EXECUTION_TIME>2017-09-21_12-34-56</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION></DESCRIPTION>
<STEP_DESCRIPTION>单击'立即登录'</STEP_DESCRIPTION>
<ACTION>click</ACTION>
<INDEX>By.LINK_TEXT</INDEX>
<ELEMENT>立即登录</ELEMENT>
<VALUE></VALUE>
<EXPECTED_RESULTS></EXPECTED_RESULTS>
<IMAGE_PATH></IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>5</STEP>
<EXECUTION_TIME>2017-09-21_12-34-56</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION></DESCRIPTION>
<STEP_DESCRIPTION>‘我的帐户’是否存在</STEP_DESCRIPTION>
<ACTION>verify</ACTION>
<INDEX>By.LINK_TEXT</INDEX>
<ELEMENT>我的账户</ELEMENT>
<VALUE></VALUE>
<EXPECTED_RESULTS>登录成功,显示登录后页面</EXPECTED_RESULTS>
<IMAGE_PATH>D:\PHJ\Reporter\LOGS\2017-09-21_12-34-39\Image\image_2017-09-21_12-34-56.png</IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>6</STEP>
<EXECUTION_TIME>2017-09-21_12-34-59</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION>正常充值</DESCRIPTION>
<STEP_DESCRIPTION>单击'充值'</STEP_DESCRIPTION>
<ACTION>click</ACTION>
<INDEX>By.XPATH</INDEX>
<ELEMENT>//div[@class='account_center_tips_div_4 fl']/input</ELEMENT>
<VALUE></VALUE>
<EXPECTED_RESULTS></EXPECTED_RESULTS>
<IMAGE_PATH></IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>7</STEP>
<EXECUTION_TIME>2017-09-21_12-34-59</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION></DESCRIPTION>
<STEP_DESCRIPTION>‘充值记录’是否存在</STEP_DESCRIPTION>
<ACTION>verify</ACTION>
<INDEX>By.LINK_TEXT</INDEX>
<ELEMENT>充值记录</ELEMENT>
<VALUE></VALUE>
<EXPECTED_RESULTS>进入'充值页面',存在充值记录链接</EXPECTED_RESULTS>
<IMAGE_PATH>D:\PHJ\Reporter\LOGS\2017-09-21_12-34-39\Image\image_2017-09-21_12-34-59.png</IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>8</STEP>
<EXECUTION_TIME>2017-09-21_12-35-00</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION></DESCRIPTION>
<STEP_DESCRIPTION>选择‘充值方式'绑定支付</STEP_DESCRIPTION>
<ACTION>click</ACTION>
<INDEX>By.ID</INDEX>
<ELEMENT>rapid</ELEMENT>
<VALUE></VALUE>
<EXPECTED_RESULTS></EXPECTED_RESULTS>
<IMAGE_PATH></IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>9</STEP>
<EXECUTION_TIME>2017-09-21_12-35-02</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION></DESCRIPTION>
<STEP_DESCRIPTION>输入‘金额’</STEP_DESCRIPTION>
<ACTION>input</ACTION>
<INDEX>By.ID</INDEX>
<ELEMENT>recharge_money</ELEMENT>
<VALUE>100</VALUE>
<EXPECTED_RESULTS></EXPECTED_RESULTS>
<IMAGE_PATH></IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>10</STEP>
<EXECUTION_TIME>2017-09-21_12-35-03</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION></DESCRIPTION>
<STEP_DESCRIPTION>单击‘确认充值’</STEP_DESCRIPTION>
<ACTION>click</ACTION>
<INDEX>By.LINK_TEXT</INDEX>
<ELEMENT>确认充值</ELEMENT>
<VALUE></VALUE>
<EXPECTED_RESULTS></EXPECTED_RESULTS>
<IMAGE_PATH></IMAGE_PATH>
</LOG_ENTRY>
<LOG_ENTRY>
<STATUS>PASSED</STATUS>
<STEP>11</STEP>
<EXECUTION_TIME>2017-09-21_12-35-05</EXECUTION_TIME>
<STEP_RESULT>PASSED</STEP_RESULT>
<DESCRIPTION></DESCRIPTION>
<STEP_DESCRIPTION>充值结果'对话框是否存在</STEP_DESCRIPTION>
<ACTION>verify</ACTION>
<INDEX>By.LINK_TEXT</INDEX>
<ELEMENT>充值完成</ELEMENT>
<VALUE></VALUE>
<EXPECTED_RESULTS>弹出'充值结果'对话框,存在充值完成链接</EXPECTED_RESULTS>
<IMAGE_PATH>D:\PHJ\Reporter\LOGS\2017-09-21_12-34-39\Image\image_2017-09-21_12-35-05.png</IMAGE_PATH>
</LOG_ENTRY>
</REPORT>
3、python生成报告代码
#*_*coding:utf-8*_* import xml.dom.minidom as xmlDoc
import os
import gl
import sys
import time class cREPORTXML(object):
def __init__(self):
self.__struct = self.createReportNode() #创建report节点
def createReportNode(self):
try:
xmlD = xmlDoc.Document() #xml样式
xlstNode = xmlD.createProcessingInstruction("xml-stylesheet","href=\"../../LOG.XSLT\" type=\"text/xsl\"")
xmlD.appendChild(xlstNode) report = xmlD.createElement('REPORT')
xmlD.appendChild(report) overStatus = xmlD.createElement('OVER_STATUS')
overStatus.appendChild(xmlD.createTextNode('PASSED'))
report.appendChild(overStatus) returnResult = []
returnResult.append(xmlD)
returnResult.append(report)
returnResult.append(overStatus) except Exception,ex:
return ex.message
return returnResult def writeOverStatus(self,overStatus = 'PASSED'):
self.__struct[2]._get_childNodes().item(0).nodeValue = overStatus def writeReport(self,dict,xmlPath):
#reportNodeList = self.createReportNode() entry = self.createLogEntry(self.__struct[0],dict)
self.__struct[1].appendChild(entry) self.writeXml(self.__struct[0],xmlPath + r'\reportLog.xml')
#self.writeXml(self.__struct[0],gl.reporterPath+'reportxml_%s.xml'%(gl.curTimeStr)) #-------------创建xml格式-有多个相同的节点,并且该节点下有4个名称相同的子节点----------------
#createLogEntry(self,docObj,executeTime,stepResult,description,stepDiscription,action,index,element,value,expectResult):
def createLogEntry(self,docObj,dict):
entry = docObj.createElement("LOG_ENTRY") status = docObj.createElement("STATUS")
nodeStep = docObj.createElement("STEP")
nodeExecuteTime = docObj.createElement("EXECUTION_TIME")
nodeStepResult = docObj.createElement("STEP_RESULT")
nodeComponentName = docObj.createElement("DESCRIPTION")
nodeStepDiscription = docObj.createElement("STEP_DESCRIPTION")
nodeActin = docObj.createElement("ACTION")
nodeIndex = docObj.createElement("INDEX")
nodeElement = docObj.createElement("ELEMENT")
nodeValue = docObj.createElement("VALUE")
nodeExpectResult = docObj.createElement("EXPECTED_RESULTS")
nodeimagePath = docObj.createElement('IMAGE_PATH') status.appendChild(docObj.createTextNode(dict['stepResult'])) nodeStep.appendChild(docObj.createTextNode(str(dict['Step'])))
nodeExecuteTime.appendChild(docObj.createTextNode(dict['executeTime']))
nodeStepResult.appendChild(docObj.createTextNode(dict['stepResult']))
nodeComponentName.appendChild(docObj.createTextNode(dict['description']))
nodeStepDiscription.appendChild(docObj.createTextNode(dict['stepDiscription']))
nodeActin.appendChild(docObj.createTextNode(dict['action']))
nodeIndex.appendChild(docObj.createTextNode(dict['index']))
nodeElement.appendChild(docObj.createTextNode(dict['element']))
nodeValue.appendChild(docObj.createTextNode(dict['value']))
nodeExpectResult.appendChild(docObj.createTextNode(dict['expectResult']))
nodeimagePath.appendChild(docObj.createTextNode(dict['ImagePath'])) entry.appendChild(status)
entry.appendChild(nodeStep)
entry.appendChild(nodeExecuteTime)
entry.appendChild(nodeStepResult)
entry.appendChild(nodeComponentName)
entry.appendChild(nodeStepDiscription)
entry.appendChild(nodeActin)
entry.appendChild(nodeIndex)
entry.appendChild(nodeElement)
entry.appendChild(nodeValue)
entry.appendChild(nodeExpectResult)
entry.appendChild(nodeimagePath)
return entry #参数,xml对象,准备存储xml文件路径,文件模式:读 and 写 (r and w)
def writeXml(self,xmlDoc,xmlPath):
f = open(xmlPath,"w")
xmlDoc.writexml(f,indent='\t', addindent='\t', newl='\n', encoding="utf-8")
f.close()
4、生成效果(报告内显示图片,点击会显示大图)

Selenium基本使用(十二)测试报告生成的更多相关文章
- selenium python (十二)下拉框的处理
#!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #下拉框在web页面上非常常见,对于下拉框的处理采用二次定位的方法进行元 ...
- Python+Selenium笔记(十二):数据驱动测试
(一) 前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化.(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二) ddt 使用ddt执行数据驱动测试,ddt库可以将测试 ...
- Pytest学习(十二)-生成HTML报告插件之pytest-html的使用
环境前提 Python3.6+ 安装插件 pip3 install pytest-html -i http://pypi.douban.com/simple/ --trusted-host pypi. ...
- TensorFlow从1到2(十二)生成对抗网络GAN和图片自动生成
生成对抗网络的概念 上一篇中介绍的VAE自动编码器具备了一定程度的创造特征,能够"无中生有"的由一组随机数向量生成手写字符的图片. 这个"创造能力"我们在模型中 ...
- Selenium系列(十二) - 自动化必备知识之CSS选择器的详细使用
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- selenium 自动化测试 测试报告 生成
https://www.cnblogs.com/yoyoketang/p/6140439.html https://www.cnblogs.com/testyao/p/5658200.html 一.下 ...
- 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单
阅读目录 前言 解决数据一致性的方案 回到DDD 设计 实现 结语 一.前言 之前的十一篇把用户购买商品并提交订单整个流程上的中间环节都过了一遍.现在来到了这最后一个环节,提交订单.单从业务上看,这个 ...
- Java进阶(五十二)利用LOG4J生成服务日志
Java进阶(五十二)利用LOG4J生成服务日志 前言 由于论文写作需求,需要进行流程挖掘.前提是需要有真实的事件日志数据.真实的事件日志数据可以用来发现.监控和提升业务流程. 为了获得真实的事件日志 ...
- 爬虫系列(十二) selenium的基本使用
一.selenium 简介 随着网络技术的发展,目前大部分网站都采用动态加载技术,常见的有 JavaScript 动态渲染和 Ajax 动态加载 对于爬取这些网站,一般有两种思路: 分析 Ajax 请 ...
随机推荐
- 阿里云不同账号之间相同地域的VPC网络互访
今天实际操作了一下,在这篇随笔中记录一下以备忘,主要参考阿里云帮助文档-不同账号下专有网络内网互通. 实现场景:账号A的VPC网络中的ECS访问账号B的VPC网络中的ECS与RDS(地域都在华东1), ...
- JS BOM DOM对象 select联动 计时器 时间 css操作 节点(标签 ) 查找标签 {前端基础之BOM和DOM}
前端基础之BOM和DOM 前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我 ...
- tensoflow模型中提示:ValueError: Variable rnn/basic_rnn_cell/kernel already exists, disallowed. Did you mean to set reuse=True or reuse=tf.AUTO_REUSE in VarScope? 解决办法
在利用tensorflow框架进行模型训练的时候,有时我们需要多次训练对结果求均值来得到一个均衡的评测结论.比如训练十次求平均值.但是tf的本质就是图,当变量第一次定义使用后,第二次再使用就是提示: ...
- 远程登录oracle 12.2数据库报错ORA-28040解决办法
今天新安装的oracle 12.2.0.1数据库,通过本地sqlplus远程登录12c数据库报错ora-28040,如下: ORA-28040: No matching authentication ...
- 解决sudo: npm: command not found
sudo ln -s /opt/node-v11.4.0/bin/npm /usr/bin/npm sudo ln -s /opt/node-v11.4.0/bin/node /usr/bin/nod ...
- AlphaRacks 2018年黑五 VPS $3.99/年
发现这么久了这些链接还是能购买.算是捡了便宜了. 搭建shadowsocks非常合算. 我买了6.99美元的那个. VPS OVZ构架 1核/125MB/5GB/800GB流量/1 IPv4/OVZ/ ...
- 完整OSW安装方法
完整OSW安装方法(如果数据库是rac,一定要记得第5步,要不收集不到私网的信息): OSW介质见附件 1.上传介质到 /home/oracle 2.oracle用户将压缩包解压到归档arch目录下( ...
- LeetCode 821 Shortest Distance to a Character 解题报告
题目要求 Given a string S and a character C, return an array of integers representing the shortest dista ...
- 前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
input标签用于接收用户输入.可以利用input 可以做登录页面 input标签是行内块标签 <input> 元素会根据不同的 type 属性,变化为多种形态. name属性:表单点击提 ...
- centos 安装 pcre
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/luozhonghua2014/article/details/37054235 #rpm -qa | ...