Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
V
Vue-WebDriver
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
高源
Vue-WebDriver
Commits
75a6b6dc
Commit
75a6b6dc
authored
Nov 18, 2023
by
高源
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sdk-table 重构
parent
4d941edf
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
313 additions
and
37 deletions
+313
-37
collectionTable.vue
src/components/collectionTable.vue
+32
-5
sdk-table.js
src/sdk-table.js
+281
-32
No files found.
src/components/collectionTable.vue
View file @
75a6b6dc
...
...
@@ -50,7 +50,8 @@
<
script
>
import
VXETable
,
{
t
}
from
'vxe-table'
import
{
getTableData
}
from
'../sdk'
// import { getTableData } from '../sdk'
import
{
cell
,
checkTableFromXpaths
}
from
'../sdk-table'
export
default
{
name
:
'collectionTable'
,
components
:
{},
...
...
@@ -64,7 +65,9 @@ export default {
firstXpath
:
[],
somePath
:
''
,
index
:
0
,
Xpaths
:[]
Xpaths
:
[],
sdkXPath
:
[],
checkTableFrom
:
null
}
},
created
()
{
...
...
@@ -76,8 +79,25 @@ export default {
computed
:
{},
methods
:
{
getTable
()
{
//表格展示配置
let
_this
=
this
console
.
log
(
_this
.
sdkXPath
)
_this
.
checkTableFrom
=
checkTableFromXpaths
(
_this
.
sdkXPath
)
console
.
log
(
_this
.
checkTableFrom
)
_this
.
tableData
=
_this
.
checkTableFrom
.
tableData
console
.
log
(
_this
.
tableData
)
this
.
tableColumn
=
[]
for
(
let
i
=
0
;
i
<
_this
.
tableData
.
length
;
i
++
)
{
let
objs
=
{}
objs
.
field
=
(
'content'
+
i
)
+
'.content'
objs
.
title
=
'请填写标题'
objs
.
width
=
145
_this
.
tableColumn
.
push
(
objs
)
}
_this
.
isSelectTable
=
false
return
//表格展示配置
_this
.
tableData
=
[]
_this
.
tableColumn
=
[]
_this
.
tableData
=
getTableData
(
_this
.
Xpaths
)
...
...
@@ -94,7 +114,6 @@ export default {
console
.
log
(
_this
.
tableData
)
return
},
...
...
@@ -148,6 +167,14 @@ export default {
_this
.
SelectTableData
.
push
(
obj
)
_this
.
firstXpath
.
push
(
elementInfo
.
Xpath
)
_this
.
Xpaths
.
push
(
elementInfo
.
Xpath
)
// sdkTable--------------------------------------------------------------------------------------------------------
var
selectCell
=
new
cell
(
elementInfo
.
Xpath
,
'cellName'
,
'text'
,
'title'
)
// console.log(selectCell)
_this
.
sdkXPath
.
push
(
selectCell
)
// sdkTable--------------------------------------------------------------------------------------------------------
// 移除事件监听器
document
.
removeEventListener
(
'contextmenu'
,
contextMenuHandler
);
}
...
...
@@ -172,7 +199,7 @@ export default {
}
}
},
},
}
</
script
>
...
...
src/sdk-table.js
View file @
75a6b6dc
...
...
@@ -5,23 +5,31 @@
* @param {string} type 元素取值类型,文本,链接,元素路径(点击动作用)
* @param {string} title 标题信息
*/
var
cell
=
function
(
xpath
,
name
,
type
,
title
)
{
let
Xpath
=
xpath
,
Name
=
name
,
Type
=
type
,
Title
=
title
;
//初始化
let
_xpathArray
=
xpath
.
split
(
'/'
);
let
ParentXpath
=
null
,
RelativeXpath
=
null
;
function
cell
(
xpath
,
name
,
type
,
title
)
{
// 初始化
this
.
xpath
=
xpath
;
this
.
name
=
name
;
this
.
type
=
type
;
this
.
title
=
title
;
var
_xpathArray
=
this
.
xpath
.
split
(
'/'
);
this
.
ParentXpath
=
null
;
this
.
RelativeXpath
=
null
;
/**
* 根据父路径更新当前的相对路径
* @param {string[]} parentXpath 父路径
*/
function
updateRelativePath
(
parentXpath
)
{
ParentXpath
=
parentXpath
;
//其实这边严谨的来说要验证一下XPath是否真的有相同的根
RelativeXpath
=
_xpathArray
.
slice
(
parentXpath
.
length
);
this
.
updateRelativePath
=
function
(
parentXpath
)
{
this
.
ParentXpath
=
parentXpath
;
//其实这边严谨的来说要验证一下XPath是否真的有相同的根
this
.
RelativeXpath
=
_xpathArray
.
slice
(
parentXpath
.
length
);
// console.log(this.ParentXpath)
let
absolutePath
=
this
.
ParentXpath
.
join
(
'/'
)
+
'/'
+
this
.
RelativeXpath
.
join
(
'/'
);
return
absolutePath
}
/**
* 根据索引获取值
* @param {any} index 索引号
*/
function
getValue
(
index
)
{
this
.
getValue
=
function
(
index
)
{
}
return
this
;
//返回当前对象
}
...
...
@@ -30,40 +38,56 @@ var cell = function (xpath, name, type, title) {
* @param {cell[]} tags 元素集合{xpath=XPath,name=返回的属性名,title=标题信息,type=操作类型:文本,链接,元素路径(点击动作用),relativePath=相对路径(最终的)}
* @returns {any} 返回对象信息{}
*/
function
checkTableFromXpaths
(
cells
)
{
function
checkTableFromXpaths
(
cells
)
{
let
rtns
=
null
;
let
absolutePaths
=
[];
//绝对路径集合
let
relativeXpaths
=
[];
//相对路径集合
let
tableData
=
[]
//最后界面展示数据
//先找到共同的根以及各路径在共同根下的相对路径
let
parent
=
getCommonParentXPath
(
cells
);
if
(
parent
==
null
||
parent
.
length
==
0
)
return
rtns
;
//如果找不到直接返回null
cells
.
forEach
(
o
=>
o
.
updateRelativePath
(
parent
));
//更新每个cell的相对路径
cells
.
forEach
(
o
=>
absolutePaths
.
push
(
o
.
updateRelativePath
(
parent
)
));
//更新每个cell的相对路径
while
(
parent
.
length
>
0
)
{
if
(
verifyTable
(
parent
,
absolutePaths
))
break
;
//如果验证表结构成功,就可以退出了
parent
.
pop
();
//向上一级找
cells
.
forEach
(
o
=>
o
.
updateRelativePath
(
parent
));
//更新每个cell的相对路径
if
(
verifyTable
(
parent
,
absolutePaths
,
cells
))
break
;
//如果验证表结构成功,就可以退出了
//
parent.pop();//向上一级找
//
cells.forEach(o => o.updateRelativePath(parent));//更新每个cell的相对路径
}
if
(
parent
.
length
===
0
)
return
rtns
;
//如果父对象都为空了,直接返回null
let
tableData
=
getTableData
(
parent
,
relativeXpaths
);
//根据验证后的信息来获取表
// 循环数组将相对路径取出
for
(
let
i
=
0
;
i
<
cells
.
length
;
i
++
)
{
let
relativeXpath
=
cells
[
i
].
RelativeXpath
.
join
(
'/'
)
// 转换字符
relativeXpaths
.
push
(
relativeXpath
)
}
// let tableData = getTableData(cells[0].ParentXpath, relativeXpaths);//根据验证后的信息来获取表
// console.log(tableData)
// 获取当前表结构的所有xpath,
let
resultElement
=
combineXPaths
(
cells
[
0
].
ParentXpath
,
relativeXpaths
);
// 表数据查找 返回界面需要的表结构
tableData
=
getTableData
(
resultElement
)
// 返回最终结果
rtns
=
{
parent
:
parent
,
parent
:
cells
[
0
].
ParentXpath
,
relativeXpaths
:
relativeXpaths
,
tableData
:
null
tableData
:
tableData
};
return
rtns
;
return
rtns
}
/**
* 返回多个元素XPath的共同父节点,返回数组以方便向上移动
* @param {string[]} absolutePaths Xpath绝对路径集合
* @returns {string[]} 返回string[]的共同的根的各部分的集合
*/
function
getCommonParentXPath
(
tags
)
{
function
getCommonParentXPath
(
tags
)
{
let
rtns
=
null
;
if
(
!
tags
||
tags
.
length
===
0
)
return
rtns
;
let
allXpaths
=
tags
.
map
(
path
=>
tag
.
xpath
.
split
(
'/'
));
// 分割每个路径为组成部分
// 检查输入参数是否有效
if
(
!
tags
||
tags
.
length
===
0
)
return
null
;
let
allXpaths
=
tags
.
map
(
path
=>
path
.
xpath
.
split
(
'/'
));
// 分割每个路径为组成部分
rtns
=
[];
// 查找公共前缀
for
(
let
i
=
0
;
i
<
allXpaths
[
0
].
length
;
i
++
)
{
if
(
allXpaths
.
every
(
path
=>
path
[
i
]
===
allXpaths
[
0
][
i
]))
{
// 检查所有路径是否有这个部分
rtns
.
push
(
allXpaths
[
0
][
i
]);
}
else
{
break
;
}
//如果发现不同的,直接就可以退出了
}
else
{
break
;
}
//如果发现不同的,直接就可以退出了
}
return
rtns
;
}
...
...
@@ -74,7 +98,7 @@ function getCommonParentXPath(tags) {
* @param {string[]} absoluteXpaths 绝对路径集合
* @returns {string[]} 返回string[]的相对路径集合
*/
function
getRelativeXPaths
(
parentXpath
,
absoluteXpaths
)
{
function
getRelativeXPaths
(
parentXpath
,
absoluteXpaths
)
{
let
rtns
=
[];
let
splitPaths
=
absolutePaths
.
map
(
path
=>
path
.
split
(
'/'
));
splitPaths
.
map
(
path
=>
rtns
.
push
(
path
.
slice
(
parentXpath
.
length
)));
...
...
@@ -84,18 +108,243 @@ function getRelativeXPaths(parentXpath, absoluteXpaths) {
* 验证表结构是否正确
* @param {string[]} parentXPath 父节点路径集合
* @param {string[]} relativeXPaths 相对路径集合
* @param {cells[]} cells 元素集合{xpath=XPath,name=返回的属性名,title=标题信息,type=操作类型:文本,链接,元素路径(点击动作用),relativePath=相对路径(最终的)}
* @returns {boolean} 返回true为表结构正确
*/
function
verifyTable
(
parentXPath
,
relativeXPaths
)
{
return
false
;
function
verifyTable
(
parentXPath
,
relativeXPaths
,
cells
)
{
// 验证初始路径是否存在
if
(
!
allElementsExist
(
relativeXPaths
))
{
return
false
;
}
parentXPath
=
parentXPath
.
join
(
'/'
)
// 去除相同部分并保留不同的部分
let
modifiedRelativeXPaths
=
relativeXPaths
.
map
(
path
=>
removeCommonPart
(
path
,
parentXPath
));
// 自增 parentXPath 的最后一个节点的下标
parentXPath
=
incrementLastIndex
(
parentXPath
);
// 拼接新路径并验证
let
newPaths
=
modifiedRelativeXPaths
.
map
(
relativePath
=>
parentXPath
+
relativePath
);
// console.log(newPaths)
return
allElementsExist
(
newPaths
,
cells
);
}
/**
* 验证路径是否都能被找到
* @param {array[]} paths 拼接的xpath集合,
* @param {cells[]} cells 单元格数组
* @returns {boolean} 返回true,组合的路径都能被找到
*/
function
allElementsExist
(
paths
,
cells
)
{
// 实现一个函数来检查所有路径是否存在
return
paths
.
every
(
path
=>
elementExists
(
path
,
cells
));
}
/**
* 根据路径信息获取表内的数据
* @param {string[]} parentXPath 父节点路径集合
* 该函数用来移出绝对路径中的相同父节点部分
* @param {srting} paths 绝对路径
* @param {srting} commonPart 父节点
*/
function
removeCommonPart
(
path
,
commonPart
)
{
// 实现一个函数来移除路径中的共同部分
return
path
.
replace
(
commonPart
,
""
);
}
/**
* 处理xpath父节点的最后一个节点下标
*/
function
incrementLastIndex
(
xpath
)
{
// 将 XPath 分割为节点数组
let
parts
=
xpath
.
split
(
'/'
);
// 找到最后一个节点
let
lastIndex
=
parts
.
length
-
1
;
let
lastNode
=
parts
[
lastIndex
];
// 正则表达式用于找到节点中的数字部分
let
regex
=
/
(\d
+
)(?!
.*
\d)
/
;
// 如果最后一个节点包含数字,则增加该数字
if
(
lastNode
.
match
(
regex
))
{
lastNode
=
lastNode
.
replace
(
regex
,
function
(
match
)
{
return
parseInt
(
match
)
+
1
;
});
}
else
{
// 如果没有数字,假设是第一个索引并添加 [1]
lastNode
+=
"[1]"
;
}
// 重新组装 XPath
parts
[
lastIndex
]
=
lastNode
;
return
parts
.
join
(
'/'
);
}
/**
* 检查XPath是否指向一个存在的元素,如果存在就返回,当父节点的最后一个下标换成第二行的下标时,组合同样的相对路径,向上查找相同的父节点并更新cell对应的父节点,保证当前选中是表结构
*/
function
elementExists
(
xpath
,
cells
)
{
let
documentResult
=
document
.
evaluate
(
xpath
,
document
,
null
,
XPathResult
.
FIRST_ORDERED_NODE_TYPE
,
null
);
if
(
!!
documentResult
.
singleNodeValue
)
{
// 如果找到元素,返回 true
return
true
;
}
else
{
// 没找到元素,开始逐级向上检查
let
parts
=
xpath
.
split
(
'/'
);
// 移除最后一个节点,逐级向上检查
while
(
parts
.
length
>
1
)
{
parts
.
pop
();
// reducedXPath 这个路径以绝对xpath向上查找
let
reducedXPath
=
parts
.
join
(
'/'
);
documentResult
=
document
.
evaluate
(
reducedXPath
,
document
,
null
,
XPathResult
.
FIRST_ORDERED_NODE_TYPE
,
null
);
if
(
!!
documentResult
.
singleNodeValue
)
{
// 如果在上一级找到了元素,返回 true
let
xpathArray
=
reducedXPath
.
split
(
'/'
);
// 移除数组中的空字符串元素,这通常出现在字符串的开头
cells
.
forEach
(
o
=>
o
.
updateRelativePath
(
xpathArray
));
//更新每个cell的相对路径和父节点
return
true
;
}
}
// 如果遍历完所有节点还是没找到,返回 false
return
false
;
}
}
/**
* // 公共部分与拆解部分组合查询 找出当前节点下所有符合条件的表数据
* @param {string} commonXPath 父节点路径
* @param {string[]} relativeXPaths 相对路径集合
* @returns {any} 返回表
内数据
* @returns {any} 返回表
格内所有符合条件的Xpath
*/
function
getTableData
(
parentXPath
,
relativeXPaths
)
{
let
rtns
=
null
;
return
rtns
;
}
\ No newline at end of file
function
combineXPaths
(
commonXPath
,
paths
)
{
// console.log(commonXPath, paths)
// 然后去除公共路径最后一个元素的下标
// let samePath =''
let
commonPath
=
[];
commonPath
=
commonXPath
if
(
commonPath
.
length
>
0
)
{
let
lastElement
=
commonPath
[
commonPath
.
length
-
1
];
let
lastElementWithoutIndex
=
lastElement
.
split
(
'['
)[
0
];
commonPath
[
commonPath
.
length
-
1
]
=
lastElementWithoutIndex
;
}
commonXPath
=
commonPath
.
join
(
'/'
)
// 更新公共根节点路径,去除最后一个元素的下标
// let updatedCommonPathStr = commonPath.join('/');
let
content
=
[];
let
index
=
0
;
// 从给定的XPath中去除最后一个节点
function
removeLastNode
(
xpath
)
{
let
parts
=
xpath
.
split
(
'/'
);
parts
.
pop
();
return
parts
.
join
(
'/'
);
}
// 检查XPath是否指向一个存在的元素
function
elementExists
(
xpath
)
{
let
result
=
document
.
evaluate
(
xpath
,
document
,
null
,
XPathResult
.
FIRST_ORDERED_NODE_TYPE
,
null
);
return
!!
result
.
singleNodeValue
;
}
while
(
true
)
{
let
indexedCommonXPath
=
commonXPath
+
'['
+
(
index
+
1
)
+
']'
;
// XPath的下标从1开始
// 如果当前下标的元素不存在,则向上查找
while
(
!
elementExists
(
indexedCommonXPath
)
&&
indexedCommonXPath
.
length
>
commonXPath
.
length
)
{
indexedCommonXPath
=
removeLastNode
(
indexedCommonXPath
);
}
// 如果找到公共XPath层,则停止查找
if
(
indexedCommonXPath
.
length
<=
commonXPath
.
length
)
{
break
;
}
// 将找到的XPath与路径组合,并存储在content数组中
let
combinedPaths
=
paths
.
map
(
path
=>
indexedCommonXPath
+
'/'
+
path
);
content
.
push
({
index
:
index
,
paths
:
combinedPaths
});
index
++
;
}
return
content
;
}
/**
* // 根据找出的表结构的所有cell的Xpath 进行元素内容查找
* @param {string[]} arrayObjects 相对路径集合
* @returns {any} 返回已找到的数据
*/
function
findElements
(
arrayObjects
)
{
let
results
=
[];
// 从给定的XPath中去除最后一个节点
function
removeLastNode
(
xpath
)
{
let
parts
=
xpath
.
split
(
'/'
);
parts
.
pop
();
return
parts
.
join
(
'/'
);
}
// 检查XPath是否指向一个存在的元素
function
elementExistss
(
xpath
)
{
let
result
=
document
.
evaluate
(
xpath
,
document
,
null
,
XPathResult
.
FIRST_ORDERED_NODE_TYPE
,
null
);
return
!!
result
.
singleNodeValue
;
}
// 对每个paths数组进行查找
arrayObjects
.
forEach
(
item
=>
{
let
groupResult
=
{
index
:
item
.
index
,
elements
:
[]
};
item
.
paths
.
forEach
(
path
=>
{
let
currentXPath
=
path
;
// 从XPath的最后一个节点开始查找
// console.log(!elementExistss(currentXPath))
while
(
!
elementExistss
(
currentXPath
)
&&
currentXPath
!==
''
)
{
currentXPath
=
removeLastNode
(
currentXPath
);
}
// 如果找到了元素
if
(
currentXPath
!==
''
)
{
let
result
=
document
.
evaluate
(
currentXPath
,
document
,
null
,
XPathResult
.
FIRST_ORDERED_NODE_TYPE
,
null
);
let
element
=
result
.
singleNodeValue
;
groupResult
.
elements
.
push
({
xpath
:
currentXPath
,
content
:
element
.
textContent
});
}
});
results
.
push
(
groupResult
);
});
return
results
;
}
/**
* // 表结构处理,处理成界面需要的结构
* @param {string[]} resultElement 已经找到的所有数据
* @returns {any} 返回已找到的数据
*/
function
getTableData
(
resultElement
)
{
let
foundElements
=
[]
let
transformedData
=
[]
// 判断是否有数据
if
(
resultElement
)
{
// console.log("Element found: ", resultElement);
// 将页面过滤出来的元素的xpath进行元素查找,并且返回元素的xpath和内容
foundElements
=
findElements
(
resultElement
);
// console.log(foundElements);
// 返回表格需要的格式
transformedData
=
foundElements
.
map
((
group
,
index
)
=>
{
let
transformedGroup
=
{};
group
.
elements
.
forEach
((
element
,
elemIndex
)
=>
{
transformedGroup
[
`content
${
elemIndex
}
`
]
=
{
Xpath
:
element
.
xpath
,
content
:
element
.
content
,
otherName
:
"请填写标题"
};
});
transformedGroup
[
"_X_ROW_KEY"
]
=
`row_
${
index
+
0
}
`
;
// 假设起始索引为8
return
transformedGroup
;
});
return
transformedData
;
}
else
{
return
null
}
}
export
{
cell
,
checkTableFromXpaths
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment