当前位置: 首页 > news >正文

网站建设数据安全分析中文域名值得注册吗

网站建设数据安全分析,中文域名值得注册吗,怎么进入公众号,二 加强门户网站建设HTMLReport应用之UnittestPythonSeleniumHTMLReport项目自动化测试实战1 测试框架结构2 技术栈3 实现思路3.1 使用HtmlTestRunner3.2 使用HTMLReport4 TestRunner参数说明4.1 源码4.2 参数说明5 框架代码5.1 common/reportOut.py5.2 common/sendMain.py5.3 report5.3.1 xxx.htm… HTMLReport应用之UnittestPythonSeleniumHTMLReport项目自动化测试实战1 测试框架结构2 技术栈3 实现思路3.1 使用HtmlTestRunner3.2 使用HTMLReport4 TestRunner参数说明4.1 源码4.2 参数说明5 框架代码5.1 common/reportOut.py5.2 common/sendMain.py5.3 report5.3.1 xxx.html5.3.2 xxx.log5.3.3 xxx.xml5.4 testcase5.5 main.py6 运行结果『IT女神-仅以此文致敬 女性开发者』 她们在不同领域熠熠生辉创造了无限的可能成为了IT发展进步中不可或缺的角色。 她们在AI代码的世界里让梦想生根、开花。 不分年龄、无论背景她们释放着热情与专业用技术为自己代言。 致敬每一位IT女神愿她们永远美丽、永远绽放自己独特的魅力之花。 同时在这特殊的节日祝愿所有的女性朋友梦想成真 注意事项 【本文字数包含代码38175字建议慢慢看~哈哈哈】 1、以下仅为举例具体以自身实际项目为准 2、以下内容重点是介绍HTMLReport的应用并不是说明如何搭建框架 3、如果想了解框架内容可移步博主有关测试框架的系列文章 4、写了一个用例用例中没有加断言只是为了生成测试报告可以忽略 5、用例故意写错了3个1个通过是为了生成测试报告数据。 1 测试框架结构 目录/脚本说明common/reportOut.py这是是用HTMLReport生成报告的common/sendMain.py这个是用来发邮件本次演示可要可不要report是存放测试报告的里边有3个文件由HTMLReport自动生成testcase存放测试用例的main.py框架主入口 2 技术栈 技术版本及说明PythonV3.x本文为3.7编程语言支撑SeleniumV3.141.0 UI元素、控件的识别、定位以及浏览器控制等HTMLReport生成Html测试报告UnittestPython自带自动化测试框架SmtplibPython自带邮件服务emailPython自带邮件服务osPython自带系统模块PyCharmCommunity 2020.2汉化版操作系统Windows10旗舰版64位其它后续补充 3 实现思路 这里具体就是把原来生成HtmlTestRunner改为HTMLReport 3.1 使用HtmlTestRunner # -*- coding:utf-8 -*- # 作者虫无涯 # 日期2022/3/7 # 文件名称reportOut.py # 作用封装测试报告功能import time import unittest from common import HTMLTestRunner # 引入导入的报告模板def report_out(test_dir, report_dir, name_project)::test_dir: 用例路径:report_dir : 报告路径:name_project : 项目名称用于报告命名及描述:return: 无now time.strftime(%Y_%m_%d %H_%M_%S)discover unittest.defaultTestLoader.discover(test_dir,patterntest*.py) # 加载测试用例report_name report_dir now - name_project_test_report.html # 报告名称with open(report_name,wb) as f: # 运行用例生成测试报告runner HTMLTestRunner.HTMLTestRunner(streamf,titlename_project WebUI Auto Testing Report,description(name_project U美多商城UI自动化功能回归测试),verbosity2)runner.run(discover)f.close()stream:要操作的文件title测试报告标题description报告描述verbosity报告级别。3.2 使用HTMLReport # -*- coding:utf-8 -*- # 作者虫无涯 # 日期2023/3/7 # 文件名称reportOut.py # 作用封装测试报告功能import time import unittest from HTMLReport import ddt, TestRunner, add_image, no_retry, retrydef report_out(test_dir, report_dir, name_project)::test_dir: 用例路径:report_dir : 报告路径:name_project : 项目名称用于报告命名及描述:return: 无now time.strftime(%Y_%m_%d %H_%M_%S)discover unittest.defaultTestLoader.discover(test_dir, patterntest*.py) # 加载测试用例# report_name now - name_project _test_report.html # 报告名称test_runner TestRunner(report_file_namenow,output_pathreport_dir,titlename_project,description关于HTMLReport的实际项目应用,thread_count1,thread_start_wait0.1,tries0,delay0,back_off1,retryTrue,sequential_executionTrue,langcn)test_runner.run(discover)4 TestRunner参数说明 4.1 源码 class TestRunner(TemplateMixin, TestSuite):测试执行器def __init__(self, report_file_name: str None, log_file_name: str None, output_path: str None,title: str None, description: str None, tries: int 0, delay: float 1, back_off: float 1,max_delay: float 120, retry: bool True, thread_count: int 1, thread_start_wait: float 0,sequential_execution: bool False, lang: str cn, image: bool True, failed_image: bool False):4.2 参数说明 参数说明report_file_name报告文件名如果未赋值将采用“test时间戳”log_file_name日志文件名如果未赋值将采用报告文件名如果报告文件名也没有将采用“test时间戳”output_path报告保存文件夹名默认“report”title报告标题默认“测试报告”description报告描述默认“无测试描述”tries重试次数delay重试延迟间隔单位为 秒back_off扩展每次重试等待时间的乘数max_delay最大重试等待时间长度单位为 秒retry如果为 True 表示所有用例遵循重试规则False 只针对添加了 retry 用例有效thread_count并发线程数量无序执行测试默认数量 1thread_start_wait各线程启动延迟默认 0 ssequential_execution是否按照套件添加(addTests)顺序执行 会等待一个addTests执行完成再执行下一个默认 False。如果用例中存在 tearDownClass 建议设置为True否则 tearDownClass 将会在所有用例线程执行完后才会执行。lang(cn, en) 支持中文与英文报告输出默认采用中文image默认支持添加图片False 放弃所有图片添加failed_imagetrue 只有失败才添加图片成功用例添加的图片会被删除 5 框架代码 5.1 common/reportOut.py # -*- coding:utf-8 -*- # 作者虫无涯 # 日期2023/3/7 # 文件名称reportOut.py # 作用封装测试报告功能import time import unittest from HTMLReport import ddt, TestRunner, add_image, no_retry, retrydef report_out(test_dir, report_dir, name_project)::test_dir: 用例路径:report_dir : 报告路径:name_project : 项目名称用于报告命名及描述:return: 无now time.strftime(%Y_%m_%d %H_%M_%S)discover unittest.defaultTestLoader.discover(test_dir, patterntest*.py) # 加载测试用例# report_name now - name_project _test_report.html # 报告名称test_runner TestRunner(report_file_namenow,output_pathreport_dir,titlename_project,description关于HTMLReport的实际项目应用,thread_count1,thread_start_wait0.1,tries0,delay0,back_off1,retryTrue,sequential_executionTrue,langcn)test_runner.run(discover)5.2 common/sendMain.py # -*- coding:utf-8 -*- # 作者虫无涯 # 日期2023/3/7 # 文件名称sendMain.py # 作用封装邮件服务模块import time import smtplib import getpass from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import email import osdef send_main(file_path, mail_toxxx126.com):mail_from xxxx126.comf open(file_path, rb)mail_body f.read()f.close()# msg email.MIMEMultipart.MIMEMultipart()msg MIMEMultipart()# 构造MIMEBase对象做为文件附件内容并附加到根容器contype application/octet-streammaintype, subtype contype.split(/, 1)# 读入文件内容并格式化data open(file_path, rb)# file_msg email.MIMEBase.MIMEBase(maintype, subtype)file_msg MIMEBase(maintype, subtype)file_msg.set_payload(data.read())data.close()# email.Encoders.encode_base64(file_msg)encoders.encode_base64(file_msg)# 设置附件头basename os.path.basename(file_path)file_msg.add_header(Content-Disposition, attachment, filenamebasename)msg.attach(file_msg)print(umsg 附件添加成功)msg1 MIMEText(mail_body, html, utf-8)msg.attach(msg1)if isinstance(mail_to, str):msg[To] mail_toelse:msg[To] ,.join(mail_to)msg[From] mail_frommsg[Subject] u美多商城UI自动化功能回归测试msg[date] time.strftime(%Y-%m-%d-%H_%M_%S)print(msg[date])smtp smtplib.SMTP()smtp.connect(smtp.126.com)smtp.login(xxx126.com, xxx) # 登录账号和密码密码为之前申请的授权码smtp.sendmail(mail_from, mail_to, msg.as_string())smtp.quit()print(email has send out !)# if __name____main__: # sendmain(../report/2017-08-18-10_18_57_result.html) 5.3 report 5.3.1 xxx.html ?xml version1.0 encodingUTF-8? !DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd html xmlnshttp://www.w3.org/1999/xhtml langcnheadtitle关于HTMLReport的实际项目应用/titlemeta namegenerator contentHTMLReport 刘士 2.3.1/meta http-equivContent-Type contenttext/html; charsetUTF-8/style typetext/css mediascreen body {font-family: -apple-system, BlinkMacSystemFont, Segoe UI, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Helvetica Neue, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;font-size: 14px; }pre {word-wrap: break-word;word-break: break-all;overflow: auto;white-space: pre-wrap }h1 {font-size: 16pt;color: gray }.heading {margin-top: 0;margin-bottom: 1ex }.heading .attribute {margin-top: 1ex;margin-bottom: 0 }.heading .description {margin-top: 4ex;margin-bottom: 6ex }a.popup_link:hover {color: red }.popup_window {display: block;position: relative;left: 0;top: 0;padding: 10px;background-color: #E6E6D6;text-align: left;font-size: 13px }.popup_retry_window {padding-left: 50px; }#show_detail_line {margin-top: 3ex;margin-bottom: 1ex }#result_table {width: 100%;border-collapse: collapse;border: 1px solid #777 }#header_row {color: #fff;background-color: #777 }#result_table td {border: 1px solid #777;padding: 2px; }#result_table td:nth-child(n2) {min-width: 70px;width: 100% }#result_table td:nth-child(n3) {text-align: center; }#result_table td:first-of-type {text-align: center;min-width: 60px; }#total_row {font-weight: bold }.passClass, .failClass, .errorClass, .skipClass {font-weight: bold }.passCase {background-color: #d0e9c6 }.failCase {background-color: #ebcccc }.errorCase {background-color: #faf2cc }.skipCase {background-color: #c4e3f3 }.hiddenRow {display: none }.testcase {margin-left: 2em }#popup {position: fixed;left: 0;top: 0;width: 100%;height: 100%;text-align: center;display: none }#popup .bg {background-color: rgba(0, 0, 0, .5);width: 100%;height: 100% }#popup img {max-width: 100%;max-height: 100%;margin: auto;position: absolute;top: 0;left: 0;bottom: 0;right: 0; }img.pic {cursor: pointer;width: auto;height: auto;max-width: 100%;max-height: 100%;opacity: 1;transition: opacity 0.3s; }img.pic[data-src] {opacity: 0; }#wrapper {margin: 0 auto;border-top: solid 2px #666; }#wrapper .lang-en {display: none; }#wrapper.lang-cn p.lang-cn {display: block; }#wrapper.lang-cn span.lang-cn {display: inline; }#wrapper.lang-cn .lang-en {display: none; }#wrapper.lang-en .lang-cn {display: none; }#wrapper.lang-en p.lang-en {display: block; }#wrapper.lang-en span.lang-en {display: inline; }#lang ul {float: right;margin: 0;padding: 2px 10px 4px 10px;background: #666;border-radius: 0 0 4px 4px;list-style: none; }#lang li {margin: 0;float: left;padding: 0 5px; }#lang li a {display: block;width: 24px;height: 24px;text-indent: -4em;overflow: hidden;background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAAf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAHiSURBVHja1Ja/jtNAEMZ/Y2/icBdxXAMSEu/A1dBR0NJQ8CS8AQ0tb4CQgEegPgQFOh7ixJUX4vgSx96ZoUgOO3KRDgFX7Or0Wgf7PzeVfcnUMi4cA4OIEAARgAvY5r10AZgOGvl69Gkm4Xk9w3fJTg9f4MDz9OA3AsSTC4OmThaQE3Bp9weRmyhie2I8us3gOMABFNFkjlW5PTPIvOLAO7YVMjfC/Sd4YuK4nOGuyMiABv7v6pP7mKmACEAeK1YPuPoWU52FgkPUiafngFDjCDQ/Fproo1vrSbUPuvR4eF7kBwDRi4ynlzxkyUMrvKTZabbrPFb9Jd2qPh7BK4DGiRYFeTJmdC8nAsVKaUes72eOK6Xm2G0GaYhpXCTzPsXEBgOZN8unrktHbAddvAKrdCESwqmoItI74eILlkw0bjt4Zltdg5hL8NhSYLGmurrCxuPN7Mv951LAh1kLQWxBlUw68bDGtEqaStQiB0SRMWlbh1yXWPuMIc/wzTiC0dslBQR0TArfWPwJdr21KyttLKaeJijvmaD0gTMF/z57pPt8W37E1xaylwU0iE5OhON2fgjreMVmuMXC/ntus7QYAT4BFwrPiv4HL2xstu21Xh4jAXP77V8WfAQAixA0rudAk0AAAAABJRU5ErkJggg) no-repeat 50% 50%; }#lang li a#lang-en {background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAAf8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAIWSURBVHja1JY/SBthGIefu1xqS6K20KFDy0kopUiHmphIByUZotRAIZOTWZzFpYtbB0uh6KJTIdQhi9pBSwmmCOpgoUSKFItTh4AU6tCr16Rn5P58XZocDrlYuAz9wfHAcbzv9/2932/k4QQdFIyHVbHE0iAAlwFgj7HNoG6AoRzudc/A4F/28yL2l7bb269yd9QgJAsS8zMjFIufyWRuHspXqtbnsHrH8oAIQlQJyfzlaGhCNFohJ2dI1Kp/iZ3d49IJvsvvJckmJ197JlACIEsy30KgGUJBgcjFIufSacfsLnpza2tL/x4qx15fR0Uz84hL8HjG1blEqHJJP9bGx8IpMZ8CSAMIzWq1cUhO24CSzLYWTkPisrH8lm46yuenN9fZbr156WmRZFgQLjR3YrK2VyWSiFAp7TEw88iTAyZNca4t6e6h/P3EbzTRtxscfks9vk83G27JaPcOuVls/v6o4pltlajo9L1KpebG8vC9isbm2jMXmRDsZhiEAVWn4NTU1ysJCkenpMRYXS55cWnrPcSThUUVhzrquNEeFOjz8vOI4CrXaaU7d3p29YJusMYwQD3Drb7AFRd14Xf0nXdtehbfAxdkhG13/5M0HCImiTcPhC2BVIAHMefOWrbCNxYqqZpvlukaVrTIrNye4CK1JH7xpSAXuAOcN3n4KfAceNG62qch4ygHPpv/rDMAXV79BpyNnBoAAAAASUVORK5CYII); }.figure_ul {text-align: center;padding: 0; }.figure_li {width: 30em;list-style: none;display: inline-block;vertical-align: baseline; }tr {height: 2em; } /stylescript typetext/javascript var chartData_cn [[1, #1c965b, 通过], [3, #ff9800, 错误]]; var chartData_en [[1, #1c965b, pass], [3, #ff9800, error]]; function addClass(e, c) {if (!isClass(e, c)) {if (e.className) {e.className e.className c;} else {e.className c;}} }function delClass(e, c) {if (isClass(e, c)) {// r /(?:^|\s) c (?!\S)/g;let r new RegExp((?:^|\s) c (?!\S), g);e.className e.className.replace(r, );} }function isClass(e, c) {let r new RegExp((?:^|\s) c (?!\S));return e.className.match(r); }function showCase(level) {let trs document.getElementsByTagName(tr);for (let i 0; i trs.length; i) {let tr trs[i];let id tr.id;if (id.substring(0, 2) st) {if (level 4 || level 3) {delClass(tr, hiddenRow);} else {addClass(tr, hiddenRow);}}if (id.substring(0, 2) ft) {if (level 4 || level 2) {delClass(tr, hiddenRow);} else {addClass(tr, hiddenRow);}}if (id.substring(0, 2) pt) {if (level 4 || level 1) {delClass(tr, hiddenRow);} else {addClass(tr, hiddenRow);}}if (id.substring(0, 2) et) {if (level 4 || level 5 || level 2) {delClass(tr, hiddenRow);} else {addClass(tr, hiddenRow);}}if (id.substring(0, 4) div_) {addClass(tr, hiddenRow);}} }function showClassDetail(cid, count) {let id_list Array(count);let toHide 1;for (let i 0; i count; i) {let tid0 t cid.substring(1) . (i 1);let tid f tid0;let tr document.getElementById(tid);if (!tr) {tid p tid0;tr document.getElementById(tid);if (!tr) {tid e tid0;tr document.getElementById(tid);if (tr null) {tid s tid0;tr document.getElementById(tid);}}}id_list[i] tid;if (tr.className) {toHide 0;}}for (let i 0; i count; i) {let tid id_list[i];if (toHide tid.indexOf(p) ! -1) {addClass(document.getElementById(tid), hiddenRow);} else {delClass(document.getElementById(tid), hiddenRow);}}let trs document.getElementsByTagName(tr);for (let i 0; i trs.length; i) {let tr trs[i];let id tr.id;if (id.substring(0, 4) div_) {addClass(tr, hiddenRow);}} }function showTestDetail(div_id, count, b) {let details_div_s document.getElementsByName(div_id);for (let j 0; j details_div_s.length; j) {let details_div details_div_s[j];if (isClass(details_div, hiddenRow)) {delClass(details_div, hiddenRow);} else {addClass(details_div, hiddenRow);}}for (let i 1; i count; i) {let details_div_s document.getElementsByName(div_id . i);for (let j 0; j details_div_s.length; j) {let details_div details_div_s[j];if (details_div ! undefined) {if (b isClass(details_div, hiddenRow)) {delClass(details_div, hiddenRow);} else {addClass(details_div, hiddenRow);}}}} }function html_escape(s) {s s.replace(//g, amp;);s s.replace(//g, lt;);s s.replace(//g, gt;);return s; }function goChart(dataArr) {// 声明所需变量var canvas, ctx;// 图表属性var cWidth, cHeight, cMargin, cSpace;// 饼状图属性var radius, ox, oy;//半径 圆心var tWidth, tHeight;//图例宽高var posX, posY, textX, textY;var startAngle, endAngle;var totleNb;// 运动相关变量var ctr, numctr, speed;//鼠标移动var mousePosition {};//线条和文字var lineStartAngle, line, textPadding, textMoveDis;// 获得canvas上下文canvas document.getElementById(chart);if (canvas canvas.getContext) {ctx canvas.getContext(2d);}initChart();// 图表初始化function initChart() {// 图表信息cMargin 20;cSpace 40;canvas.width canvas.parentNode.getAttribute(width) * 2;canvas.height canvas.parentNode.getAttribute(height) * 2;canvas.style.height canvas.height / 2 px;canvas.style.width canvas.width / 2 px;cHeight canvas.height - cMargin * 2;cWidth canvas.width - cMargin * 2;//饼状图信息radius cHeight * 2 / 6; //半径 高度的2/6ox canvas.width / 2 cSpace; //圆心oy canvas.height / 2;tWidth 60; //图例宽和高tHeight 20;posX cMargin;posY cMargin; //textX posX tWidth 15textY posY 18;startAngle endAngle 90 * Math.PI / 180; //起始弧度 结束弧度rotateAngle 0; //整体旋转的弧度//将传入的数据转化百分比totleNb 0;new_data_arr [];for (var i 0; i dataArr.length; i) {totleNb dataArr[i][0];}for (var i 0; i dataArr.length; i) {new_data_arr.push(dataArr[i][0] / totleNb);}totalYNomber 10;// 运动相关ctr 1;//初始步骤numctr 50;//步骤speed 1.2; //毫秒 timer速度//指示线 和 文字lineStartAngle -startAngle;line 40; //画线的时候超出半径的一段线长textPadding 10; //文字与线之间的间距textMoveDis 200; //文字运动开始的间距}drawMarkers();//绘制比例图及文字function drawMarkers() {ctx.textAlign left;for (var i 0; i dataArr.length; i) {//绘制比例图及文字ctx.fillStyle dataArr[i][1];ctx.fillRect(posX, posY 40 * i, tWidth, tHeight);ctx.moveTo(parseInt(posX) 0.5, parseInt(posY 40 * i) 0.5);ctx.font normal 24px 微软雅黑; //斜体 30像素 微软雅黑字体ctx.fillStyle dataArr[i][1]; //#000000;var percent dataArr[i][2] parseInt(100 * new_data_arr[i]) %;ctx.fillText(percent, parseInt(textX) 0.5, parseInt(textY 40 * i) 0.5);}}//绘制动画pieDraw();function pieDraw(mouseMove) {for (var n 0; n dataArr.length; n) {ctx.fillStyle ctx.strokeStyle dataArr[n][1];ctx.lineWidth 1;var step new_data_arr[n] * Math.PI * 2; //旋转弧度var lineAngle lineStartAngle step / 2; //计算线的角度lineStartAngle step;//结束弧度ctx.beginPath();var x0 ox radius * Math.cos(lineAngle),//圆弧上线与圆相交点的x坐标y0 oy radius * Math.sin(lineAngle),//圆弧上线与圆相交点的y坐标x1 ox (radius line) * Math.cos(lineAngle),//圆弧上线与圆相交点的x坐标y1 oy (radius line) * Math.sin(lineAngle),//圆弧上线与圆相交点的y坐标x2 x1,//转折点的x坐标y2 y1,linePadding ctx.measureText(dataArr[n][2]).width 10; //获取文本长度来确定折线的长度ctx.moveTo(parseInt(x0) 0.5, parseInt(y0) 0.5);//对x1/y1进行处理来实现折线的运动yMove y0 (y1 - y0) * ctr / numctr;ctx.lineTo(parseInt(x1) 0.5, parseInt(yMove) 0.5);if (x1 x0) {x2 - line;ctx.textAlign right;ctx.lineTo(parseInt(x2 - linePadding) 0.5, parseInt(yMove) 0.5);ctx.fillText(dataArr[n][2], x2 - textPadding - textMoveDis * (numctr - ctr) / numctr, y2 - textPadding);} else {x2 line;ctx.textAlign left;ctx.lineTo(parseInt(x2 linePadding) 0.5, parseInt(yMove) 0.5);ctx.fillText(dataArr[n][2], x2 textPadding textMoveDis * (numctr - ctr) / numctr, y2 - textPadding);}ctx.stroke();}//设置旋转ctx.save();ctx.translate(ox, oy);ctx.rotate((Math.PI * 2 / numctr) * ctr / 2);//绘制一个圆圈ctx.strokeStyle rgba(0,0,0, 0.5 * ctr / numctr )ctx.beginPath();ctx.arc(0, 0, (radius 20) * ctr / numctr, 0, Math.PI * 2, false);ctx.stroke();for (var j 0; j dataArr.length; j) {//绘制饼图endAngle endAngle new_data_arr[j] * ctr / numctr * Math.PI * 2; //结束弧度ctx.beginPath();ctx.moveTo(0, 0); //移动到到圆心ctx.arc(0, 0, radius * ctr / numctr, startAngle, endAngle, false); //绘制圆弧ctx.fillStyle dataArr[j][1];if (mouseMove ctx.isPointInPath(mousePosition.x * 2, mousePosition.y * 2)) {ctx.globalAlpha 0.8;}ctx.closePath();ctx.fill();ctx.globalAlpha 1;startAngle endAngle; //设置起始弧度if (j dataArr.length - 1) {startAngle endAngle 90 * Math.PI / 180; //起始弧度 结束弧度}}ctx.restore();if (ctr numctr) {ctr;setTimeout(function () {//ctx.clearRect(-canvas.width,-canvas.width,canvas.width*2, canvas.height*2);ctx.clearRect(-canvas.width, -canvas.height, canvas.width * 2, canvas.height * 2);drawMarkers();pieDraw();}, speed * 1.085);}}//监听鼠标移动var mouseTimer null;canvas.addEventListener(mousemove, function (e) {e e || window.event;if (e.offsetX || e.offsetX 0) {mousePosition.x e.offsetX;mousePosition.y e.offsetY;} else if (e.layerX || e.layerX 0) {mousePosition.x e.layerX;mousePosition.y e.layerY;}clearTimeout(mouseTimer);mouseTimer setTimeout(function () {ctx.clearRect(0, 0, canvas.width, canvas.height);drawMarkers();pieDraw(true);}, 10);});}function load() {let el_wrapper document.getElementById(wrapper);document.getElementById(lang-cn).onclick function () {el_wrapper.className lang-cn;goChart(chartData_cn);};document.getElementById(lang-en).onclick function () {el_wrapper.className lang-en;goChart(chartData_en);};let nav_lang (location.hash || ).replace(/#/, );if (nav_lang cn || nav_lang en) el_wrapper.className lang- nav_lang;let images document.getElementsByClassName(pic);let lens images.length;let popup document.getElementById(popup);function showBig(src, title, alt) {document.getElementById(popup-img).setAttribute(src, src)document.getElementById(popup-img).setAttribute(title, title)document.getElementById(popup-img).setAttribute(alt, alt)popup.style.display block;popup.style.zIndex 999999;}function show(event) {event event || window.event;let target document.elementFromPoint(event.clientX, event.clientY);showBig(target.src, target.title, target.alt);}for (let i 0; i lens; i) images[i].onclick show;popup.onclick function () {document.getElementById(popup-img).removeAttribute(src)document.getElementById(popup-img).removeAttribute(title)document.getElementById(popup-img).removeAttribute(alt)popup.style.display none;popup.style.zIndex -1;};[].forEach.call(document.querySelectorAll(img.pic[data-src]), function (img) {img.setAttribute(src, img.getAttribute(data-src));img.onload function () {img.removeAttribute(data-src);};});draw() } function draw() { goChart(chartData_cn); }/script /headbody onloadload() div idwrapper classlang-cndiv idlangullia href#cn idlang-cn title简体中文cn/a/lilia href#en idlang-en titleEnglishen/a/li/ul/divdiv classheading h1关于HTMLReport的实际项目应用/h1 table trtd stylewidth: 100%; vertical-align: top;p classattributestrongspan classlang-cn启动时间/spanspan classlang-enStart Time:/span/strong 2023-03-07 17:15:55/pp classattributestrongspan classlang-cn结束时间/spanspan classlang-enEnd Time:/span/strong 2023-03-07 17:16:09/pp classattributestrongspan classlang-cn运行时长/spanspan classlang-enDuration:/span/strong 0:00:13.857089/pp classattributestrongspan classlang-cn结果/spanspan classlang-enStatus:/span/strongspan classlang-cn合计/spanspan classlang-enTotal:/span4nbsp;nbsp;nbsp;nbsp;span classlang-cn通过/spanspan classlang-enPassed:/span1nbsp;nbsp;nbsp;nbsp;span classlang-cn失败/spanspan classlang-enFailed:/span0nbsp;nbsp;nbsp;nbsp;span classlang-cn错误/spanspan classlang-enError:/span3nbsp;nbsp;nbsp;nbsp;span classlang-cn跳过/spanspan classlang-enSkipped:/span0nbsp;nbsp;nbsp;nbsp;/pp classdescription关于HTMLReport的实际项目应用/p/tdtddiv height400 width600canvas idchart styleborder: 1px solid #A4E2F9; 你的浏览器不支持HTML5 canvas /canvas/div/td /tr /table /div a href2023_03_07 17_15_55.logspan classlang-cn下载日志文件/spanspan classlang-enDownload log file/span /ap idshow_detail_line筛选a hrefjavascript:showCase(0)span classlang-cn摘要/spanspan classlang-enSummary/span/aa hrefjavascript:showCase(1)span classlang-cn通过/spanspan classlang-enPass/span/aa hrefjavascript:showCase(2)span classlang-cn失败/spanspan classlang-enFAIL/span/aa hrefjavascript:showCase(5)span classlang-cn异常/spanspan classlang-enError/span/aa hrefjavascript:showCase(3)span classlang-cn跳过/spanspan classlang-enSkip/span/aa hrefjavascript:showCase(4)span classlang-cn全部/spanspan classlang-enAll/span/a /p table idresult_tabletr idheader_rowthspan classlang-cn序号/spanspan classlang-enNO/span/ththspan classlang-cn测试组/测试用例/spanspan classlang-enTest Group/Test case/span/ththspan classlang-cn计数/spanspan classlang-enCount/span/ththspan classlang-cn通过/spanspan classlang-enPassed/span/ththspan classlang-cn失败/spanspan classlang-enFailed/span/ththspan classlang-cn错误/spanspan classlang-enErroneous/span/ththspan classlang-cn跳过/spanspan classlang-enSkipped/span/ththspan classlang-cn统计/spanspan classlang-enStatistics/span/ththspan classlang-cn重试/spanspan classlang-enTries/span/ththspan classlang-cn查看/spanspan classlang-enView/span/th/trtr classerrorClasstdc1/tdtdtest_baidu.TestCase/tdtd4/tdtd classpassCase1/tdtd classfailCase0/tdtd classerrorCase3/tdtd classskipCase0/tdtd styletext-align:right;25.00%/tdtd0/tdtda hrefjavascript:showClassDetail(c1,4)span classlang-cn细节/spanspan classlang-enDetail/span/a/td /tr tr idet1.1 tdet1.1/tdtd classerrorCase colspan7div classtestcasetest_back_refresh/div/tdtd classerrorCasediv classtestcase stylemargin-left: auto;0/div/tdtd classerrorCase aligncentera classpopup_link onfocusthis.blur(); hrefjavascript:showTestDetail(div_et1.1.1,1, false)span classlang-cn错误/spanspan classlang-enerror/span/a/td /tr tr iddiv_S_et1.1.1 namediv_et1.1.1 classhiddenRowtd colspan10div classpopup_windowdiv styletext-align: right; color:red;cursor:pointeronclickdocument.getElementById(div_S_et1.1.1).className hiddenRowa onfocusthis.blur();[x]/a/divpreet1.1.1: 2023-03-07 17:15:58,071 23748 INFO result.py(70) - 测试延迟启动0.1s 2023-03-07 17:15:58,183 23748 INFO result.py(73) - 开始测试 test_back_refresh (test_baidu.TestCase) 2023-03-07 17:15:58,329 23748 ERROR result.py(191) - 测试产生错误 test_back_refresh (test_baidu.TestCase) Traceback (most recent call last):File F:\Automated-UITest-demo-update - htmlreport\testcase\test_baidu.py, line 43, in test_back_refreshself.driver.find_element_by_id(kw).send_keys(csdn) # 输入csdnFile D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 360, in find_element_by_idreturn self.find_element(byBy.ID, valueid_)File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 978, in find_elementvalue: value})[value]File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 321, in executeself.error_handler.check_response(response)File D:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py, line 242, in check_responseraise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {method:css selector,selector:[idkw]}(Session info: chrome110.0.5481.178)2023-03-07 17:15:58,330 23748 INFO result.py(96) - 测试结束 test_back_refresh (test_baidu.TestCase) 2023-03-07 17:15:58,330 23748 INFO result.py(97) - 耗时 0.14696788787841797/predivul classfigure_ul/ul/div/div/td /trtr idet1.2 tdet1.2/tdtd classerrorCase colspan7div classtestcasetest_search/div/tdtd classerrorCasediv classtestcase stylemargin-left: auto;0/div/tdtd classerrorCase aligncentera classpopup_link onfocusthis.blur(); hrefjavascript:showTestDetail(div_et1.2.1,1, false)span classlang-cn错误/spanspan classlang-enerror/span/a/td /tr tr iddiv_S_et1.2.1 namediv_et1.2.1 classhiddenRowtd colspan10div classpopup_windowdiv styletext-align: right; color:red;cursor:pointeronclickdocument.getElementById(div_S_et1.2.1).className hiddenRowa onfocusthis.blur();[x]/a/divpreet1.2.1: 2023-03-07 17:15:58,330 23748 INFO result.py(70) - 测试延迟启动0.1s 2023-03-07 17:15:58,434 23748 INFO result.py(73) - 开始测试 test_search (test_baidu.TestCase) 2023-03-07 17:16:00,445 23748 ERROR result.py(191) - 测试产生错误 test_search (test_baidu.TestCase) Traceback (most recent call last):File F:\Automated-UITest-demo-update - htmlreport\testcase\test_baidu.py, line 26, in test_searchself.driver.find_element_by_id(kw).send_keys(helloworld) # 输入“helloworld”File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 360, in find_element_by_idreturn self.find_element(byBy.ID, valueid_)File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 978, in find_elementvalue: value})[value]File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 321, in executeself.error_handler.check_response(response)File D:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py, line 242, in check_responseraise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {method:css selector,selector:[idkw]}(Session info: chrome110.0.5481.178)2023-03-07 17:16:00,445 23748 INFO result.py(96) - 测试结束 test_search (test_baidu.TestCase) 2023-03-07 17:16:00,445 23748 INFO result.py(97) - 耗时 2.0103440284729004/predivul classfigure_ul/ul/div/div/td /trtr idet1.3 tdet1.3/tdtd classerrorCase colspan7div classtestcasetest_serach_clear/div/tdtd classerrorCasediv classtestcase stylemargin-left: auto;0/div/tdtd classerrorCase aligncentera classpopup_link onfocusthis.blur(); hrefjavascript:showTestDetail(div_et1.3.1,1, false)span classlang-cn错误/spanspan classlang-enerror/span/a/td /tr tr iddiv_S_et1.3.1 namediv_et1.3.1 classhiddenRowtd colspan10div classpopup_windowdiv styletext-align: right; color:red;cursor:pointeronclickdocument.getElementById(div_S_et1.3.1).className hiddenRowa onfocusthis.blur();[x]/a/divpreet1.3.1: 2023-03-07 17:16:00,445 23748 INFO result.py(70) - 测试延迟启动0.1s 2023-03-07 17:16:00,561 23748 INFO result.py(73) - 开始测试 test_serach_clear (test_baidu.TestCase) 2023-03-07 17:16:00,566 23748 ERROR result.py(191) - 测试产生错误 test_serach_clear (test_baidu.TestCase) Traceback (most recent call last):File F:\Automated-UITest-demo-update - htmlreport\testcase\test_baidu.py, line 49, in test_serach_clearself.driver.find_element_by_id(kw).send_keys(csdn) # 输入csdnFile D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 360, in find_element_by_idreturn self.find_element(byBy.ID, valueid_)File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 978, in find_elementvalue: value})[value]File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 321, in executeself.error_handler.check_response(response)File D:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py, line 242, in check_responseraise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {method:css selector,selector:[idkw]}(Session info: chrome110.0.5481.178)2023-03-07 17:16:00,567 23748 INFO result.py(96) - 测试结束 test_serach_clear (test_baidu.TestCase) 2023-03-07 17:16:00,567 23748 INFO result.py(97) - 耗时 0.0060002803802490234/predivul classfigure_ul/ul/div/div/td /trtr idpt1.4 tdpt1.4/tdtd classpassCase colspan7div classtestcasetest_windows_size/div/tdtd classpassCasediv classtestcase stylemargin-left: auto;0/div/tdtd classpassCase aligncentera classpopup_link onfocusthis.blur(); hrefjavascript:showTestDetail(div_pt1.4.1,1, false)span classlang-cn通过/spanspan classlang-enpass/span/a/td /tr tr iddiv_S_pt1.4.1 namediv_pt1.4.1 classhiddenRowtd colspan10div classpopup_windowdiv styletext-align: right; color:red;cursor:pointeronclickdocument.getElementById(div_S_pt1.4.1).className hiddenRowa onfocusthis.blur();[x]/a/divprept1.4.1: 2023-03-07 17:16:00,567 23748 INFO result.py(70) - 测试延迟启动0.1s 2023-03-07 17:16:00,670 23748 INFO result.py(73) - 开始测试 test_windows_size (test_baidu.TestCase) 2023-03-07 17:16:05,441 23748 INFO result.py(172) - 测试执行通过 test_windows_size (test_baidu.TestCase) 2023-03-07 17:16:05,442 23748 INFO result.py(96) - 测试结束 test_windows_size (test_baidu.TestCase) 2023-03-07 17:16:05,442 23748 INFO result.py(97) - 耗时 4.770826101303101/predivul classfigure_ul/ul/div/div/td /trtr idtotal_rowtdnbsp;/tdtdspan classlang-cn合计/spanspan classlang-enTotal/span/tdtd4/tdtd classpassCase1/tdtd classfailCase0/tdtd classerrorCase3/tdtd classskipCase0/tdtd styletext-align:right;25.00%/tdtd0/tdtdnbsp;/td/tr /tablediv idendingnbsp;/divdiv idpopupdiv classbgimg idpopup-img//div/div /div /body/html 5.3.2 xxx.log 2023-03-07 17:15:55,952 25872 INFO test_runner.py(162) - 预计并发线程数1 2023-03-07 17:15:58,071 23748 INFO result.py(70) - 测试延迟启动0.1s 2023-03-07 17:15:58,183 23748 INFO result.py(73) - 开始测试 test_back_refresh (test_baidu.TestCase) 2023-03-07 17:15:58,329 23748 ERROR result.py(191) - 测试产生错误 test_back_refresh (test_baidu.TestCase) Traceback (most recent call last):File F:\Automated-UITest-demo-update - htmlreport\testcase\test_baidu.py, line 43, in test_back_refreshself.driver.find_element_by_id(kw).send_keys(csdn) # 输入csdnFile D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 360, in find_element_by_idreturn self.find_element(byBy.ID, valueid_)File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 978, in find_elementvalue: value})[value]File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 321, in executeself.error_handler.check_response(response)File D:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py, line 242, in check_responseraise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {method:css selector,selector:[idkw]}(Session info: chrome110.0.5481.178)2023-03-07 17:15:58,330 23748 INFO result.py(96) - 测试结束 test_back_refresh (test_baidu.TestCase) 2023-03-07 17:15:58,330 23748 INFO result.py(97) - 耗时 0.14696788787841797 2023-03-07 17:15:58,330 23748 INFO result.py(70) - 测试延迟启动0.1s 2023-03-07 17:15:58,434 23748 INFO result.py(73) - 开始测试 test_search (test_baidu.TestCase) 2023-03-07 17:16:00,445 23748 ERROR result.py(191) - 测试产生错误 test_search (test_baidu.TestCase) Traceback (most recent call last):File F:\Automated-UITest-demo-update - htmlreport\testcase\test_baidu.py, line 26, in test_searchself.driver.find_element_by_id(kw).send_keys(helloworld) # 输入“helloworld”File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 360, in find_element_by_idreturn self.find_element(byBy.ID, valueid_)File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 978, in find_elementvalue: value})[value]File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 321, in executeself.error_handler.check_response(response)File D:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py, line 242, in check_responseraise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {method:css selector,selector:[idkw]}(Session info: chrome110.0.5481.178)2023-03-07 17:16:00,445 23748 INFO result.py(96) - 测试结束 test_search (test_baidu.TestCase) 2023-03-07 17:16:00,445 23748 INFO result.py(97) - 耗时 2.0103440284729004 2023-03-07 17:16:00,445 23748 INFO result.py(70) - 测试延迟启动0.1s 2023-03-07 17:16:00,561 23748 INFO result.py(73) - 开始测试 test_serach_clear (test_baidu.TestCase) 2023-03-07 17:16:00,566 23748 ERROR result.py(191) - 测试产生错误 test_serach_clear (test_baidu.TestCase) Traceback (most recent call last):File F:\Automated-UITest-demo-update - htmlreport\testcase\test_baidu.py, line 49, in test_serach_clearself.driver.find_element_by_id(kw).send_keys(csdn) # 输入csdnFile D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 360, in find_element_by_idreturn self.find_element(byBy.ID, valueid_)File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 978, in find_elementvalue: value})[value]File D:\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py, line 321, in executeself.error_handler.check_response(response)File D:\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py, line 242, in check_responseraise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {method:css selector,selector:[idkw]}(Session info: chrome110.0.5481.178)2023-03-07 17:16:00,567 23748 INFO result.py(96) - 测试结束 test_serach_clear (test_baidu.TestCase) 2023-03-07 17:16:00,567 23748 INFO result.py(97) - 耗时 0.0060002803802490234 2023-03-07 17:16:00,567 23748 INFO result.py(70) - 测试延迟启动0.1s 2023-03-07 17:16:00,670 23748 INFO result.py(73) - 开始测试 test_windows_size (test_baidu.TestCase) 2023-03-07 17:16:05,441 23748 INFO result.py(172) - 测试执行通过 test_windows_size (test_baidu.TestCase) 2023-03-07 17:16:05,442 23748 INFO result.py(96) - 测试结束 test_windows_size (test_baidu.TestCase) 2023-03-07 17:16:05,442 23748 INFO result.py(97) - 耗时 4.770826101303101 2023-03-07 17:16:09,611 25872 INFO test_runner.py(199) - Pass test_windows_size (test_baidu.TestCase)2023-03-07 17:16:09,612 25872 ERROR test_runner.py(201) - Error test_back_refresh (test_baidu.TestCase) Error test_search (test_baidu.TestCase) Error test_serach_clear (test_baidu.TestCase)2023-03-07 17:16:09,614 25872 INFO test_runner.py(219) - 测试结束 运行时间: 0:00:13.857089 共计执行用例数量4 执行成功用例数量1 执行失败用例数量0 跳过执行用例数量0 产生异常用例数量35.3.3 xxx.xml ?xml version1.0 encodingUTF-8? testsuites name关于HTMLReport的实际项目应用 errors3 failures0 tests4 skipped0 time13.857089 testsuite nametest_baidu.TestCase id0 errors3 skipped0 tests4 failures0 time6.934138298034668testcase nametest_back_refresh classnametest_baidu.TestCase.test_back_refresh time0.14696788787841797error//testcasetestcase nametest_search classnametest_baidu.TestCase.test_search time2.0103440284729004error//testcasetestcase nametest_serach_clear classnametest_baidu.TestCase.test_serach_clear time0.0060002803802490234error//testcasetestcase nametest_windows_size classnametest_baidu.TestCase.test_windows_size time4.770826101303101/testcase/testsuite /testsuites5.4 testcase 注意这个用例只是说明测试报告的生成没有对用例严格按照标准写比如断言等 # -*- coding:utf-8 -*- # 作者虫无涯 # 日期2023/3/7 # 文件名称test_baidu.py # Function打开百度网主页在搜索栏输入“helloworld”from selenium import webdriver from selenium.webdriver.common.keys import Keys import time import unittestclass TestCase(unittest.TestCase):classmethoddef setUpClass(cls) - None:cls.driver webdriver.Chrome() # 打开Chrome浏览器cls.driver.get(http://www.baidu.com) # 输入百度网址print(验证浏览器的基本控制)classmethoddef tearDownClass(cls) - None:cls.driver.quit() # 关闭浏览器def test_search(self):print(1、搜索helloworld.并回车......)time.sleep(2)self.driver.find_element_by_id(kw).send_keys(helloworld) # 输入“helloworld”time.sleep(2)self.driver.find_element_by_id(kw).send_keys(Keys.ENTER) # 回车进行搜索time.sleep(2)self.driver.maximize_window() # 最大化当前窗口def test_windows_size(self):print(2、浏览器窗口大小缩小为640*480......)time.sleep(2)self.driver.set_window_size(640, 480) # 控制浏览器显示尺寸为640*480time.sleep(0.5)self.driver.maximize_window() # 最大化当前窗口time.sleep(2)def test_back_refresh(self):print(3、先进行浏览器后退再次输入csdn进行搜索)self.driver.back()self.driver.find_element_by_id(kw).send_keys(csdn) # 输入csdntime.sleep(1)self.driver.refresh() # 刷新def test_serach_clear(self):print(4、清空输入的内容......)self.driver.find_element_by_id(kw).send_keys(csdn) # 输入csdntime.sleep(2)self.driver.find_element_by_id(kw).clear()time.sleep(0.5)def csdn(self):print(5、进入csdn官网)self.driver.find_element_by_id(kw).send_keys(csdn) # 输入csdntime.sleep(2)self.driver.find_element_by_id(kw).send_keys(Keys.ENTER) # 回车进行搜索time.sleep(2)self.driver.find_element_by_xpath(//*[id1]/h3/a[1]).click()time.sleep(2)windows self.driver.window_handlesself.driver.switch_to.window(windows[-1])now_url self.driver.current_urlm_get_url https://www.csdn.net/if now_url m_get_url:print(经过判断已经进入csdn官网)else:print(未进入到csdn官网请检查代码)if __name__ __main__:unittest.main() 5.5 main.py # -*- coding:utf-8 -*- # 作者虫无涯 # 日期2023/3/7 # 文件名称main.py # 作用框架的主入口函数import time from common.reportOut import report_out from common.sendMain import send_main import osdef acquire_report_address(reports_address):#这里方法略获取最新的测试报告作为邮件的附件def run_case():print(开始执行)curpath os.path.dirname(os.path.realpath(__file__))report_dir os.path.join(curpath, report/) # 测试报告存放目录test_dir os.path.join(curpath, testcase/) # 测试用例读取目录name_project 关于HTMLReport的实际项目应用report_out(test_dir, report_dir, name_project)time.sleep(5)# 这里方法略调用邮件方法即可print(执行结束)if __name__ __main__:run_case()6 运行结果 会在report目录下生成三个文件 命令行输出 测试报告 『《假如生活欺骗了你》俄·普希金』 假如生活欺骗了你 不要悲伤不要心急 忧郁的日子里须要镇静 相信吧快乐的日子将会来临 心儿永远向往着未来 现在却常是忧郁。 一切都是瞬息一切都将会过去 而那过去了的就会成为亲切的怀恋。
http://www.dnsts.com.cn/news/52495.html

相关文章:

  • 为什么网站数量减少网站开发整体流程图
  • 做网站公司做网站公司沪佳装修贵吗
  • 怎么在网站添加关键词铜陵网站建设价格
  • 2024免费网站推广yandex搜索入口
  • 信息图表网站今科云平台网站建设
  • 网站动态好还是静态好php做网站子页模板
  • 最新网站制作wordpress添加顶和踩
  • 宁国市网站关键词优化外包建设一个打鱼游戏网站
  • 资讯平台网站模板企业网站建设的实验报告
  • 建设网站需要哪些域名开发一套软件app
  • 杭州市萧山区市场建设开发网站列举网免费发布信息网
  • 网站络全网关键词搜索排行
  • 商丘哪里做网站比较好怎样做农产品交易平台网站
  • 邢台建设网站公司wordpress网站布局
  • 刚备案的域名如何做网站柒比贰wordpress主题
  • 怎么做 代刷网站建设云企业服务平台
  • wordpress建站 网盘视频教程重庆高端网站建设公司
  • 南京网站开发长春手机网站
  • 爱网站搭建免费做团购网站的软件有哪些
  • 临沂网站建设推广重庆网站设计开发培训学校
  • 免费做网站软件2003化妆品网站的搭建
  • 黄页推广服务seo优化排名营销
  • 高端手机网站定制政务信息系统网站建设规范
  • 展示型网站建哪个兄弟给个地址呀
  • 怎么做网站省钱wordpress 主题 小说
  • 1元云购网站怎样建设wordpress手机端在哪里调
  • 郑州汽车网站建设哪家好comment_form wordpress
  • 黄石网站设计制作公司乡村建设相关网站
  • 都芳漆中文网站建设湘潭做网站
  • 自助建站平台有哪些商标与logo的区别