Commit 16c3516a authored by 17322369953's avatar 17322369953
Browse files

air框架改造-登录案例改造

parent 9f105e0a
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1564910404604" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2319" xmlns:xlink="http://www.w3.org/1999/xlink" width="16" height="16"><defs><style type="text/css"></style></defs><path d="M515 68.5c-243.5 0-441.6 198.1-441.6 441.6S271.5 951.7 515 951.7s441.6-198.1 441.6-441.6S758.6 68.5 515 68.5z m0 809.6c-202.9 0-368-165.1-368-368s165.1-368 368-368 368 165.1 368 368-165 368-368 368z m171.1-259.8L533.4 530V289.3c0-20.3-16.5-36.8-36.8-36.8-20.3 0-36.8 16.5-36.8 36.8v257.6c0 13.7 17 25.1 28 31.4 3.1 4.6 11.4 8.8 16.6 11.7l151.8 92c17.6 10.2 36.7 4.1 46.8-13.5 10.2-17.5 0.7-40-16.9-50.2z" fill="#ffffff" p-id="2320"></path></svg>
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.

// 基于准备好的dom,初始化echarts实例
//var myChart = echarts.init(document.getElementById('pfm_chart'), 'shine');
//var colors = ['#5793f3', '#d14a61', '#675bba'];
// 指定图表的配置项和数据
option = {
//color: colors,
title: {
text: '性能数据监控'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross'
}
// tooltip 提示文字在这里补充
},
grid: {
right: '20%'
},
legend: {
data:['cpu使用率','pss内存占用','net网络流量']
},
toolbox: {
feature: {
saveAsImage: {}
}
},
dataZoom: [
{
show: true,
realtime: true,
start: 0,
end: 100
},
{
type: 'inside',
realtime: true,
start: 0,
end: 100
}],
xAxis: {
type: 'category',
boundaryGap: false,
data: []
},
yAxis: [{
type: 'value',
name: 'cpu使用率',
position: 'left',
/*
axisLine: {
lineStyle: {
color: colors[0]
}
},
*/
axisLabel: {
formatter: '{value} %'
}
},
{
type: 'value',
name: 'pss内存占用',
position: 'right',
offset: 80,
/*
axisLine: {
lineStyle: {
color: colors[1]
}
},
*/
axisLabel: {
formatter: '{value} MB'
}
},
{
type: 'value',
name: 'net网络流量',
position: 'right',
/*
axisLine: {
lineStyle: {
color: colors[2]
}
},
*/
axisLabel: {
formatter: '{value} KB/S'
}
}
],
series: [
{
name:'cpu使用率',
type:'line',
yAxisIndex: 0,
data:[],
tooltip: {
formatter: '{a0}: {c0}%'
}
},
{
name:'pss内存占用',
type:'line',
yAxisIndex: 1,
data:[]
},
{
name:'net网络流量',
type:'line',
yAxisIndex: 2,
data:[]
}
]
};
function load_data() {
if (json_data === null) {
console.log("test");
} else {
$.each(json_data, function(i, n) {
if (n.serialno === "") {
var myChart = echarts.init(document.getElementById('pfm'), 'shine');
option.title.text = '设备性能数据监控';
} else {
var myChart = echarts.init(document.getElementById('pfm_' + n.serialno), 'shine');
option.title.text = '设备' + n.serialno + '性能数据监控';
}
option.xAxis.data = n.times;
option.series[0].data = n.cpu;
option.series[1].data = n.pss;
option.series[2].data = n.net_flow;
myChart.setOption(option);
})
}
}
load_data();
\ No newline at end of file
(function (root, factory) {if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['exports', 'echarts'], factory);
} else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
// CommonJS
factory(exports, require('echarts'));
} else {
// Browser globals
factory({}, root.echarts);
}
}(this, function (exports, echarts) {
var log = function (msg) {
if (typeof console !== 'undefined') {
console && console.error && console.error(msg);
}
};
if (!echarts) {
log('ECharts is not Loaded');
return;
}
var colorPalette = [
'#c12e34','#e6b600','#0098d9','#2b821d',
'#005eaa','#339ca8','#cda819','#32a487'
];
var theme = {
color: colorPalette,
title: {
textStyle: {
fontWeight: 'normal'
}
},
visualMap: {
color:['#1790cf','#a2d4e6']
},
toolbox: {
iconStyle: {
normal: {
borderColor: '#06467c'
}
}
},
tooltip: {
backgroundColor: 'rgba(0,0,0,0.6)'
},
dataZoom: {
dataBackgroundColor: '#dedede',
fillerColor: 'rgba(154,217,247,0.2)',
handleColor: '#005eaa'
},
timeline: {
lineStyle: {
color: '#005eaa'
},
controlStyle: {
normal: {
color: '#005eaa',
borderColor: '#005eaa'
}
}
},
candlestick: {
itemStyle: {
normal: {
color: '#c12e34',
color0: '#2b821d',
lineStyle: {
width: 1,
color: '#c12e34',
color0: '#2b821d'
}
}
}
},
graph: {
color: colorPalette
},
map: {
label: {
normal: {
textStyle: {
color: '#c12e34'
}
},
emphasis: {
textStyle: {
color: '#c12e34'
}
}
},
itemStyle: {
normal: {
borderColor: '#eee',
areaColor: '#ddd'
},
emphasis: {
areaColor: '#e6b600'
}
}
},
gauge: {
axisLine: {
show: true,
lineStyle: {
color: [[0.2, '#2b821d'],[0.8, '#005eaa'],[1, '#c12e34']],
width: 5
}
},
axisTick: {
splitNumber: 10,
length:8,
lineStyle: {
color: 'auto'
}
},
axisLabel: {
textStyle: {
color: 'auto'
}
},
splitLine: {
length: 12,
lineStyle: {
color: 'auto'
}
},
pointer: {
length: '90%',
width: 3,
color: 'auto'
},
title: {
textStyle: {
color: '#333'
}
},
detail: {
textStyle: {
color: 'auto'
}
}
}
};
echarts.registerTheme('shine', theme);
}));
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Lang.prototype.pack.zh = {
"token": {
"Airtest Report": "Airtest 报告",
"script running report": "脚本运行报告",
"Contact Us": "联系我们",
"I am sorry, this log file is empty!": "你没有眼花,这个Log文件就是一片空白",
"Test Case": "测试用例",
"Steps: ": "步骤数:",
"Time: ": "耗时",
"Quick view": "快览",
"[Passed]": "[运行成功]",
"[Failed]": "[运行失败]",
'[Terminated]': "[任务超时]",
"Executors": "执行者",
"Author:": "作者:",
"Author: Anonymous": "作者:佚名",
"Device:": "设备:",
"Connect:": '连接:',
"Accomplished:": "已完成:",
"Rate:": '成功率:',
"Succeed:": '成功运行:',
'Failed:':'运行失败:',
"No of device:": '设备序号:',
"No of script:": "脚本序号:",
"Type:": '运行类型:',
"Assert: Test Steps Summary": "Assert 测试点汇总",
"Test step": "测试点",
"Steps:": "步骤数:",
"Expected result:": "预期结果:",
"order":"顺序",
"duration": "耗时",
"status": "状态",
"Jump to wrong step": "跳至错误步骤",
"Filter by:": "筛选:",
"All": "全部",
"Failed": "失败",
"Success": "成功",
"Assert": "断言",
"show all steps": "显示所有步骤",
"show success steps only": "只显示成功步骤",
"show failed steps only": "只显示失败步骤",
"show steps with assertion only": "只显示断言",
"No record information found.": "暂无设备录屏信息",
"Target object": "目标图片",
"Runtime screenshot": "运行时屏幕截图",
"Confidence:": "匹配度:",
"Execution finished successfully": "执行成功",
"Execution failed": "执行失败",
"Steps navigation": "步骤导航",
"Related information": "相关信息",
"Touch": "点击",
"Swipe": "滑动",
"Wait": "等待目标出现",
"Exists": "根据图片是否存在选择分支",
"Text": "输入",
"Keyevent": "按键",
"Sleep": "等待",
"Server call": "调用服务器方法",
"Assert exists": "断言目标存在",
"Assert not exists": "断言目标不存在",
"Snapshot": "截图",
"Assert equal": "断言相等",
"Assert not equal": "断言不相等",
"Assert:": "断言:",
"Title": "标题",
"Description:": "描述:",
"Time:": "时间:",
"Behavior:": "动作:",
"Start:": "时间:",
"Duration:": "耗时:",
"Status:": "结果:",
"Total": "",
"Warning: No steps": "警告:没有步骤",
"© 1997 - 2019 NetEase, Inc. All Rights Reserved.": "© 1997 - 2019 网易公司版权所有"
}
};
\ No newline at end of file
/*!
* Lazy Load - JavaScript plugin for lazy loading images
*
* Copyright (c) 2007-2017 Mika Tuupola
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/mit-license.php
*
* Project home:
* https://appelsiini.net/projects/lazyload
*
* Version: 2.0.0-beta.2
*
*/
(function (root, factory) {
if (typeof exports === "object") {
module.exports = factory(root);
} else if (typeof define === "function" && define.amd) {
define([], factory(root));
} else {
root.LazyLoad = factory(root);
}
}) (typeof global !== "undefined" ? global : this.window || this.global, function (root) {
"use strict";
const defaults = {
src: "data-src",
srcset: "data-srcset",
selector: ".lazyload"
};
/**
* Merge two or more objects. Returns a new object.
* @private
* @param {Boolean} deep If true, do a deep (or recursive) merge [optional]
* @param {Object} objects The objects to merge together
* @returns {Object} Merged values of defaults and options
*/
const extend = function () {
let extended = {};
let deep = false;
let i = 0;
let length = arguments.length;
/* Check if a deep merge */
if (Object.prototype.toString.call(arguments[0]) === "[object Boolean]") {
deep = arguments[0];
i++;
}
/* Merge the object into the extended object */
let merge = function (obj) {
for (let prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
/* If deep merge and property is an object, merge properties */
if (deep && Object.prototype.toString.call(obj[prop]) === "[object Object]") {
extended[prop] = extend(true, extended[prop], obj[prop]);
} else {
extended[prop] = obj[prop];
}
}
}
};
/* Loop through each object and conduct a merge */
for (; i < length; i++) {
let obj = arguments[i];
merge(obj);
}
return extended;
};
function LazyLoad(images, options) {
this.settings = extend(defaults, options || {});
this.images = images || document.querySelectorAll(this.settings.selector);
this.observer = null;
this.init();
}
LazyLoad.prototype = {
init: function() {
/* Without observers load everything and bail out early. */
if (!root.IntersectionObserver) {
this.loadImages();
return;
}
let self = this;
let observerConfig = {
root: null,
rootMargin: "0px",
threshold: [0]
};
this.observer = new IntersectionObserver(function(entries) {
entries.forEach(function (entry) {
if (entry.intersectionRatio > 0) {
self.observer.unobserve(entry.target);
let src = entry.target.getAttribute(self.settings.src);
let srcset = entry.target.getAttribute(self.settings.srcset);
if ("img" === entry.target.tagName.toLowerCase()) {
if (src) {
entry.target.src = src;
}
if (srcset) {
entry.target.srcset = srcset;
}
} else {
entry.target.style.backgroundImage = "url(" + src + ")";
}
}
});
}, observerConfig);
this.images.forEach(function (image) {
self.observer.observe(image);
});
},
loadAndDestroy: function () {
if (!this.settings) { return; }
this.loadImages();
this.destroy();
},
loadImages: function () {
if (!this.settings) { return; }
let self = this;
this.images.forEach(function (image) {
let src = image.getAttribute(self.settings.src);
let srcset = image.getAttribute(self.settings.srcset);
if ("img" === image.tagName.toLowerCase()) {
if (src) {
image.src = src;
}
if (srcset) {
image.srcset = srcset;
}
} else {
image.style.backgroundImage = "url(" + src + ")";
}
});
},
destroy: function () {
if (!this.settings) { return; }
this.observer.disconnect();
this.settings = null;
}
};
root.lazyload = function(images, options) {
return new LazyLoad(images, options);
};
if (root.jQuery) {
const $ = root.jQuery;
$.fn.lazyload = function (options) {
options = options || {};
options.attribute = options.attribute || "data-src";
new LazyLoad($.makeArray(this), options);
return this;
};
}
return LazyLoad;
});
!function(t, i) {
"function" == typeof define && define.amd ? define(["jquery"], i) : "object" == typeof exports ? module.exports = i() : t.Query = i(window.Zepto || window.jQuery || $)
}(this, function(t) {
return {
getQuery: function(t, e, s) {
new RegExp("(^|&|#)" + t + "=([^&]*)(&|$|#)","i");
s = s || window;
var a, n, r = s.location.href, l = "";
if (a = "#" == e ? r.split("#") : r.split("?"),
"" != (n = 1 == a.length ? "" : a[1])) {
gg = n.split(/&|#/);
var h = gg.length;
for (str = arguments[0] + "=",
i = 0; i < h; i++)
if (0 == gg[i].indexOf(str)) {
l = gg[i].replace(str, "");
break
}
}
return decodeURI(l)
},
getForm: function(i) {
var e = {}
, s = {};
t(i).find("*[name]").each(function(i, a) {
var n, r = t(a).attr("name"), l = t.trim(t(a).val()), h = [];
if ("" != r && !t(a).hasClass("getvalued")) {
if ("money" == t(a).data("type") && (l = l.replace(/\,/gi, "")),
"radio" == t(a).attr("type")) {
var c = null;
t("input[name='" + r + "']:radio").each(function() {
t(this).is(":checked") && (c = t.trim(t(this).val()))
}),
l = c || ""
}
if ("checkbox" == t(a).attr("type")) {
var c = [];
t("input[name='" + r + "']:checkbox").each(function() {
t(this).is(":checked") && c.push(t.trim(t(this).val()))
}),
l = c.length ? c.join(",") : ""
}
if (t(a).attr("listvalue") && (e[t(a).attr("listvalue")] || (e[t(a).attr("listvalue")] = [],
t("input[listvalue='" + t(a).attr("listvalue") + "']").each(function() {
if ("" != t(this).val()) {
var i = t(this).attr("name")
, s = {};
if ("json" == t(this).data("type") ? s[i] = JSON.parse(t(this).val()) : s[i] = t.trim(t(this).val()),
t(this).attr("paramquest")) {
var n = JSON.parse(t(this).attr("paramquest"));
s = t.extend(s, n)
}
e[t(a).attr("listvalue")].push(s),
t(this).addClass("getvalued")
}
}))),
t(a).attr("arrayvalue") && (e[t(a).attr("arrayvalue")] || (e[t(a).attr("arrayvalue")] = [],
t("input[arrayvalue='" + t(a).attr("arrayvalue") + "']").each(function() {
if ("" != t(this).val()) {
var i = {};
if (i = "json" == t(this).data("type") ? JSON.parse(t(this).val()) : t.trim(t(this).val()),
t(this).attr("paramquest")) {
var s = JSON.parse(t(this).attr("paramquest"));
i = t.extend(i, s)
}
e[t(a).attr("arrayvalue")].push(i)
}
}))),
"" != r && !t(a).hasClass("getvalued"))
if (r.match(/\./)) {
if (h = r.split("."),
n = h[0],
3 == h.length)
s[h[1]] = s[h[1]] || {},
s[h[1]][h[2]] = l;
else if ("json" == t(a).data("type")) {
if (s[h[1]] = JSON.parse(l),
t(a).attr("paramquest")) {
var p = JSON.parse(t(a).attr("paramquest"));
s[h[1]] = t.extend(s[h[1]], p)
}
} else
s[h[1]] = l;
e[n] ? e[n] = t.extend({}, e[n], s) : e[n] = s
} else
e[r] = l
}
});
var a = {};
for (var n in e) {
var r = e[n];
a[n] = "object" == typeof r ? JSON.stringify(r) : e[n]
}
return t(".getvalued").removeClass("getvalued"),
a
},
setHash: function(i) {
var e = "";
i = t.extend(this.getHash(), i);
var s = [];
for (var a in i)
"" != i[a] && s.push(a + "=" + encodeURIComponent(i[a]));
return e += s.join("&"),
location.hash = e,
this
},
getHash: function(t) {
if ("string" == typeof t)
return this.getQuery(t, "#");
var i = {}
, e = location.hash;
if (e.length > 0) {
e = e.substr(1);
for (var s = e.split("&"), a = 0, n = s.length; a < n; a++) {
var r = s[a].split("=");
r.length > 0 && (i[r[0]] = decodeURI(r[1]) || "")
}
}
return i
}
}
}),
function(t, i) {
"function" == typeof define && define.amd ? define(["jquery", "query"], i) : "object" == typeof exports ? module.exports = i() : t.Paging = i(window.Zepto || window.jQuery || $, Query)
}(this, function(t, i) {
function e() {
var t = Math.random().toString().replace(".", "");
this.id = "Paging_" + t
}
return t.fn.Paging = function(i) {
var s = [];
return t(this).each(function() {
var a = t.extend({
target: t(this)
}, i)
, n = new e;
n.init(a),
s.push(n)
}),
s
}
,
e.prototype = {
init: function(i) {
this.settings = t.extend({
callback: null,
pagesize: 10,
current: 1,
prevTpl: "Prev",
nextTpl: "Next",
firstTpl: "First",
lastTpl: "Last",
ellipseTpl: "...",
toolbar: !1,
hash: !1,
pageSizeList: [5, 10, 15, 20]
}, i),
this.target = t(this.settings.target),
this.container = t('<div id="' + this.id + '" class="ui-paging-container"/>'),
this.target.append(this.container),
this.render(this.settings),
this.format(),
this.bindEvent()
},
render: function(t) {
void 0 !== t.count ? this.count = t.count : this.count = this.settings.count,
void 0 !== t.pagesize ? this.pagesize = t.pagesize : this.pagesize = this.settings.pagesize,
void 0 !== t.current ? this.current = t.current : this.current = this.settings.current,
this.pagecount = Math.ceil(this.count / this.pagesize),
this.format()
},
bindEvent: function() {
var i = this;
this.container.on("click", "li.js-page-action,li.ui-pager", function(e) {
if (t(this).hasClass("ui-pager-disabled") || t(this).hasClass("focus"))
return !1;
t(this).hasClass("js-page-action") ? (t(this).hasClass("js-page-first") && (i.current = 1),
t(this).hasClass("js-page-prev") && (i.current = Math.max(1, i.current - 1)),
t(this).hasClass("js-page-next") && (i.current = Math.min(i.pagecount, i.current + 1)),
t(this).hasClass("js-page-last") && (i.current = i.pagecount)) : t(this).data("page") && (i.current = parseInt(t(this).data("page"))),
i.go()
})
},
go: function(t) {
var e = this;
this.current = t || this.current,
this.current = Math.max(1, e.current),
this.current = Math.min(this.current, e.pagecount),
this.format(),
this.settings.hash && i.setHash({
page: this.current
}),
this.settings.callback && this.settings.callback(this.current, this.pagesize, this.pagecount)
},
changePagesize: function(t) {
this.render({
pagesize: t
}),
this.settings.changePagesize && this.settings.changePagesize.call(this, this.pagesize, this.current, this.pagecount)
},
format: function() {
var i = "<ul>";
if (i += '<li class="js-page-first js-page-action ui-pager" >' + this.settings.firstTpl + "</li>",
i += '<li class="js-page-prev js-page-action ui-pager">' + this.settings.prevTpl + "</li>",
this.pagecount > 6) {
if (i += '<li data-page="1" class="ui-pager">1</li>',
this.current <= 2)
i += '<li data-page="2" class="ui-pager">2</li>',
i += '<li data-page="3" class="ui-pager">3</li>',
i += '<li class="ui-paging-ellipse">' + this.settings.ellipseTpl + "</li>";
else if (this.current > 2 && this.current <= this.pagecount - 2)
this.current > 3 && (i += "<li>" + this.settings.ellipseTpl + "</li>"),
i += '<li data-page="' + (this.current - 1) + '" class="ui-pager">' + (this.current - 1) + "</li>",
i += '<li data-page="' + this.current + '" class="ui-pager">' + this.current + "</li>",
i += '<li data-page="' + (this.current + 1) + '" class="ui-pager">' + (this.current + 1) + "</li>",
this.current < this.pagecount - 2 && (i += '<li class="ui-paging-ellipse" class="ui-pager">' + this.settings.ellipseTpl + "</li>");
else {
i += '<li class="ui-paging-ellipse" >' + this.settings.ellipseTpl + "</li>";
for (var e = this.pagecount - 2; e < this.pagecount; e++)
i += '<li data-page="' + e + '" class="ui-pager">' + e + "</li>"
}
i += '<li data-page="' + this.pagecount + '" class="ui-pager">' + this.pagecount + "</li>"
} else
for (var e = 1; e <= this.pagecount; e++)
i += '<li data-page="' + e + '" class="ui-pager">' + e + "</li>";
i += '<li class="js-page-next js-page-action ui-pager">' + this.settings.nextTpl + "</li>",
i += '<li class="js-page-last js-page-action ui-pager">' + this.settings.lastTpl + "</li>",
i += "</ul>",
this.container.html(i),
1 == this.current && (t(".js-page-prev", this.container).addClass("ui-pager-disabled"),
t(".js-page-first", this.container).addClass("ui-pager-disabled")),
this.current == this.pagecount && (t(".js-page-next", this.container).addClass("ui-pager-disabled"),
t(".js-page-last", this.container).addClass("ui-pager-disabled")),
this.container.find('li[data-page="' + this.current + '"]').addClass("focus").siblings().removeClass("focus"),
this.settings.toolbar && this.bindToolbar()
},
bindToolbar: function() {
for (var i = this, e = t('<li class="ui-paging-toolbar"><select class="ui-select-pagesize"></select><input type="text" class="ui-paging-count"/></li>'), s = t(".ui-select-pagesize", e), a = "", n = 0, r = this.settings.pageSizeList.length; n < r; n++)
a += '<option value="' + this.settings.pageSizeList[n] + '">' + this.settings.pageSizeList[n] + "</option>";
s.html(a),
s.val(this.pagesize),
t("input", e).val(this.current),
t("input", e).click(function() {
t(this).select()
}).keydown(function(e) {
if (13 == e.keyCode) {
var s = parseInt(t(this).val()) || 1;
i.go(s)
}
}),
t("a", e).click(function() {
var e = parseInt(t(this).prev().val()) || 1;
i.go(e)
}),
s.change(function() {
i.changePagesize(t(this).val())
}),
this.container.children("ul").append(e)
}
},
e
});
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE html>
<html>
<head>
<title>测试结果汇总</title>
<style>
table,table tr th,table tr td {
border:1px solid #ccc;
border-collapse: collapse;
color: #669;
padding: 6px 8px;
font-size: 14px;
}
table caption {
font-size: 14px;
color: #039;
text-align: left;
margin-top: 10px;
margin-bottom: -10px;
margin-left: -10px;
}
.fail {
color: red;
width: 7em;
text-align: center;
}
.success {
color: green;
width: 7em;
text-align: center;
}
.details-col-elapsed {
width: 7em;
text-align: center;
}
.details-col-msg {
width: 7em;
text-align: center;
background-color:#ccc;
}
</style>
</head>
<body>
<div>
<!--<div><h2>Test Statistics</h2></div>-->
<table width="1000">
<caption><ul><li>测试概要</li></ul></caption>
<tr width="600">
<th width="300" class='details-col-msg'>用例总数</th>
<th class='details-col-msg'>成功数</th>
<th class='details-col-msg'>运行用时</th>
<th class='details-col-msg'>成功率</th>
</tr>
<tr width="600">
<td class='details-col-elapsed'>1</td>
<td class='details-col-elapsed'>0</td>
<td class='details-col-elapsed'>0分8秒</td>
<td class="details-col-elapsed">0.0%</td>
</tr>
</table>
<!--<div><h2>Test detail</h2></div>-->
<table width="1000">
<caption><ul><li>测试列表</li></ul></caption>
<tr width="600">
<th width="400" class='details-col-msg'>用例名称</th>
<th class='details-col-msg'>执行结果</th>
<th class='details-col-msg'>执行时间(秒)</th>
<th class='details-col-msg'>用例作者</th>
</tr>
<tr width="600">
<td class="details-col-elapsed"><a href='../log/baidu/log.html' target='_blank'>baidu</a></td>
<td class="fail">失败</td>
<td class="details-col-elapsed">8.554</td>
<td class="details-col-elapsed">Administrator</td>
</tr>
</table>
<div><h2></h2></div>
</div>
</body>
</html>
\ No newline at end of file
This diff is collapsed.
......@@ -3,6 +3,7 @@ from selenium.webdriver.remote.webdriver import By
class PageBuy(PageLogin):
"""基础元素"""
# 采购管理元素
_buy_management_locator = (By.XPATH, '//div[@class="menuNavItem" and @sysname="采购管理"]')
# 采购业务元素
......
This diff is collapsed.
# author:qinguanglei
# ddate:2023/11/22 9:16
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment