messageInteraction.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. import { global, LANG, clearEl, readXPath, getElementXPaths } from './global.js';
  2. import { createNotification, trial } from './trail.js';
  3. //实现与后台和流程图部分的交互
  4. global.ws = new WebSocket("ws://localhost:8084");
  5. global.ws.onopen = function () {
  6. // Web Socket 已连接上,使用 send() 方法发送数据
  7. console.log("已连接");
  8. let message = {
  9. type: 0, //消息类型,0代表连接操作
  10. message: {
  11. id: global.id, //socket id
  12. title: document.title, //网页标题
  13. }
  14. };
  15. this.send(JSON.stringify(message));
  16. };
  17. global.ws.onmessage = function (evt) {
  18. evt = JSON.parse(evt.data);
  19. if (evt["type"] == "update_parameter_num") { //0代表更新参数添加索引值
  20. chrome.storage.local.set({"parameterNum": parseInt(evt["value"])}); //修改值
  21. console.log("更新参数添加索引值为:" + evt["value"]);
  22. } else if (evt["type"] == "notify") { //1代表更新参数
  23. createNotification(LANG(evt["msg_zh"], evt["msg_en"]), evt["level"]);
  24. } else if (evt["type"] == "cancelSelection") { //试运行点击元素后取消选中元素
  25. clearEl();
  26. } else if (evt["type"] == "trial") {
  27. trial(evt);
  28. } else if (evt["type"] == "showAllToolboxes") {
  29. document.getElementById("wrapperToolkit").style.display = "block";
  30. } else if (evt["type"] == "hideAllToolboxes") {
  31. document.getElementById("wrapperToolkit").style.display = "none";
  32. }
  33. };
  34. function clearAfterSend() {
  35. global.justSend = true;
  36. // setTimeout(function () {
  37. // if (global.justSend) {
  38. // clearEl();
  39. // global.justSend = false;
  40. // }
  41. // }, 1000);
  42. }
  43. function input(value, batch = false) {
  44. let type = "inputText";
  45. let useLoop = false;
  46. if (batch) {
  47. type = "batchInputText";
  48. useLoop = true;
  49. }
  50. let message = {
  51. "type": type,
  52. "history": history.length, //记录history的长度
  53. "tabIndex": -1,
  54. "xpath": readXPath(global.nodeList[0]["node"], 0),
  55. "allXPaths": getElementXPaths(global.nodeList[0]["node"]),
  56. "iframe": global.iframe,
  57. "value": value,
  58. "useLoop": useLoop, //是否使用循环内元素
  59. "loopType": 3, //循环类型,3为文本列表
  60. };
  61. window.stop();
  62. let message_action = {
  63. type: 3, //消息类型,3代表元素增加事件
  64. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  65. message: {"pipe": JSON.stringify(message)}
  66. };
  67. global.ws.send(JSON.stringify(message_action));
  68. // msg = { type: 2, value: value, xpath: message.xpath, id: global.id};
  69. let message_keyboard = {
  70. type: 2, //消息类型,2代表键盘输入
  71. message: {"keyboardStr": value, "xpath": message.xpath, "iframe": global.iframe, "id": global.id} // {}全选{BS}退格
  72. };
  73. global.ws.send(JSON.stringify(message_keyboard));
  74. clearAfterSend();
  75. }
  76. //点击元素操作
  77. function sendSingleClick() {
  78. let message = {
  79. "type": "singleClick",
  80. "id": global.id,
  81. "history": history.length, //记录history的长度
  82. "tabIndex": -1,
  83. "useLoop": false, //是否使用循环内元素
  84. "iframe": global.iframe,
  85. "content": global.nodeList[0]["node"].innerText,
  86. "xpath": readXPath(global.nodeList[0]["node"], 0),
  87. "allXPaths": getElementXPaths(global.nodeList[0]["node"]),
  88. };
  89. let message_action = {
  90. type: 3, //消息类型,3代表元素增加事件
  91. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  92. message: {"pipe": JSON.stringify(message)}
  93. };
  94. global.ws.send(JSON.stringify(message_action));
  95. clearAfterSend();
  96. }
  97. function sendChangeOption(optionMode, optionValue) {
  98. let message = {
  99. "type": "changeOption",
  100. "optionMode": optionMode,
  101. "optionValue": optionValue,
  102. "history": history.length, //记录history的长度
  103. "tabIndex": -1,
  104. "useLoop": false, //是否使用循环内元素
  105. "iframe": global.iframe,
  106. "xpath": readXPath(global.nodeList[0]["node"], 0),
  107. "allXPaths": getElementXPaths(global.nodeList[0]["node"]),
  108. };
  109. let message_action = {
  110. type: 3, //消息类型,3代表元素增加事件
  111. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  112. message: {"pipe": JSON.stringify(message)}
  113. };
  114. global.ws.send(JSON.stringify(message_action));
  115. clearAfterSend();
  116. }
  117. function sendMouseMove() {
  118. let message = {
  119. "type": "mouseMove",
  120. "history": history.length, //记录history的长度
  121. "tabIndex": -1,
  122. "useLoop": false, //是否使用循环内元素
  123. "iframe": global.iframe,
  124. "content": global.nodeList[0]["node"].innerText,
  125. "xpath": readXPath(global.nodeList[0]["node"], 0),
  126. "allXPaths": getElementXPaths(global.nodeList[0]["node"]),
  127. };
  128. let message_action = {
  129. type: 3, //消息类型,3代表元素增加事件
  130. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  131. message: {"pipe": JSON.stringify(message)}
  132. };
  133. global.ws.send(JSON.stringify(message_action));
  134. clearAfterSend();
  135. }
  136. function sendLoopMouseMove() {
  137. let message = {
  138. "type": "loopMouseMove",
  139. "history": history.length, //记录history的长度
  140. "tabIndex": -1,
  141. "xpath": "", //默认值设置为空
  142. "allXPaths": "",
  143. "content": "",
  144. "useLoop": true, //是否使用循环内元素
  145. "iframe": global.iframe,
  146. "loopType": 1, //循环类型,1为不固定元素列表
  147. };
  148. if (!detectAllSelected()) //如果不是全部选中的话
  149. {
  150. message.loopType = 2; //固定元素列表
  151. }
  152. if (message.loopType == 1) {
  153. message["xpath"] = global.app._data.nowPath;
  154. } else { //固定元素列表
  155. //有的网站像淘宝,每个元素都有一个独一无二的ID号,这时候就不适用用id进行xpath定位了,这个问题暂时搁置
  156. message["pathList"] = [];
  157. for (let i = 0; i < global.nodeList.length; i++) {
  158. message["pathList"].push(readXPath(global.nodeList[i]["node"], 0));
  159. }
  160. }
  161. let message_action = {
  162. type: 3, //消息类型,3代表元素增加事件
  163. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  164. message: {"pipe": JSON.stringify(message)}
  165. };
  166. global.ws.send(JSON.stringify(message_action));
  167. clearAfterSend();
  168. }
  169. //采集单个元素
  170. function collectSingle() {
  171. let message = {
  172. "type": "singleCollect",
  173. "history": history.length, //记录history的长度
  174. "tabIndex": -1,
  175. "iframe": global.iframe,
  176. "parameters": global.outputParameters,
  177. };
  178. let message_action = {
  179. type: 3, //消息类型,3代表元素增加事件
  180. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  181. message: {"pipe": JSON.stringify(message)}
  182. };
  183. global.ws.send(JSON.stringify(message_action));
  184. clearAfterSend();
  185. }
  186. setInterval(function () {
  187. let notifications = document.getElementsByClassName("notification_of_easyspider");
  188. for (let i = 0; i < notifications.length; i++) {
  189. if (new Date().getTime() - parseInt(notifications[i].dataset.timestamp) > 10000) {
  190. if (notifications[i].parentNode === document.body) {
  191. document.body.removeChild(notifications[i]); // 避免移除已经不存在的元素
  192. }
  193. }
  194. }
  195. }, 3000);
  196. //采集无规律多元素
  197. function collectMultiNoPattern() {
  198. let message = {
  199. "type": "multiCollectNoPattern",
  200. "history": history.length, //记录history的长度
  201. "tabIndex": -1,
  202. "iframe": global.iframe,
  203. "parameters": global.outputParameters,
  204. };
  205. let message_action = {
  206. type: 3, //消息类型,3代表元素增加事件
  207. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  208. message: {"pipe": JSON.stringify(message)}
  209. };
  210. global.ws.send(JSON.stringify(message_action));
  211. clearAfterSend();
  212. }
  213. //采集有规律多元素
  214. function collectMultiWithPattern() {
  215. //先点击选择全部然后再
  216. let message = {
  217. "type": "multiCollectWithPattern",
  218. "history": history.length, //记录history的长度
  219. "tabIndex": -1,
  220. "loopType": 1,
  221. "iframe": global.iframe,
  222. "xpath": "", //默认值设置为空
  223. "allXPaths": "",
  224. "isDescendents": global.app._data.selectedDescendents, //标记是否采集的是子元素
  225. "parameters": global.outputParameters,
  226. };
  227. for (let i = 0; i < global.outputParameters.length; i++) {
  228. global.outputParameters[i]["exampleValues"] = [global.outputParameters[i]["exampleValues"][0]];
  229. }
  230. if (!detectAllSelected()) //如果不是全部选中的话
  231. {
  232. message.loopType = 2; //固定元素列表
  233. }
  234. if (message.loopType == 1) {
  235. message["xpath"] = global.app._data.nowPath;
  236. message["allXPaths"] = global.app._data.nowAllPaths;
  237. } else { //固定元素列表
  238. message["pathList"] = [];
  239. for (let i = 0; i < global.nodeList.length; i++) {
  240. message["pathList"].push(readXPath(global.nodeList[i]["node"], 0));
  241. }
  242. }
  243. let message_action = {
  244. type: 3, //消息类型,3代表元素增加事件
  245. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  246. message: {"pipe": JSON.stringify(message)}
  247. };
  248. global.ws.send(JSON.stringify(message_action));
  249. clearAfterSend();
  250. }
  251. //循环点击单个元素
  252. function sendLoopClickSingle(name = "") {
  253. let message = {
  254. "type": "loopClickSingle",
  255. "id": global.id,
  256. "history": history.length, //记录history的长度
  257. "tabIndex": -1,
  258. "useLoop": true, //是否使用循环内元素
  259. "iframe": global.iframe,
  260. "content": global.nodeList[0]["node"].innerText,
  261. "xpath": readXPath(global.nodeList[0]["node"], 0),
  262. "allXPaths": getElementXPaths(global.nodeList[0]["node"]),
  263. "loopType": 0, //循环类型,0为单个元素
  264. "nextPage": false, //是否循环点击下一页
  265. "lastAction": global.app._data.lastAction,
  266. };
  267. if (name == "下一页元素") {
  268. message.nextPage = true;
  269. } else if (name == "nextPageFromIndexPage") {
  270. message.nextPage = true;
  271. message.type = "loopClickNextPage";
  272. }
  273. let message_action = {
  274. type: 3, //消息类型,3代表元素增加事件
  275. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  276. message: {"pipe": JSON.stringify(message)}
  277. };
  278. global.ws.send(JSON.stringify(message_action));
  279. clearAfterSend();
  280. }
  281. //循环点击每个元素
  282. function sendLoopClickEvery() {
  283. let message = {
  284. "type": "loopClickEvery",
  285. "id": global.id,
  286. "history": history.length, //记录history的长度
  287. "tabIndex": -1,
  288. "xpath": "", //默认值设置为空
  289. "allXPaths": "",
  290. "content": "",
  291. "useLoop": true, //是否使用循环内元素
  292. "iframe": global.iframe,
  293. "loopType": 1, //循环类型,1为不固定元素列表
  294. };
  295. if (!detectAllSelected()) //如果不是全部选中的话
  296. {
  297. message.loopType = 2; //固定元素列表
  298. }
  299. if (message.loopType == 1) {
  300. message["xpath"] = global.app._data.nowPath;
  301. } else { //固定元素列表
  302. //有的网站像淘宝,每个元素都有一个独一无二的ID号,这时候就不适用用id进行xpath定位了,这个问题暂时搁置
  303. message["pathList"] = [];
  304. for (let i = 0; i < global.nodeList.length; i++) {
  305. message["pathList"].push(readXPath(global.nodeList[i]["node"], 0));
  306. }
  307. }
  308. let message_action = {
  309. type: 3, //消息类型,3代表元素增加事件
  310. from: 0, //0代表从浏览器到流程图,1代表从流程图到浏览器
  311. message: {"pipe": JSON.stringify(message)}
  312. };
  313. global.ws.send(JSON.stringify(message_action));
  314. clearAfterSend();
  315. }
  316. //检测是否xpath对应的元素被全选了,个数判断即可
  317. function detectAllSelected() {
  318. if (global.app._data.nowPath == "") {
  319. return false;
  320. } else {
  321. let num = 0;
  322. let result = document.evaluate(global.app._data.nowPath, document, null, XPathResult.ANY_TYPE, null);
  323. var node = result.iterateNext(); //枚举第一个元素
  324. while (node) {
  325. // console.log(node.innerHTML);
  326. num++;
  327. node = result.iterateNext();
  328. }
  329. if (num == global.nodeList.length) {
  330. return true;
  331. } else {
  332. return false;
  333. }
  334. }
  335. }
  336. export { collectMultiNoPattern, collectMultiWithPattern, collectSingle, detectAllSelected, input, sendChangeOption, sendLoopClickEvery, sendLoopClickSingle, sendLoopMouseMove, sendMouseMove, sendSingleClick };