2023-06-28 00:28:33 +08:00

284 lines
10 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//实现与后台和流程图部分的交互
import {getElementXPaths, global, readXPath} from "./global.js";
// var startMsg = { "type": 0, msg: ""};
//
// chrome.runtime.sendMessage(startMsg, function(response) {
// console.log(response.msg);
// }); //每次打开新页面的时候需要告诉后台
// chrome.runtime.onMessage.addListener(
// function(request, sender, sendResponse) {
// if (request["type"] == 1){
// sendResponse("回答处理结果");
// }
// }
// );
global.ws = new WebSocket("ws://localhost:8084");
global.ws.onopen = function() {
// Web Socket 已连接上,使用 send() 方法发送数据
console.log("已连接");
let message = {
type: 0, //消息类型0代表连接操作
message: {
id: global.id, //socket id
title: document.title, //网页标题
}
};
this.send(JSON.stringify(message));
};
export function input(value) {
let message = {
"type": "InputText",
"history": history.length, //记录history的长度
"tabIndex": -1,
"xpath": readXPath(global.nodeList[0]["node"], 0),
"allXPaths": getElementXPaths(global.nodeList[0]["node"]),
"value": value,
};
window.stop();
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
// msg = { type: 2, value: value, xpath: message.xpath, id: global.id};
let message_keyboard = {
type: 2, //消息类型2代表键盘输入
message: { "keyboardStr": value, "xpath": message.xpath, "id": global.id } // {}全选{BS}退格
};
global.ws.send(JSON.stringify(message_keyboard));
}
//点击元素操作
export function sendSingleClick() {
let message = {
"type": "singleClick",
"id": global.id,
"history": history.length, //记录history的长度
"tabIndex": -1,
"useLoop": false, //是否使用循环内元素
"xpath": readXPath(global.nodeList[0]["node"], 0),
"allXPaths": getElementXPaths(global.nodeList[0]["node"]),
};
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
export function sendChangeOption(optionMode, optionValue){
let message = {
"type": "changeOption",
"optionMode": optionMode,
"optionValue": optionValue,
"history": history.length, //记录history的长度
"tabIndex": -1,
"useLoop": false, //是否使用循环内元素
"xpath": readXPath(global.nodeList[0]["node"], 0),
"allXPaths": getElementXPaths(global.nodeList[0]["node"]),
};
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
export function sendMouseMove(){
let message = {
"type": "mouseMove",
"history": history.length, //记录history的长度
"tabIndex": -1,
"useLoop": false, //是否使用循环内元素
"xpath": readXPath(global.nodeList[0]["node"], 0),
"allXPaths": getElementXPaths(global.nodeList[0]["node"]),
};
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
export function sendLoopMouseMove(){
let message = {
"type": "loopMouseMove",
"history": history.length, //记录history的长度
"tabIndex": -1,
"xpath": "", //默认值设置为空
"allXPaths": "",
"useLoop": true, //是否使用循环内元素
"loopType": 1, //循环类型1为不固定元素列表
};
if (!detectAllSelected()) //如果不是全部选中的话
{
message.loopType = 2; //固定元素列表
}
if (message.loopType == 1) {
message["xpath"] = global.app._data.nowPath;
} else { //固定元素列表
//有的网站像淘宝每个元素都有一个独一无二的ID号这时候就不适用用id进行xpath定位了这个问题暂时搁置
message["pathList"] = [];
for (let i = 0; i < global.nodeList.length; i++) {
message["pathList"].push(readXPath(global.nodeList[i]["node"], 0));
}
}
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
//采集单个元素
export function collectSingle() {
let message = {
"type": "singleCollect",
"history": history.length, //记录history的长度
"tabIndex": -1,
"parameters": global.outputParameters,
};
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
//采集无规律多元素
export function collectMultiNoPattern() {
let message = {
"type": "multiCollectNoPattern",
"history": history.length, //记录history的长度
"tabIndex": -1,
"parameters": global.outputParameters,
};
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
//采集有规律多元素
export function collectMultiWithPattern() {
//先点击选择全部然后再
let message = {
"type": "multiCollectWithPattern",
"history": history.length, //记录history的长度
"tabIndex": -1,
"loopType": 1,
"xpath": "", //默认值设置为空
"allXPaths": "",
"isDescendents": global.app._data.selectedDescendents, //标记是否采集的是子元素
"parameters": global.outputParameters,
};
if (!detectAllSelected()) //如果不是全部选中的话
{
message.loopType = 2; //固定元素列表
}
if (message.loopType == 1) {
message["xpath"] = global.app._data.nowPath;
message["allXPaths"] = global.app._data.nowAllPaths;
} else { //固定元素列表
message["pathList"] = [];
for (let i = 0; i < global.nodeList.length; i++) {
message["pathList"].push(readXPath(global.nodeList[i]["node"], 0));
}
}
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
//循环点击单个元素
export function sendLoopClickSingle(name) {
let message = {
"type": "loopClickSingle",
"id": global.id,
"history": history.length, //记录history的长度
"tabIndex": -1,
"useLoop": true, //是否使用循环内元素
"xpath": readXPath(global.nodeList[0]["node"], 0),
"allXPaths": getElementXPaths(global.nodeList[0]["node"]),
"loopType": 0, //循环类型0为单个元素
"nextPage": false, //是否循环点击下一页
};
if (name == "下一页元素") {
message.nextPage = true;
}
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
//循环点击每个元素
export function sendLoopClickEvery() {
let message = {
"type": "loopClickEvery",
"id": global.id,
"history": history.length, //记录history的长度
"tabIndex": -1,
"xpath": "", //默认值设置为空
"allXPaths": "",
"useLoop": true, //是否使用循环内元素
"loopType": 1, //循环类型1为不固定元素列表
};
if (!detectAllSelected()) //如果不是全部选中的话
{
message.loopType = 2; //固定元素列表
}
if (message.loopType == 1) {
message["xpath"] = global.app._data.nowPath;
} else { //固定元素列表
//有的网站像淘宝每个元素都有一个独一无二的ID号这时候就不适用用id进行xpath定位了这个问题暂时搁置
message["pathList"] = [];
for (let i = 0; i < global.nodeList.length; i++) {
message["pathList"].push(readXPath(global.nodeList[i]["node"], 0));
}
}
let message_action = {
type: 3, //消息类型3代表元素增加事件
from: 0, //0代表从浏览器到流程图1代表从流程图到浏览器
message: {"pipe": JSON.stringify(message)}
};
global.ws.send(JSON.stringify(message_action));
}
//检测是否xpath对应的元素被全选了个数判断即可
export function detectAllSelected() {
if (global.app._data.nowPath == "") {
return false;
} else {
let num = 0;
let result = document.evaluate(global.app._data.nowPath, document, null, XPathResult.ANY_TYPE, null);
var node = result.iterateNext(); //枚举第一个元素
while (node) {
// console.log(node.innerHTML);
num++;
node = result.iterateNext();
}
if (num == global.nodeList.length) {
return true;
} else {
return false;
}
}
}