From 0c30b277561e3c74810bd84cd0d314dfadee6c01 Mon Sep 17 00:00:00 2001
From: naibo
Date: Wed, 13 Dec 2023 05:50:23 +0800
Subject: [PATCH] Dynamic Debugging!!!
---
.../execution_instances/7.json | 1 +
ElectronJS/main.js | 447 ++++++---
ElectronJS/src/taskGrid/FlowChart.css | 3 +-
ElectronJS/src/taskGrid/FlowChart.html | 68 +-
ElectronJS/src/taskGrid/FlowChart.js | 160 +++-
ElectronJS/src/taskGrid/FlowChart_CN.html | 32 +-
ElectronJS/src/taskGrid/logic.js | 415 ++++----
ElectronJS/src/taskGrid/taskList.html | 18 +-
ElectronJS/tasks/215.json | 2 +-
ElectronJS/tasks/221.json | 890 +-----------------
ElectronJS/tasks/237.json | 2 +-
ElectronJS/tasks/256.json | 2 +-
ElectronJS/tasks/257.json | 1 +
ElectronJS/tasks/258.json | 1 +
ElectronJS/tasks/259.json | 1 +
ElectronJS/tasks/260.json | 1 +
ElectronJS/tasks/261.json | 1 +
ElectronJS/tasks/262.json | 1 +
ElectronJS/tasks/263.json | 1 +
ElectronJS/tasks/264.json | 1 +
ElectronJS/tasks/265.json | 1 +
ElectronJS/tasks/266.json | 1 +
ElectronJS/tasks/267.json | 1 +
ElectronJS/tasks/268.json | 1 +
ElectronJS/tasks/269.json | 1 +
ElectronJS/tasks/270.json | 1 +
ElectronJS/tasks/271.json | 1 +
ElectronJS/tasks/272.json | 1 +
ExecuteStage/.vscode/launch.json | 2 +-
ExecuteStage/easyspider_executestage.py | 25 +-
.../manifest_v3/src/content-scripts/global.js | 9 +
.../src/content-scripts/messageInteraction.js | 82 +-
.../src/content-scripts/toolkit.vue | 18 +-
.../manifest_v3/src/content-scripts/trail.js | 150 +++
Extension/manifest_v3/src/style/toolkit.css | 3 +-
35 files changed, 947 insertions(+), 1398 deletions(-)
create mode 100644 .temp_to_pub/EasySpider_windows_x64/execution_instances/7.json
create mode 100644 ElectronJS/tasks/257.json
create mode 100644 ElectronJS/tasks/258.json
create mode 100644 ElectronJS/tasks/259.json
create mode 100644 ElectronJS/tasks/260.json
create mode 100644 ElectronJS/tasks/261.json
create mode 100644 ElectronJS/tasks/262.json
create mode 100644 ElectronJS/tasks/263.json
create mode 100644 ElectronJS/tasks/264.json
create mode 100644 ElectronJS/tasks/265.json
create mode 100644 ElectronJS/tasks/266.json
create mode 100644 ElectronJS/tasks/267.json
create mode 100644 ElectronJS/tasks/268.json
create mode 100644 ElectronJS/tasks/269.json
create mode 100644 ElectronJS/tasks/270.json
create mode 100644 ElectronJS/tasks/271.json
create mode 100644 ElectronJS/tasks/272.json
create mode 100644 Extension/manifest_v3/src/content-scripts/trail.js
diff --git a/.temp_to_pub/EasySpider_windows_x64/execution_instances/7.json b/.temp_to_pub/EasySpider_windows_x64/execution_instances/7.json
new file mode 100644
index 0000000..4c32442
--- /dev/null
+++ b/.temp_to_pub/EasySpider_windows_x64/execution_instances/7.json
@@ -0,0 +1 @@
+{"id":7,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"12/11/2023, 7:29:08 AM","update_time":"12/11/2023, 8:02:45 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"},{"id":1,"name":"inputText_1","nodeName":"输入文字","nodeId":4,"desc":"要输入的文本,如京东搜索框输入:电脑","type":"text","exampleValue":"Field[\"参数1\"]","value":"Field[\"参数1\"]"}],"outputParameters":[{"id":0,"name":"参数1","desc":"","type":"text","recordASField":1,"exampleValue":"/手机/数码"}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环采集数据","sequence":[3,4],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]","//div[contains(., '/手机/数码')]","//DIV[@class='LeftSide_menu_item__SBMWC LeftSide_text_space__2UhbG ']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]"]}},{"id":3,"index":3,"parentId":2,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":7,"relative":true,"name":"参数1","desc":"","extractType":0,"relativeXPath":"","allXPaths":"","exampleValues":[{"num":0,"value":"/手机/数码"}],"unique_index":"kfd57x5t8clq048p17","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":4,"index":4,"parentId":2,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":3,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"key\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"Field[\"参数1\"]","index":0,"allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/input[1]","//input[contains(., '')]","id(\"key\")","//INPUT[@class='text defcolor']","/html/body/div[last()-6]/div/div[last()-2]/div/input"]}}]}
\ No newline at end of file
diff --git a/ElectronJS/main.js b/ElectronJS/main.js
index 89f0fae..3908055 100644
--- a/ElectronJS/main.js
+++ b/ElectronJS/main.js
@@ -256,7 +256,7 @@ async function findElementAcrossAllWindows(msg, notifyBrowser = true, scrollInto
len = len - 1;
if (!notify) {
notify = true;
- notify_browser("正在尝试在其他窗口中查找元素,请耐心等待。", "Trying to find elements in other windows, please wait patiently.", "info");
+ // notify_browser("正在尝试在其他窗口中查找元素,请耐心等待。", "Trying to find elements in other windows, please wait patiently.", "info");
}
if (len == 0) {
break;
@@ -306,7 +306,6 @@ async function beginInvoke(msg, ws) {
let height = parseInt(size.height * 0.6)
window.setBounds({x: 0, y: size.height * 0.4, height: height, width: width});
}
-
flowchart_window.show();
// flowchart_window.openDevTools();
} else if (msg.type == 2) {
@@ -345,131 +344,256 @@ async function beginInvoke(msg, ws) {
} catch (e) {
console.log(e);
}
- } else if (msg.type == 4) { //试运行功能
- try {
- let flowchart_url = flowchart_window.webContents.getURL();
- } catch {
- flowchart_window = null;
- }
- if (flowchart_window == null) {
- notify_flowchart("试运行功能只能在设计任务阶段,Chrome浏览器打开时使用!", "The trial run function can only be used when designing tasks and opening in Chrome browser!", "error");
- } else {
- let node = JSON.parse(msg.message.node);
- notify_browser("正在试运行操作:" + node.title, "Trying to run the operation: " + node.title, "info");
+ } else if (msg.type == 4) { //标记元素和试运行功能
+ let node = JSON.parse(msg.message.node);
+ let type = msg.message.type;
+ if (type == 0) { //标记元素
let option = node.option;
let parameters = node.parameters;
- let beforeJS = "";
- let beforeJSWaitTime = 0;
- let afterJS = "";
- let afterJSWaitTime = 0;
- try {
- beforeJS = parameters.beforeJS;
- beforeJSWaitTime = parameters.beforeJSWaitTime;
- afterJS = parameters.afterJS;
- afterJSWaitTime = parameters.afterJSWaitTime;
- } catch (e) {
- console.log(e);
- }
- if (option == 1) {
- let url = parameters.links.split("\n")[0].trim();
- if (parameters.useLoop) {
- let parent_node = JSON.parse(msg.message.parentNode);
- url = parent_node["parameters"]["textList"].split("\n")[0];
+ //下面是让浏览器自动滚动到元素位置
+ if (option == 2 || option == 4 || option == 6 || option == 7) {
+ let xpath = parameters.xpath;
+ let parent_node = JSON.parse(msg.message.parentNode);
+ if (parameters.useLoop && option != 4 && option != 6) {
+ let parentXPath = parent_node.parameters.xpath;
+ xpath = parentXPath + xpath;
}
- await driver.get(url);
- } else if (option == 2 || option == 7) { //点击事件
- let elementInfo = {"iframe": parameters.iframe, "xpath": parameters.xpath, "id": -1};
- if (parameters.useLoop) {
+ let elementInfo = {"iframe": parameters.iframe, "xpath": xpath, "id": -1};
+ //用于跳转到元素位置
+ let element = await findElementAcrossAllWindows(elementInfo, notifyBrowser = false);
+ } else if (option == 3) {
+ let paras = parameters.paras; //所有的提取数据参数
+ let para = paras[0];
+ let xpath = para.relativeXPath;
+ if (para.relative) {
let parent_node = JSON.parse(msg.message.parentNode);
let parent_xpath = parent_node.parameters.xpath;
- elementInfo.xpath = parent_xpath + elementInfo.xpath;
+ xpath = parent_xpath + xpath;
}
- let element = await findElementAcrossAllWindows(elementInfo);
- await execute_js(parameters.beforeJS, element, parameters.beforeJSWaitTime);
- if (option == 2) {
- await click_element(element);
- } else if (option == 7) {
- await driver.actions().move({origin: element}).perform();
- }
- await execute_js(parameters.afterJS, element, parameters.afterJSWaitTime);
- send_message_to_browser(JSON.stringify({"type": "cancelSelection"}));
- } else if (option == 3) { //提取数据
- notify_browser("提示:提取数据操作只能试运行设置的JavaScript语句,且只针对第一个匹配的元素。", "Hint: can only test JavaScript statement set in the data extraction operation, and only for the first matching element.", "info");
+ let elementInfo = {"iframe": para.iframe, "xpath": xpath, "id": -1};
+ let element = await findElementAcrossAllWindows(elementInfo, notifyBrowser = false);
+ } else if (option == 11) {
let paras = parameters.paras; //所有的提取数据参数
- let not_found_xpaths = [];
- for (let i = 0; i < paras.length; i++) {
- let para = paras[i];
- let xpath = para.relativeXPath;
- if (para.relative) {
+ let i = parameters.index;
+ let para = paras[i];
+ let xpath = para.relativeXPath;
+ if (para.relative) {
+ let parent_node = JSON.parse(msg.message.parentNode);
+ let parent_xpath = parent_node.parameters.xpath;
+ xpath = parent_xpath + xpath;
+ }
+ let elementInfo = {"iframe": para.iframe, "xpath": xpath, "id": -1};
+ let element = await findElementAcrossAllWindows(elementInfo, notifyBrowser = false);
+ } else if (option == 8) {
+ //
+ // < option
+ // :
+ // value = 0 > 单个元素(多用于循环点击下一页)
+ // 不固定元素列表 < /option>
+ // 固定元素列表 < /option>
+ // 文本列表(多用于循环在文本框输入文本)
+ // 网址列表(多用于循环打开网页)
+ // JavaScript命令返回值(需以return
+ // 开头)
+ // 系统命令返回值 < /option>
+ // 执行环境下的Python表达式值(eval操作)
+ //
+ //
+ let loopType = parameters.loopType;
+ if (loopType <= 2) {
+ let xpath = "";
+ if (loopType <= 1) {
+ xpath = parameters.xpath;
+ } else if (loopType == 2) {
+ xpath = parameters.pathList.split("\n")[0].trim();
+ }
+ let elementInfo = {"iframe": parameters.iframe, "xpath": xpath, "id": -1};
+ let element = await findElementAcrossAllWindows(elementInfo, notifyBrowser = false);
+ } else if (loopType == 5) { //JavaScript命令返回值
+ let code = parameters.code;
+ let waitTime = parameters.waitTime;
+ let element = await driver.findElement(By.tagName("body"));
+ let outcome = await execute_js(code, element, waitTime);
+ if (!outcome || outcome == -1) {
+ notify_browser("目前页面中,设置的循环“" + node.title + "”的JavaScript条件不成立", "The condition of the loop " + node.title + " is not met, skip this loop.", "warning");
+ } else {
+ notify_browser("目前页面中,设置的循环“" + node.title + "”的JavaScript条件成立", "The condition of the loop " + node.title + " is met, continue this loop.", "success");
+ }
+ }
+ } else if (option == 10) { //条件分支
+ let condition = parameters.class; //条件类型
+ let result = -1;
+ let additionalInfo = "";
+ if (condition == 5 || condition == 7) { //JavaScript命令返回值
+ let code = parameters.code;
+ let waitTime = parameters.waitTime;
+ let element = await driver.findElement(By.tagName("body"));
+ if (condition == 7) {
+ let parent_node = JSON.parse(msg.message.parentNode);
+ let xpath = parent_node.parameters.xpath;
+ elementInfo = {"iframe": parent_node.parameters.iframe, "xpath": xpath, "id": -1};
+ element = await findElementAcrossAllWindows(elementInfo);
+ }
+ let outcome = await execute_js(code, element, waitTime);
+ if (!outcome) {
+ msg.message.result = 0; //条件不成立传入扩展
+ } else if (outcome == -1) {
+ msg.message.result = -1; //JS执行出错
+ } else {
+ msg.message.result = 1; //条件成立传入扩展
+ }
+ }
+ }
+ send_message_to_browser(JSON.stringify({"type": "trial", "message": msg}));
+ } else { //试运行
+ try {
+ let flowchart_url = flowchart_window.webContents.getURL();
+ } catch {
+ flowchart_window = null;
+ }
+ if (flowchart_window == null) {
+ notify_flowchart("试运行功能只能在设计任务阶段,Chrome浏览器打开时使用!", "The trial run function can only be used when designing tasks and opening in Chrome browser!", "error");
+ } else {
+ notify_browser("正在试运行操作:" + node.title, "Trying to run the operation: " + node.title, "info");
+ let option = node.option;
+ let parameters = node.parameters;
+ let beforeJS = "";
+ let beforeJSWaitTime = 0;
+ let afterJS = "";
+ let afterJSWaitTime = 0;
+ try {
+ beforeJS = parameters.beforeJS;
+ beforeJSWaitTime = parameters.beforeJSWaitTime;
+ afterJS = parameters.afterJS;
+ afterJSWaitTime = parameters.afterJSWaitTime;
+ } catch (e) {
+ console.log(e);
+ }
+ if (option == 1) {
+ let url = parameters.links.split("\n")[0].trim();
+ if (parameters.useLoop) {
+ let parent_node = JSON.parse(msg.message.parentNode);
+ url = parent_node["parameters"]["textList"].split("\n")[0];
+ }
+ try {
+ await driver.get(url);
+ } catch (e) {
+ driver.switchTo().window(current_handle);
+ await driver.get(url);
+ }
+ } else if (option == 2 || option == 7) { //点击事件
+ let elementInfo = {"iframe": parameters.iframe, "xpath": parameters.xpath, "id": -1};
+ if (parameters.useLoop) {
let parent_node = JSON.parse(msg.message.parentNode);
let parent_xpath = parent_node.parameters.xpath;
- xpath = parent_xpath + xpath;
+ elementInfo.xpath = parent_xpath + elementInfo.xpath;
}
- let elementInfo = {"iframe": para.iframe, "xpath": xpath, "id": -1};
- let element = await findElementAcrossAllWindows(elementInfo, notifyBrowser = false);
- if (element != null) {
- await execute_js(para.beforeJS, element, para.beforeJSWaitTime);
- await execute_js(para.afterJS, element, para.afterJSWaitTime);
- } else {
- not_found_xpaths.push(xpath);
+ let element = await findElementAcrossAllWindows(elementInfo); //通过此函数找到元素并切换到对应的窗口
+ await execute_js(parameters.beforeJS, element, parameters.beforeJSWaitTime);
+ if (option == 2) {
+ await click_element(element);
+ let alertHandleType = parameters.alertHandleType;
+ if (alertHandleType == 1) {
+ try {
+ await driver.switchTo().alert().accept();
+ } catch (e) {
+ console.log("No alert");
+ }
+ } else if (alertHandleType == 2) {
+ try {
+ await driver.switchTo().alert().dismiss();
+ } catch (e) {
+ console.log("No alert");
+ }
+ }
+ } else if (option == 7) {
+ await driver.actions().move({origin: element}).perform();
}
- }
- if (not_found_xpaths.length > 0) {
- notify_browser("无法找到以下元素,请检查XPath是否正确:" + not_found_xpaths.join("\n"), "Cannot find the element, please check if the XPath is correct: " + not_found_xpaths.join("\n"), "warning");
- }
- } else if (option == 4) { //键盘输入事件
- let elementInfo = {"iframe": parameters.iframe, "xpath": parameters.xpath, "id": -1};
- let value = node.parameters.value;
- if (node.parameters.useLoop) {
- let parent_node = JSON.parse(msg.message.parentNode);
- value = parent_node["parameters"]["textList"].split("\n")[0];
- let index = node.parameters.index;
- if (index > 0) {
- value = value.split("~")[index - 1];
+ await execute_js(parameters.afterJS, element, parameters.afterJSWaitTime);
+ send_message_to_browser(JSON.stringify({"type": "cancelSelection"}));
+ } else if (option == 3) { //提取数据
+ notify_browser("提示:提取数据操作只能试运行设置的JavaScript语句,且只针对第一个匹配的元素。", "Hint: can only test JavaScript statement set in the data extraction operation, and only for the first matching element.", "info");
+ let paras = parameters.paras; //所有的提取数据参数
+ let not_found_xpaths = [];
+ for (let i = 0; i < paras.length; i++) {
+ let para = paras[i];
+ let xpath = para.relativeXPath;
+ if (para.relative) {
+ let parent_node = JSON.parse(msg.message.parentNode);
+ let parent_xpath = parent_node.parameters.xpath;
+ xpath = parent_xpath + xpath;
+ }
+ let elementInfo = {"iframe": para.iframe, "xpath": xpath, "id": -1};
+ let element = await findElementAcrossAllWindows(elementInfo, notifyBrowser = false);
+ if (element != null) {
+ await execute_js(para.beforeJS, element, para.beforeJSWaitTime);
+ await execute_js(para.afterJS, element, para.afterJSWaitTime);
+ } else {
+ not_found_xpaths.push(xpath);
+ }
}
- }
- let keyInfo = value
- let enter = false;
- if (//i.test(keyInfo)) {
- keyInfo = keyInfo.replace(//gi, '');
- enter = true;
- }
- if (keyInfo.indexOf("Field(") >= 0 || keyInfo.indexOf("eval(") >= 0) {
- //两秒后通知浏览器
- await new Promise(resolve => setTimeout(resolve, 2000));
- notify_browser("检测到文字中包含Field(\"\")或eval(\"\"),试运行时无法输入两项表达式的替换值,请在任务正式调用阶段测试是否有效。", "Field(\"\") or eval(\"\") is detected in the text, and the replacement value of the two expressions cannot be entered during trial operation. Please test whether it is valid in the formal call stage.", "warning");
- }
- let element = await findElementAcrossAllWindows(elementInfo);
- await execute_js(beforeJS, element, beforeJSWaitTime);
- await element.sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
- if (enter) {
- await element.sendKeys(Key.ENTER);
- }
- await execute_js(afterJS, element, afterJSWaitTime);
- } else if (option == 5) { //自定义操作的JS代码
- let code = parameters.code;
- let waitTime = parameters.waitTime;
- let element = await driver.findElement(By.tagName("body"));
- await execute_js(code, element, waitTime);
- } else if (option == 6) { //切换下拉选项
- let optionMode = parseInt(parameters.optionMode);
- let optionValue = parameters.optionValue;
- if (node.parameters.useLoop) {
- let parent_node = JSON.parse(msg.message.parentNode);
- optionValue = parent_node["parameters"]["textList"].split("\n")[0];
- let index = node.parameters.index;
- if (index > 0) {
- optionValue = optionValue.split("~")[index - 1];
+ if (not_found_xpaths.length > 0) {
+ notify_browser("无法找到以下元素,请检查XPath是否正确:" + not_found_xpaths.join("\n"), "Cannot find the element, please check if the XPath is correct: " + not_found_xpaths.join("\n"), "warning");
}
- }
- let elementInfo = {"iframe": parameters.iframe, "xpath": parameters.xpath, "id": -1};
- let element = await findElementAcrossAllWindows(elementInfo);
- execute_js(beforeJS, element, beforeJSWaitTime);
- let dropdown = new Select(element);
- // Interacting with dropdown element based on optionMode
- switch (optionMode) {
- case 0: //切换到下一个选项
- let script = `var options = arguments[0].options;
+ } else if (option == 4) { //键盘输入事件
+ let elementInfo = {"iframe": parameters.iframe, "xpath": parameters.xpath, "id": -1};
+ let value = node.parameters.value;
+ if (node.parameters.useLoop) {
+ let parent_node = JSON.parse(msg.message.parentNode);
+ value = parent_node["parameters"]["textList"].split("\n")[0];
+ let index = node.parameters.index;
+ if (index > 0) {
+ value = value.split("~")[index - 1];
+ }
+ }
+ let keyInfo = value
+ let enter = false;
+ if (//i.test(keyInfo)) {
+ keyInfo = keyInfo.replace(//gi, '');
+ enter = true;
+ }
+ if (keyInfo.indexOf("Field(") >= 0 || keyInfo.indexOf("eval(") >= 0) {
+ //两秒后通知浏览器
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ notify_browser("检测到文字中包含Field(\"\")或eval(\"\"),试运行时无法输入两项表达式的替换值,请在任务正式调用阶段测试是否有效。", "Field(\"\") or eval(\"\") is detected in the text, and the replacement value of the two expressions cannot be entered during trial operation. Please test whether it is valid in the formal call stage.", "warning");
+ }
+ let element = await findElementAcrossAllWindows(elementInfo);
+ await execute_js(beforeJS, element, beforeJSWaitTime);
+ await element.sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
+ if (enter) {
+ await element.sendKeys(Key.ENTER);
+ }
+ await execute_js(afterJS, element, afterJSWaitTime);
+ } else if (option == 5) { //自定义操作的JS代码
+ let code = parameters.code;
+ let codeMode = parameters.codeMode;
+ let waitTime = parameters.waitTime;
+ let element = await driver.findElement(By.tagName("body"));
+ if (codeMode == 0) {
+ await execute_js(code, element, waitTime);
+ } else if (codeMode == 8) {
+ //刷新页面
+ await driver.navigate().refresh();
+ }
+ } else if (option == 6) { //切换下拉选项
+ let optionMode = parseInt(parameters.optionMode);
+ let optionValue = parameters.optionValue;
+ if (node.parameters.useLoop) {
+ let parent_node = JSON.parse(msg.message.parentNode);
+ optionValue = parent_node["parameters"]["textList"].split("\n")[0];
+ let index = node.parameters.index;
+ if (index > 0) {
+ optionValue = optionValue.split("~")[index - 1];
+ }
+ }
+ let elementInfo = {"iframe": parameters.iframe, "xpath": parameters.xpath, "id": -1};
+ let element = await findElementAcrossAllWindows(elementInfo);
+ execute_js(beforeJS, element, beforeJSWaitTime);
+ let dropdown = new Select(element);
+ // Interacting with dropdown element based on optionMode
+ switch (optionMode) {
+ case 0: //切换到下一个选项
+ let script = `var options = arguments[0].options;
for (var i = 0; i < options.length; i++) {
if (options[i].selected) {
options[i].selected = false;
@@ -481,26 +605,42 @@ async function beginInvoke(msg, ws) {
break;
}
}`;
- await driver.executeScript(script, element);
- break;
- case 1:
- await dropdown.selectByIndex(parseInt(optionValue));
- break;
- case 2:
- await dropdown.selectByValue(optionValue);
- break;
- case 3:
- await dropdown.selectByVisibleText(optionValue);
- break;
- default:
- throw new Error('Invalid option mode');
+ await driver.executeScript(script, element);
+ break;
+ case 1:
+ await dropdown.selectByIndex(parseInt(optionValue));
+ break;
+ case 2:
+ await dropdown.selectByValue(optionValue);
+ break;
+ case 3:
+ await dropdown.selectByVisibleText(optionValue);
+ break;
+ default:
+ throw new Error('Invalid option mode');
+ }
+ execute_js(afterJS, element, afterJSWaitTime);
+ } else if (option == 11) { //单个提取数据参数
+ notify_browser("提示:提取数据操作只能试运行设置的JavaScript语句,且只针对第一个匹配的元素。", "Hint: can only test JavaScript statement set in the data extraction operation, and only for the first matching element.", "info");
+ let paras = parameters.paras; //所有的提取数据参数
+ let i = parameters.index;
+ let para = paras[i];
+ let xpath = para.relativeXPath;
+ if (para.relative) {
+ let parent_node = JSON.parse(msg.message.parentNode);
+ let parent_xpath = parent_node.parameters.xpath;
+ xpath = parent_xpath + xpath;
+ }
+ let elementInfo = {"iframe": para.iframe, "xpath": xpath, "id": -1};
+ let element = await findElementAcrossAllWindows(elementInfo);
+ if (element != null) {
+ await execute_js(para.beforeJS, element, para.beforeJSWaitTime);
+ await execute_js(para.afterJS, element, para.afterJSWaitTime);
+ }
}
- execute_js(afterJS, element, afterJSWaitTime);
}
}
- } else if (msg.type == 8) { //展示元素功能
-
} else if (msg.type == 5) {
let child = require('child_process').execFile;
// 参数顺序: 1. task id 2. server address 3. saved_file_name 4. "remote" or "local" 5. user_data_folder
@@ -562,6 +702,8 @@ async function beginInvoke(msg, ws) {
async function click_element(element) {
try {
await element.click();
+ //ctrl+click
+ // await driver.actions().keyDown(Key.CONTROL).click(element).keyUp(Key.CONTROL).perform();
} catch (e) {
console.log(e);
await driver.executeScript("arguments[0].click();", element);
@@ -569,17 +711,26 @@ async function click_element(element) {
}
async function execute_js(js, element, wait_time = 3) {
+ let outcome = 0;
if (js.length != 0) {
try {
- await driver.executeScript(js, element);
+ outcome = await driver.executeScript(js, element);
if (wait_time == 0) {
wait_time = 30000;
}
- await new Promise(resolve => setTimeout(resolve, wait_time));
+ // await new Promise(resolve => setTimeout(resolve, wait_time));
} catch (e) {
+ // await new Promise(resolve => setTimeout(resolve, 2000));
notify_browser("执行JavaScript出错,请检查JavaScript语句是否正确:" + js + "\n错误信息:" + e, "Error executing JavaScript, please check if the JavaScript statement is correct: " + js + "\nError message: " + e, "error");
+ outcome = -1;
+ }
+ if (js.indexOf("Field(") >= 0 || js.indexOf("eval(") >= 0) {
+ //两秒后通知浏览器
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ notify_browser("检测到JavaScript中包含Field(\"\")或eval(\"\"),试运行时无法执行两项表达式,请在任务正式调用阶段测试是否有效。", "Field(\"\") or eval(\"\") is detected in JavaScript, and the two expressions cannot be executed during trial operation. Please test whether it is valid in the formal call stage.", "warning");
}
}
+ return outcome;
}
function notify_flowchart(msg_zh, msg_en, level = "info") {
@@ -628,25 +779,41 @@ wss.on('connection', function (ws) {
// });
console.log("set socket_flowchart at time: ", new Date());
} else { //其他的ID是用来标识不同的浏览器标签页的
- await new Promise(resolve => setTimeout(resolve, 2300));
+ // await new Promise(resolve => setTimeout(resolve, 200));
let handles = await driver.getAllWindowHandles();
if (arrayDifference(handles, old_handles).length > 0) {
old_handles = handles;
current_handle = handles[handles.length - 1];
+ await driver.switchTo().window(current_handle);
console.log("New tab opened, change current_handle to: ", current_handle);
+ // 调整浏览器窗口大小,不然扩展会白屏
+ let size = await driver.manage().window().getRect();
+ let width = size.width;
+ let height = size.height;
+ await driver.manage().window().setRect({width: width, height: height + 10});
+ // height = height - 1;
+ await driver.manage().window().setRect({width: width, height: height});
}
+ await new Promise(resolve => setTimeout(resolve, 2000));
handle_pairs[msg.message.id] = current_handle;
console.log("Set handle_pair for id: ", msg.message.id, " to ", current_handle, ", title is: ", msg.message.title);
socket_flowchart.send(JSON.stringify({"type": "title", "data": {"title": msg.message.title}}));
allWindowSockets.push(ws);
allWindowScoketNames.push(msg.message.id);
console.log("set socket for id: ", msg.message.id, " at time: ", new Date());
- ws.on('close', function (event) {
+ ws.on('close', async function (event) {
let index = allWindowSockets.indexOf(ws);
if (index > -1) {
allWindowSockets.splice(index, 1);
allWindowScoketNames.splice(index, 1);
}
+ let handles = await driver.getAllWindowHandles();
+ if (handles.length < old_handles.length) {
+ old_handles = handles;
+ current_handle = handles[handles.length - 1];
+ await driver.switchTo().window(current_handle);
+ console.log("Current tab closed, change current_handle to: ", current_handle);
+ }
console.log("socket for id: ", msg.message.id, " closed at time: ", new Date());
});
// console.log("handle_pairs: ", handle_pairs);
@@ -671,6 +838,15 @@ async function runBrowser(lang = "en", user_data_folder = '', mobile = false) {
const serviceBuilder = new ServiceBuilder(driverPath);
let options = new chrome.Options();
options.addArguments('--disable-blink-features=AutomationControlled');
+ options.addArguments('--disable-infobars');
+ // 添加实验性选项以排除'enable-automation'开关
+ options.set('excludeSwitches', ['enable-automation']);
+ options.excludeSwitches("enable-automation")
+
+ // 添加实验性选项来禁用自动化扩展
+ options.set('useAutomationExtension', false);
+ // options.addArguments('--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36');
+ options.set
language = lang;
if (lang == "en") {
options.addExtensions(path.join(__dirname, "EasySpider_en.crx"));
@@ -679,6 +855,7 @@ async function runBrowser(lang = "en", user_data_folder = '', mobile = false) {
}
options.addExtensions(path.join(__dirname, "XPathHelper.crx"));
options.setChromeBinaryPath(chromeBinaryPath);
+
if (user_data_folder != "") {
let dir = path.join(task_server.getDir(), user_data_folder);
console.log(dir);
@@ -790,7 +967,7 @@ app.whenReady().then(() => {
createWindow();
app.on('activate', function () {
- // On macOS it's common to re-create a window in the app when the
+ // On MacOS it's common to re-create a window in the app when the
// dock icon is clicked and there are no other windows open.
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
diff --git a/ElectronJS/src/taskGrid/FlowChart.css b/ElectronJS/src/taskGrid/FlowChart.css
index 4b219bc..9f0cd2c 100644
--- a/ElectronJS/src/taskGrid/FlowChart.css
+++ b/ElectronJS/src/taskGrid/FlowChart.css
@@ -221,7 +221,8 @@
position: sticky;
top: 0px;
margin-bottom: 0px;
- background-color: azure;
+ /*background-color: azure;*/
+ background-color: aliceblue;
z-index: 1000;
}
diff --git a/ElectronJS/src/taskGrid/FlowChart.html b/ElectronJS/src/taskGrid/FlowChart.html
index f519631..7cc6d31 100644
--- a/ElectronJS/src/taskGrid/FlowChart.html
+++ b/ElectronJS/src/taskGrid/FlowChart.html
@@ -113,10 +113,10 @@
After executed, whether scroll down:
- No scrolling
- Scroll one screen
- Scroll to the end
- Keep scrolling until the page data does not change
+ No scrolling
+ Scroll one screen
+ Scroll to the end
+ Keep scrolling until the page data does not change
Scroll Times (the wait time after scrolling ineffective when the scrolling type is set to no scrolling ):
@@ -157,12 +157,17 @@
Selenium
JavaScript
+ Open link in new tab:
+
+ Yes
+ No
+
Whether to scroll down after clicking:
- No Scrolling
- Scroll one screen
- Scroll to the end
- Keep scrolling until the page data does not change
+ No Scrolling
+ Scroll one screen
+ Scroll to the end
+ Keep scrolling until the page data does not change
Scroll Times:
@@ -218,10 +223,10 @@
{{paras.parameters[i-1]["exampleValues"][0]["value"]}}
- Modify
- Delete
- Up
- Down
+ Modify
+ Delete
+ Up
+ Down
@@ -241,6 +246,7 @@
+
Execute a JavaScript script before extracting data from this element:
@@ -414,8 +420,8 @@ This option is an advanced feature that allows directly returning the expression
Please note that this feature does not support assigning values to variables. In other words, you cannot write something like `self.myVar = 1`. If you want to perform assignment operations, please select the previous option, "Run Python code on current environment (the "exec" operation)"
Whether to record the output/return value of the execution as a field:
- No
- Yes
+ No
+ Yes
Convert parameter type to:
@@ -490,10 +496,10 @@ Please note that this feature does not support assigning values to variables. In
Option switch Mode
- Switch to the next option
- Switch options by index (0 is the first option)
- Switch options by option value
- Switch options by option text
+ Switch to the next option
+ Switch options by index (0 is the first option)
+ Switch options by option value
+ Switch options by option text
Set value (not applicable for "Switch to the next option" mode)
@@ -519,7 +525,7 @@ Please note that this feature does not support assigning values to variables. In
Operation is in iframe
Loop Type:
-
+
Single Element
Unfixed Element List
Fixed Element List
@@ -568,9 +574,9 @@ If the expression returns a value greater than 0 or evaluates to True, the loop
(Advanced Operation) Define loop exit condition using code/script; or you can add a Custom Action , then select the "Exit Loop" option:
- Do not set script (even if a script is written below, it will not be executed)
- JavaScript script (start with 'return ')
- Operating system-level command
+ Do not set script (even if a script is written below, it will not be executed)
+ JavaScript script (start with 'return ')
+ Operating system-level command
- The conditions are evaluated from left to right, which means if the condition in the leftmost branch is satisfied, the operations within that branch are executed. Otherwise, the condition in the next branch from left to right is evaluated, and so on.
+ The conditions are evaluated from left to right, which means if the condition in the leftmost branch is satisfied, the operations within that branch are executed. Otherwise, the condition in the next branch from left to right is evaluated, and so on. Clicking on a branch while designing tasks allows for dynamic debugging in the browser to verify if the branch satisfies the condition (not applicable to system commands and Python Eval operations).
-
The conditions are evaluated from left to right, which means if the condition in the leftmost branch is satisfied, the operations within that branch are executed. Otherwise, the condition in the next branch from left to right is evaluated, and so on.
+
The conditions are evaluated from left to right, which means if the condition in the leftmost branch is satisfied, the operations within that branch are executed. Otherwise, the condition in the next branch from left to right is evaluated, and so on. Clicking on a branch while designing tasks allows for dynamic debugging in the browser to verify if the branch satisfies the condition (not applicable to system commands and Python Eval operations).
Operation is in iframe
Condition Type:
-
+
No Condition
Text inside current page
Element inside current page
@@ -653,8 +659,8 @@ If the expression returns a value greater than 0 or evaluates to True, the opera
Wait Type
- Fixed wait (set to wait for 10 seconds then it will wait for 10 seconds)
- Random wait (set to wait for 10 seconds then it will randomly wait for 10 × 0.5 - 10 × 1.5 seconds)
+ Fixed wait (set to wait for 10 seconds then it will wait for 10 seconds)
+ Random wait (set to wait for 10 seconds then it will randomly wait for 10 × 0.5 - 10 × 1.5 seconds)
diff --git a/ElectronJS/src/taskGrid/FlowChart.js b/ElectronJS/src/taskGrid/FlowChart.js
index 4a16827..b3749b2 100644
--- a/ElectronJS/src/taskGrid/FlowChart.js
+++ b/ElectronJS/src/taskGrid/FlowChart.js
@@ -92,12 +92,12 @@ let app = new Vue({
},
loopType: { //循环类型发生变化的时候更新参数值
handler: function (newVal, oldVal) {
- this.nowNode["parameters"]["loopType"] = newVal;
+ // this.nowNode["parameters"]["loopType"] = newVal;
}
},
TClass: {
handler: function (newVal, oldVal) {
- this.nowNode["parameters"]["class"] = newVal;
+ // this.nowNode["parameters"]["class"] = newVal;
}
},
useLoop: {
@@ -122,7 +122,7 @@ let app = new Vue({
}
},
methods: {
- handleCodeModeChange: function (value) {
+ handleCodeModeChange: function () {
// if (this.codeMode == undefined || this.codeMode == null || this.codeMode == -1) {
// return;
// }
@@ -166,6 +166,73 @@ let app = new Vue({
break;
}
},
+ handleLoopTypeChange: function () {
+ this.nowNode["parameters"]["loopType"] = this.loopType;
+ switch (parseInt(this.loopType)) {
+ case 0:
+ this.nowNode["title"] = LANG("循环 - 单个元素", "Loop - Single Element");
+ break;
+ case 1:
+ this.nowNode["title"] = LANG("循环 - 不固定元素列表", "Loop - Dynamic Element List");
+ break;
+ case 2:
+ this.nowNode["title"] = LANG("循环 - 固定元素列表", "Loop - Fixed Element List");
+ break;
+ case 3:
+ this.nowNode["title"] = LANG("循环 - 文本列表", "Loop - Text List");
+ break;
+ case 4:
+ this.nowNode["title"] = LANG("循环 - 网址列表", "Loop - URL List");
+ break;
+ case 5:
+ this.nowNode["title"] = LANG("循环 - JavaScript命令返回值", "Loop - JavaScript Command Return Value");
+ break;
+ case 6:
+ this.nowNode["title"] = LANG("循环 - 系统命令返回值", "Loop - OS Command Return Value");
+ break;
+ case 7:
+ this.nowNode["title"] = LANG("循环 - Python表达式返回值", "Loop - Python Expression Evaluation Value");
+ break;
+ default:
+ this.nowNode["title"] = LANG("循环", "Loop");
+ break;
+ }
+ },
+ handleJudgeTypeChange: function () {
+ this.nowNode["parameters"]["class"] = this.TClass;
+ switch (parseInt(this.TClass)) {
+ case 0:
+ this.nowNode["title"] = LANG("无条件", "No Condition");
+ break;
+ case 1:
+ this.nowNode["title"] = LANG("当前页面包含文本", "Current Page Contains Text");
+ break;
+ case 2:
+ this.nowNode["title"] = LANG("当前页面包含元素", "Current Page Contains Element");
+ break;
+ case 3:
+ this.nowNode["title"] = LANG("当前循环项包含文本", "Current Loop Item Contains Text");
+ break;
+ case 4:
+ this.nowNode["title"] = LANG("当前循环项包含元素", "Current Loop Item Contains Element");
+ break;
+ case 5:
+ this.nowNode["title"] = LANG("JavaScript命令返回值", "JavaScript Command Return Value");
+ break;
+ case 6:
+ this.nowNode["title"] = LANG("系统命令返回值", "OS Command Return Value");
+ break;
+ case 7:
+ this.nowNode["title"] = LANG("针对当前循环项的JavaScript命令返回值", "JavaScript Command Return Value for Current Loop Item");
+ break;
+ case 8:
+ this.nowNode["title"] = LANG("执行环境下的Python表达式值", "Python Expression Evaluation Value");
+ break;
+ default:
+ this.nowNode["title"] = LANG("条件分支", "Condition");
+ break;
+ }
+ },
getCookies: function () { //获取cookies
let command = new WebSocket("ws://localhost:" + getUrlParam("wsport"))
command.onopen = function () {
@@ -216,30 +283,38 @@ let app = new Vue({
$("#app > div.elements > div.toolkitcontain > table.toolkittb4 > tbody > tr:last-child")[0].scrollIntoView(false); //滚动到底部
}, 200);
},
- modifyParas: function (i) { //修改第i个参数
+ modifyPara: function (i) { //修改第i个参数
this.paraIndex = i;
- console.log(this.paras);
+ let clone_node = DeepClone(this.nowNode);
+ clone_node.option = 11; //单独的提取数据参数节点
+ clone_node.parameters.index = i;
+ trailElement(clone_node, 0);
},
- deleteParas: function (i) { //删除第i个参数
+ trailPara: function (i) { //试运行第i个参数
+ let clone_node = DeepClone(this.nowNode);
+ clone_node.option = 11; //单独的提取数据参数节点
+ clone_node.parameters.index = i;
+ trailElement(clone_node, 1);
+ },
+ deletePara: function (i) { //删除第i个参数
this.nowNode["parameters"]["paras"].splice(i, 1);
//如果参数删除完了,就把提取数据也删掉
if (this.nowNode["parameters"]["paras"].length == 0) {
deleteElement();
}
},
- upParas: function (i) { //上移第i个参数
+ upPara: function (i) { //上移第i个参数
if (i != 0) {
let t = this.nowNode["parameters"]["paras"].splice(i, 1)[0];
this.nowNode["parameters"]["paras"].splice(i - 1, 0, t);
}
},
- downParas: function (i) { //下移第i个参数
+ downPara: function (i) { //下移第i个参数
if (i != this.nowNode["parameters"]["paras"].length - 1) {
let t = this.nowNode["parameters"]["paras"].splice(i, 1)[0];
this.nowNode["parameters"]["paras"].splice(i + 1, 0, t);
}
},
-
getType: function (nodeType, contentType) { //根据类型得到字段名称
if (contentType == 2) {
return "InnerHTML";
@@ -283,20 +358,20 @@ function newNode(node) {
} else if (type == 1) //循环
{
return `
↓
`;
} else if (type == 2) //判断
{
return LANG(`
-
${title}
+
${title}
点击此处在最右边增加条件分支
↓
`,
`
-
${title}
+
${title}
Click here to add a new condition to the right most
@@ -304,7 +379,7 @@ function newNode(node) {
} else //判断分支
{
return `
`;
@@ -346,27 +421,7 @@ function branchClick(e) {
e.stopPropagation(); //防止冒泡
}
-function elementMousedown(e) {
- if (e.button == 2) //右键点击
- {
- try {
- document.getElementById("contextMenu").remove();
- } catch {
-
- }
- if (nowNode != null) {
- nowNode.style.borderColor = "skyblue";
- }
- nowNode = this;
- vueData.nowNodeIndex = actionSequence[this.getAttribute("data")];
- this.style.borderColor = "blue";
- handleElement(); //处理元素
- }
- e.stopPropagation(); //防止冒泡
-}
-
-//元素点击事件
-function elementClick(e) {
+function operationChange(e, theNode) {
try {
document.getElementById("contextMenu").remove();
} catch (e) {
@@ -375,23 +430,40 @@ function elementClick(e) {
if (nowNode != null) {
nowNode.style.borderColor = "skyblue";
}
- nowNode = this;
- vueData.nowNodeIndex = actionSequence[this.getAttribute("data")];
- this.style.borderColor = "blue";
+ nowNode = theNode
+ vueData.nowNodeIndex = actionSequence[theNode.getAttribute("data")];
+ theNode.style.borderColor = "blue";
handleElement(); //处理元素
+ trailElement(app._data.nowNode, 0);
e.stopPropagation(); //防止冒泡
}
+function elementMousedown(e) {
+ if (e.button == 2) //右键点击
+ {
+ operationChange(e, this);
+ }
+ e.stopPropagation(); //防止冒泡
+}
+
+//元素点击事件
+function elementClick(e) {
+ operationChange(e, this);
+ e.stopPropagation();
+}
+
function elementDblClick(e) {
try {
let nodeType = app._data.nowNode["option"]
if (nodeType >= 8) {
- showInfo(LANG("试运行功能不适用于循环和条件分支操作,请试运行循环或条件分支内部的具体操作,如点击元素。", "The trial run function is not applicable to loop and condition branch operations. Please try to run the specific operations in the loop/condition branch, such as clicking elements."));
+ if (nodeType == 8) {
+ showInfo(LANG("试运行功能不适用于循环操作,请试运行循环内部的具体操作,如点击元素。", "The trial run function is not applicable to loop operations. Please try to run the specific operations in the loop, such as clicking elements."));
+ }
} else {
- if(nodeType == 5 && app._data.nowNode["parameters"]["codeMode"] != 0){
- showInfo(LANG("试运行自定义操作功能只适用于执行JavaScript操作。", "The trial run custom action function is only applicable to run JavaScript operation."))
+ if (nodeType == 5 && (app._data.nowNode["parameters"]["codeMode"] != 0 && app._data.nowNode["parameters"]["codeMode"] != 8)) {
+ showInfo(LANG("试运行自定义操作功能只适用于执行JavaScript和刷新页面操作。", "The trial run custom action function is only applicable to run JavaScript and refresh page operations."));
} else {
- trailRun(app._data.nowNode);
+ trailElement(app._data.nowNode, 1);
}
}
} catch (e) {
@@ -513,7 +585,7 @@ function toolBoxKernel(e, para = null) {
if (str == "") {
title += LANG("元素", "Element");
} else {
- if(window.location.href.indexOf("_CN") != -1){
+ if (window.location.href.indexOf("_CN") != -1) {
if (str.length > l) {
str = str.substring(0, l) + "...";
}
@@ -549,7 +621,7 @@ function toolBoxKernel(e, para = null) {
index: l + 1,
type: 3,
option: 10,
- title: LANG("条件分支1", "Condition 1"),
+ title: LANG("无条件", "No Condition"),
sequence: [],
isInLoop: false,
};
@@ -559,7 +631,7 @@ function toolBoxKernel(e, para = null) {
index: l + 2,
type: 3,
option: 10,
- title: LANG("条件分支2", "Condition 2"),
+ title: LANG("无条件", "No Condition"),
sequence: [],
isInLoop: false,
};
diff --git a/ElectronJS/src/taskGrid/FlowChart_CN.html b/ElectronJS/src/taskGrid/FlowChart_CN.html
index ea06f44..80c8bbd 100644
--- a/ElectronJS/src/taskGrid/FlowChart_CN.html
+++ b/ElectronJS/src/taskGrid/FlowChart_CN.html
@@ -157,13 +157,18 @@
Selenium点击
JavaScript点击
+
在新标签页打开超链接:
+
+ 是
+ 否
+
点击后是否向下滚动页面:
- 不滚动
- 向下滚动一屏
- 滚动到底部
- 一直滚动直到页面内容无变化(需设置好滚动后的等待时间用于检测页面变化)
-
+
不滚动
+
向下滚动一屏
+
滚动到底部
+
一直滚动直到页面内容无变化(需设置好滚动后的等待时间用于检测页面变化)
+
滚动次数(滚动类型设置为不滚动 或一直滚动 时请忽略此项):
滚动后等待时间(秒):
@@ -218,10 +223,10 @@
{{paras.parameters[i-1]["exampleValues"][0]["value"]}}
- 修改
- 删除
- 上移
- 下移
+ 修改
+ 删除
+ 上移
+ 下移
@@ -241,6 +246,7 @@
+
提取该元素数据前 针对该元素执行一段JavaScript脚本:
@@ -519,7 +525,7 @@ print(emotlib.emoji()) # 使用其中的函数。
在iframe内操作
循环类型:
-
+
单个元素(多用于循环点击下一页)
不固定元素列表
固定元素列表
@@ -596,14 +602,14 @@ print(emotlib.emoji()) # 使用其中的函数。
- 判断条件是从左往右判断的,即如果最左边的条件分支的判断条件满足,则执行最左边分支内的操作,否则判断从左向右第二个分支的条件是否满足,以此类推。
+ 判断条件是从左往右判断的,即如果最左边的条件分支的判断条件满足,则执行最左边分支内的操作,否则判断从左向右第二个分支的条件是否满足,以此类推。设计任务时点击分支即可在浏览器中动态调试 分支是否满足(不适用于系统命令和Python Eval操作)。
-
判断条件是从左往右判断的,即如果最左边的条件分支的判断条件满足,则执行最左边分支内的操作,否则判断从左向右第二个分支的条件是否满足,以此类推。
+
判断条件是从左往右判断的,即如果最左边的条件分支的判断条件满足,则执行最左边分支内的操作,否则判断从左向右第二个分支的条件是否满足,以此类推。设计任务时点击分支即可在浏览器中动态调试 分支是否满足(不适用于系统命令和Python Eval操作)。
在iframe内操作
条件类型:
-
+
无条件
当前页面包括文本
当前页面包括元素
diff --git a/ElectronJS/src/taskGrid/logic.js b/ElectronJS/src/taskGrid/logic.js
index 83b5a47..b2e6d3a 100644
--- a/ElectronJS/src/taskGrid/logic.js
+++ b/ElectronJS/src/taskGrid/logic.js
@@ -8,8 +8,8 @@ let exampleMsg = { //示例消息
}
}
console.log(JSON.stringify(exampleMsg));
-let ws = new WebSocket("ws://localhost:"+getUrlParam("wsport"));
-ws.onopen = function() {
+let ws = new WebSocket("ws://localhost:" + getUrlParam("wsport"));
+ws.onopen = function () {
// Web Socket 已连接上,使用 send() 方法发送数据
console.log("已连接");
message = {
@@ -20,12 +20,12 @@ ws.onopen = function() {
};
this.send(JSON.stringify(message));
};
-ws.onclose = function() {
+ws.onclose = function () {
// 关闭 websocket
console.log("连接已关闭...");
};
let old_title = "";
-ws.onmessage = function(evt) {
+ws.onmessage = function (evt) {
evt = JSON.parse(evt.data);
console.log(evt);
if (evt["type"] == "title") { //如果不是特殊处理的话,默认全部是增加元素操作
@@ -36,9 +36,9 @@ ws.onmessage = function(evt) {
} else if (evt["type"] == "notify") {
if (evt["level"] == "success") {
showSuccess(LANG(evt["msg_zh"], evt["msg_en"]));
- } else if(evt["level"] == "info"){
+ } else if (evt["level"] == "info") {
showInfo(LANG(evt["msg_zh"], evt["msg_en"]));
- } else if(evt["level"] == "error"){
+ } else if (evt["level"] == "error") {
showError(LANG(evt["msg_zh"], evt["msg_en"]));
}
} else {
@@ -46,20 +46,20 @@ ws.onmessage = function(evt) {
}
};
-function changeOutputFormat(para){
- try{
- for(let i=0;i 20000) {
- if($("#outputFormat").val() == "xlsx") {
+ if ($("#outputFormat").val() == "xlsx") {
$("#outputFormat").val("csv"); //如果有一个参数的示例值长度超过20000,就默认输出为csv
showInfo(LANG("示例值长度超过16000,超出Excel单个单元格存储限制,已自动切换保存为csv格式。", "The length of the example value exceeds 16000, and the csv save format has been automatically switched."));
}
break;
}
}
- } catch(e){
+ } catch (e) {
console.log(e);
}
}
@@ -85,7 +85,10 @@ function handleAddElement(msg) {
addElement(2, msg);
} else if (msg["type"] == "inputText") {
addElement(4, msg);
- } else if (msg["type"] == "changeOption"){
+ } else if (msg["type"] == "batchInputText") {
+ addElement(8, msg);
+ addElement(4, msg);
+ } else if (msg["type"] == "changeOption") {
addElement(6, msg);
} else if (msg["type"] == "mouseMove") {
addElement(7, msg);
@@ -110,7 +113,8 @@ function handleAddElement(msg) {
}
changeOutputFormat(msg);
app._data.paras.parameters = app._data["nowNode"]["parameters"]["paras"];
- setTimeout(function(){$("#app > div.elements > div.toolkitcontain > table.toolkittb4 > tbody > tr:last-child")[0].scrollIntoView(false); //滚动到底部
+ setTimeout(function () {
+ $("#app > div.elements > div.toolkitcontain > table.toolkittb4 > tbody > tr:last-child")[0].scrollIntoView(false); //滚动到底部
}, 200);
} else {
addElement(3, msg);
@@ -122,9 +126,9 @@ function handleAddElement(msg) {
addElement(3, msg);
changeOutputFormat(msg);
notifyParameterNum(msg["parameters"].length); //通知浏览器端参数的个数变化
- } else if(msg["type"] == "GetCookies"){
- for(let node of nodeList){
- if(node["option"] == 1){
+ } else if (msg["type"] == "GetCookies") {
+ for (let node of nodeList) {
+ if (node["option"] == 1) {
node["parameters"]["cookies"] = msg["message"];
$("#pageCookies").val(msg["message"]);
break;
@@ -138,18 +142,28 @@ function notifyParameterNum(num) {
let message = {
type: 3, //消息类型,3代表元素增加事件
from: 1, //0代表从浏览器到流程图,1代表从流程图到浏览器
- message: { "pipe": JSON.stringify({ "type": "update_parameter_num", "value": parameterNum }) } // {}全选{BS}退格
+ message: {"pipe": JSON.stringify({"type": "update_parameter_num", "value": parameterNum})} // {}全选{BS}退格
};
ws.send(JSON.stringify(message));
}
-function trailRun(node){
+function trailElement(node, type = 1) {
+ // type=0代表标记节点,type=1代表试运行
+ let parentNode = nodeList[actionSequence[node["parentId"]]];
+ if (node.option == 10) { //条件分支的话,传父元素的父元素
+ parentNode = nodeList[actionSequence[parentNode["parentId"]]];
+ }
+ if (parentNode.option == 10) { //如果父元素是条件分支,传父元素的爷爷元素
+ parentNode = nodeList[actionSequence[parentNode["parentId"]]];
+ parentNode = nodeList[actionSequence[parentNode["parentId"]]];
+ }
let message = {
type: 4, //消息类型,4代表试运行事件
from: 1, //0代表从浏览器到流程图,1代表从流程图到浏览器
- message: { "node": JSON.stringify(node), "parentNode": JSON.stringify(nodeList[actionSequence[node["parentId"]]])}
+ message: {"type": type, "node": JSON.stringify(node), "parentNode": JSON.stringify(parentNode)}
};
ws.send(JSON.stringify(message));
+ console.log(node);
console.log(message);
}
@@ -165,7 +179,7 @@ function handleElement() {
} else if (app._data["nodeType"] == 3) {
app._data.paraIndex = 0; //参数索引初始化
app._data.paras.parameters = app._data["nowNode"]["parameters"]["paras"];
- } else if (app._data["nodeType"] == 5){
+ } else if (app._data["nodeType"] == 5) {
app._data.codeMode = app._data["nowNode"]["parameters"]["codeMode"];
} else if (app._data["nodeType"] == 10) {
app._data.TClass = app._data["nowNode"]["parameters"]["class"];
@@ -203,6 +217,7 @@ function addParameters(t) {
t["parameters"]["scrollCount"] = 1; //滚动次数
t["parameters"]["scrollWaitTime"] = 1; //滚动后等待时间
t["parameters"]["clickWay"] = 0; //点击方式,0代表selenium点击,1代表js点击
+ t["parameters"]["newTab"] = 1; //是否新标签页打开
t["parameters"]["maxWaitTime"] = 10; //最长等待时间
t["parameters"]["paras"] = []; //默认参数列表
t["parameters"]["wait"] = 2; //点击后等待时间默认2s
@@ -222,7 +237,7 @@ function addParameters(t) {
t["parameters"]["beforeJSWaitTime"] = 0; //执行前js等待时间
t["parameters"]["afterJS"] = ""; //执行后执行的js
t["parameters"]["afterJSWaitTime"] = 0; //执行后js等待时间
- } else if(t.option == 5) { //自定义操作
+ } else if (t.option == 5) { //自定义操作
t["title"] = LANG("执行JavaScript", "Run JavaScript");
t["parameters"]["clear"] = 0; //清空其他字段数据
t["parameters"]["newLine"] = 1; //生成新行
@@ -246,6 +261,7 @@ function addParameters(t) {
t["parameters"]["optionValue"] = ""; //下拉值
t["parameters"]["index"] = 0; //输入框索引
} else if (t.option == 8) { //循环
+ t["title"] = LANG("循环 - 单个元素", "Loop - single element");
t["parameters"]["scrollType"] = 0; //滚动类型,0不滚动,1向下滚动1屏,2滚动到底部
t["parameters"]["scrollCount"] = 1; //滚动次数
t["parameters"]["scrollWaitTime"] = 1; //滚动后等待时间
@@ -262,7 +278,7 @@ function addParameters(t) {
t["parameters"]["breakCode"] = ""; //break条件
t["parameters"]["breakCodeWaitTime"] = 0; //break条件等待时间
} else if (t.option == 9) { //条件
-
+ t["title"] = LANG("判断条件 - 从左往右依次判断", "Judgment condition - judge from left to right");
} else if (t.option == 10) { //条件分支
t["parameters"]["class"] = 0; //0代表什么条件都没有,1代表当前页面包括文本,2代表当前页面包括元素,3代表当前循环包括文本,4代表当前循环包括元素
t["parameters"]["value"] = ""; //相关值
@@ -305,12 +321,13 @@ function modifyParameters(t, para) {
t["parameters"]["value"] = para["value"];
t["parameters"]["xpath"] = para["xpath"];
t["parameters"]["allXPaths"] = para["allXPaths"];
- } else if(t.option == 6){
+ t["parameters"]["useLoop"] = para["useLoop"];
+ } else if (t.option == 6) {
t["parameters"]["xpath"] = para["xpath"];
t["parameters"]["allXPaths"] = para["allXPaths"];
t["parameters"]["optionMode"] = para["optionMode"];
t["parameters"]["optionValue"] = para["optionValue"];
- } else if(t.option == 7){
+ } else if (t.option == 7) {
t["parameters"]["xpath"] = para["xpath"];
t["parameters"]["useLoop"] = para["useLoop"];
t["parameters"]["allXPaths"] = para["allXPaths"];
@@ -318,6 +335,7 @@ function modifyParameters(t, para) {
t["parameters"]["loopType"] = para["loopType"];
t["parameters"]["xpath"] = para["xpath"];
t["parameters"]["allXPaths"] = para["allXPaths"];
+ t["parameters"]["textList"] = para["value"];
if (para["nextPage"]) { //循环点击下一页的情况下
t["title"] = LANG("循环点击下一页", "Loop click next page");
} else if (para["type"] == "loopClickSingle") { //循环点击单个元素
@@ -326,8 +344,10 @@ function modifyParameters(t, para) {
t["title"] = LANG("循环点击每个元素", "Loop click every element");
} else if (para["type"] == "loopMouseMove") { //循环移动到单个元素
t["title"] = LANG("循环移动到每个元素", "Loop move to every element");
- } else if (para["type"] == "multiCollectWithPattern"){
+ } else if (para["type"] == "multiCollectWithPattern") {
t["title"] = LANG("循环采集数据", "Loop collect data");
+ } else if (para["type"] == "batchInputText") {
+ t["title"] = LANG("循环输入文字", "Loop input text");
} else {
t["title"] = LANG("循环", "Loop");
}
@@ -343,24 +363,26 @@ function modifyParameters(t, para) {
}
}
-function showSuccess(msg, time=4000) {
+function showSuccess(msg, time = 4000) {
$("#tip").text(msg);
$("#tip").slideDown(); //提示框
- let fadeout = setTimeout(function() {
+ let fadeout = setTimeout(function () {
$("#tip").slideUp();
}, time);
}
-function showInfo(msg, time=4000) {
+
+function showInfo(msg, time = 4000) {
$("#info_message").text(msg);
$("#tipInfo").slideDown(); //提示框
- let fadeout = setTimeout(function() {
+ let fadeout = setTimeout(function () {
$("#tipInfo").slideUp();
}, time);
}
-function showError(msg, time=4000) {
+
+function showError(msg, time = 4000) {
$("#error_message").text(msg);
$("#tipError").slideDown(); //提示框
- let fadeout = setTimeout(function() {
+ let fadeout = setTimeout(function () {
$("#tipError").slideUp();
}, time);
}
@@ -370,11 +392,11 @@ function showError(msg, time=4000) {
$("#confirm").mousedown(updateUI);
//点击保存任务按钮时的处理
-$("#saveButton").mousedown(function() {
+$("#saveButton").mousedown(function () {
saveService(0);
});
//点击另存为任务按钮时的处理
-$("#saveAsButton").mousedown(function() {
+$("#saveAsButton").mousedown(function () {
saveService(1);
});
@@ -398,170 +420,178 @@ function saveService(type) {
text = LANG("确认要另存为任务吗(不能用鼠标点击时,请按键盘回车键)?", "Are you sure to save the task as (if you can't use the mouse to click, please press the enter key)?");
}
// if (confirm(text)) {
- let serviceName = $("#serviceName").val();
- let url = $("#url").val();
- let serviceDescription = $("#serviceDescription").val();
- let inputParameters = [];
- let outputParameters = [];
- let outputNames = [];
- let inputIndex = 0;
- let outputIndex = 0;
- let links = "about:blank"; //记录所有的link
- let containJudge = false; //是否含有判断语句
- let saveThreshold = parseInt($("#saveThreshold").val());
- let cloudflare = parseInt($("#cloudflare").val());
- let environment = parseInt($("#environment").val());
- for (let i = 1; i < nodeList.length; i++) {
- if (nodeList[i]["id"] != -1) { //已经被删除的节点不进行统计
- if (nodeList[i]["option"] == 1) //打开网页操作,统计输入框输入操作
+ let serviceName = $("#serviceName").val();
+ let url = $("#url").val();
+ let serviceDescription = $("#serviceDescription").val();
+ let inputParameters = [];
+ let outputParameters = [];
+ let outputNames = [];
+ let inputIndex = 0;
+ let outputIndex = 0;
+ let links = "about:blank"; //记录所有的link
+ let containJudge = false; //是否含有判断语句
+ let saveThreshold = parseInt($("#saveThreshold").val());
+ let cloudflare = parseInt($("#cloudflare").val());
+ let environment = parseInt($("#environment").val());
+ for (let i = 1; i < nodeList.length; i++) {
+ if (nodeList[i]["id"] != -1) { //已经被删除的节点不进行统计
+ if (nodeList[i]["option"] == 1) //打开网页操作,统计输入框输入操作
+ {
+ if (!nodeList[i]["parameters"]["useLoop"]) //如果不是使用循环里的文本
{
- if (!nodeList[i]["parameters"]["useLoop"]) //如果不是使用循环里的文本
- {
- inputParameters.push({
- id: inputIndex,
- name: "urlList_" + inputIndex++,
- nodeId: i, //记录操作位于的节点位置,重要!!!
- nodeName: nodeList[i]["title"],
- value: nodeList[i]["parameters"]["links"],
- desc: LANG("要采集的网址列表,多行以\\n分开","List of URLs to be collected, separated by \\n for multiple lines",),
- type: "text",
- exampleValue: nodeList[i]["parameters"]["links"]
- });
- links = nodeList[i]["parameters"]["links"];
- }
- } else if (nodeList[i]["option"] == 4) //输入文字操作
- {
- if (!nodeList[i]["parameters"]["useLoop"]) //如果不是使用循环里的文本
- {
- inputParameters.push({
- id: inputIndex,
- name: "inputText_" + inputIndex++,
- nodeName: nodeList[i]["title"],
- nodeId: i,
- desc: LANG("要输入的文本,如京东搜索框输入:电脑","The text to be entered, such as 'computer' at eBay search box"),
- type: "text",
- exampleValue: nodeList[i]["parameters"]["value"],
- value: nodeList[i]["parameters"]["value"],
- });
- }
- } else if (nodeList[i]["option"] == 8) //循环操作
- {
- if (parseInt(nodeList[i]["parameters"]["loopType"]) > 2 && parseInt(nodeList[i]["parameters"]["loopType"]) < 5) { //循环中的循环输入文本或循环输入网址
- inputParameters.push({
- id: inputIndex,
- name: "loopText_" + inputIndex++,
- nodeId: i,
- nodeName: nodeList[i]["title"],
- desc: LANG("要输入的文本/网址,多行以\\n分开", "Text/URL to be entered, multiple lines should be separated by \\n"),
- type: "text",
- exampleValue: nodeList[i]["parameters"]["textList"],
- value: nodeList[i]["parameters"]["textList"],
- });
- } else if (parseInt(nodeList[i]["parameters"]["loopType"]) == 0) {
- inputParameters.push({
- id: inputIndex,
- name: "loopTimes_" + nodeList[i]["title"] + "_" + inputIndex++,
- nodeId: i,
- nodeName: nodeList[i]["title"],
- desc: LANG("循环" + nodeList[i]["title"] + "执行的次数(0代表无限循环)", "Number of loop executions for loop "+nodeList[i]["title"]+", 0 means unlimited loops (until element not found)"),
- type: "int",
- exampleValue: nodeList[i]["parameters"]["exitCount"],
- value: nodeList[i]["parameters"]["exitCount"],
- });
- }
- } else if (nodeList[i]["option"] == 3) //提取数据操作
- {
- for (let j = 0; j < nodeList[i]["parameters"]["paras"].length; j++) {
- if (outputNames.indexOf(nodeList[i]["parameters"]["paras"][j]["name"]) < 0) { //参数名称还未被添加
- outputNames.push(nodeList[i]["parameters"]["paras"][j]["name"]);
- outputParameters.push({
- id: outputIndex++,
- name: nodeList[i]["parameters"]["paras"][j]["name"],
- desc: nodeList[i]["parameters"]["paras"][j]["desc"],
- type: nodeList[i]["parameters"]["paras"][j]["paraType"],
- recordASField: nodeList[i]["parameters"]["paras"][j]["recordASField"],
- exampleValue: nodeList[i]["parameters"]["paras"][j]["exampleValues"][0]["value"],
- });
- }
- }
- } else if (nodeList[i]["option"] == 5) //自定义操作
- {
- // if (nodeList[i]["parameters"]["recordASField"] == 1) {
- let id = outputIndex++;
- let title = nodeList[i]["title"];
- // if (outputNames.indexOf(title) >= 0) { //参数名称已经被添加
- // $('#myModal').modal('hide');
- // $("#tip2").slideDown(); //提示框
- // fadeout = setTimeout(function() {
- // $("#tip2").slideUp();
- // }, 5000);
- // return;
- // }
- outputNames.push(title);
- outputParameters.push({
- id: id,
- name: title,
- desc: LANG("自定义操作返回的数据","Output of custom action"),
- type: nodeList[i]["parameters"]["paraType"],
- recordASField: nodeList[i]["parameters"]["recordASField"],
- exampleValue: "",
+ inputParameters.push({
+ id: inputIndex,
+ name: "urlList_" + inputIndex++,
+ nodeId: i, //记录操作位于的节点位置,重要!!!
+ nodeName: nodeList[i]["title"],
+ value: nodeList[i]["parameters"]["links"],
+ desc: LANG("要采集的网址列表,多行以\\n分开", "List of URLs to be collected, separated by \\n for multiple lines",),
+ type: "text",
+ exampleValue: nodeList[i]["parameters"]["links"]
});
- // }
- } else if (nodeList[i]["option"] == 9) //条件判断
- {
- containJudge = true;
+ links = nodeList[i]["parameters"]["links"];
}
+ } else if (nodeList[i]["option"] == 4) //输入文字操作
+ {
+ if (!nodeList[i]["parameters"]["useLoop"]) //如果不是使用循环里的文本
+ {
+ inputParameters.push({
+ id: inputIndex,
+ name: "inputText_" + inputIndex++,
+ nodeName: nodeList[i]["title"],
+ nodeId: i,
+ desc: LANG("要输入的文本,如京东搜索框输入:电脑", "The text to be entered, such as 'computer' at eBay search box"),
+ type: "text",
+ exampleValue: nodeList[i]["parameters"]["value"],
+ value: nodeList[i]["parameters"]["value"],
+ });
+ }
+ } else if (nodeList[i]["option"] == 8) //循环操作
+ {
+ if (parseInt(nodeList[i]["parameters"]["loopType"]) > 2 && parseInt(nodeList[i]["parameters"]["loopType"]) < 5) { //循环中的循环输入文本或循环输入网址
+ inputParameters.push({
+ id: inputIndex,
+ name: "loopText_" + inputIndex++,
+ nodeId: i,
+ nodeName: nodeList[i]["title"],
+ desc: LANG("要输入的文本/网址,多行以\\n分开", "Text/URL to be entered, multiple lines should be separated by \\n"),
+ type: "text",
+ exampleValue: nodeList[i]["parameters"]["textList"],
+ value: nodeList[i]["parameters"]["textList"],
+ });
+ } else if (parseInt(nodeList[i]["parameters"]["loopType"]) == 0) {
+ inputParameters.push({
+ id: inputIndex,
+ name: "loopTimes_" + nodeList[i]["title"] + "_" + inputIndex++,
+ nodeId: i,
+ nodeName: nodeList[i]["title"],
+ desc: LANG("循环" + nodeList[i]["title"] + "执行的次数(0代表无限循环)", "Number of loop executions for loop " + nodeList[i]["title"] + ", 0 means unlimited loops (until element not found)"),
+ type: "int",
+ exampleValue: nodeList[i]["parameters"]["exitCount"],
+ value: nodeList[i]["parameters"]["exitCount"],
+ });
+ }
+ } else if (nodeList[i]["option"] == 3) //提取数据操作
+ {
+ for (let j = 0; j < nodeList[i]["parameters"]["paras"].length; j++) {
+ if (outputNames.indexOf(nodeList[i]["parameters"]["paras"][j]["name"]) < 0) { //参数名称还未被添加
+ outputNames.push(nodeList[i]["parameters"]["paras"][j]["name"]);
+ outputParameters.push({
+ id: outputIndex++,
+ name: nodeList[i]["parameters"]["paras"][j]["name"],
+ desc: nodeList[i]["parameters"]["paras"][j]["desc"],
+ type: nodeList[i]["parameters"]["paras"][j]["paraType"],
+ recordASField: nodeList[i]["parameters"]["paras"][j]["recordASField"],
+ exampleValue: nodeList[i]["parameters"]["paras"][j]["exampleValues"][0]["value"],
+ });
+ }
+ }
+ } else if (nodeList[i]["option"] == 5) //自定义操作
+ {
+ // if (nodeList[i]["parameters"]["recordASField"] == 1) {
+ let id = outputIndex++;
+ let title = nodeList[i]["title"];
+ // if (outputNames.indexOf(title) >= 0) { //参数名称已经被添加
+ // $('#myModal').modal('hide');
+ // $("#tip2").slideDown(); //提示框
+ // fadeout = setTimeout(function() {
+ // $("#tip2").slideUp();
+ // }, 5000);
+ // return;
+ // }
+ outputNames.push(title);
+ outputParameters.push({
+ id: id,
+ name: title,
+ desc: LANG("自定义操作返回的数据", "Output of custom action"),
+ type: nodeList[i]["parameters"]["paraType"],
+ recordASField: nodeList[i]["parameters"]["recordASField"],
+ exampleValue: "",
+ });
+ // }
+ } else if (nodeList[i]["option"] == 9) //条件判断
+ {
+ containJudge = true;
}
}
- serviceInfo = {
- "id": parseInt(serviceId),
- "name": serviceName,
- "url": url,
- "links": links,
- "create_time": parseInt(serviceId) == -1 ? new Date().toLocaleString() : $("#create_time").val(),
- "update_time": new Date().toLocaleString(),
- "version": "0.6.0",
- "saveThreshold": saveThreshold,
- // "cloudflare": cloudflare,
- "quitWaitTime": parseInt($("#quitWaitTime").val()),
- "environment": environment,
- "maximizeWindow": parseInt($("#maximizeWindow").val()),
- "maxViewLength": parseInt($("#maxViewLength").val()),
- "recordLog": parseInt($("#recordLog").val()),
- "outputFormat": $("#outputFormat").val(),
- "saveName": $("#saveName").val(),
- "inputExcel": $("#inputExcel").val(),
- "startFromExit": parseInt($("#startFromExit").val()),
- "pauseKey": $("#pauseKey").val(),
- "containJudge": containJudge,
- "desc": serviceDescription,
- "inputParameters": inputParameters,
- "outputParameters": outputParameters,
- "graph": nodeList, //图结构要存储下来
- };
- if(serviceInfo.outputFormat=="mysql"){
- if(!isValidMySQLTableName(serviceInfo.saveName)) {
- $('#myModal').modal('hide');
- showError(LANG("提示:保存名不符合MySQL表名规范,请重试!","The save name is not valid for MySQL table name!"));
- return;
- }
+ }
+ serviceInfo = {
+ "id": parseInt(serviceId),
+ "name": serviceName,
+ "url": url,
+ "links": links,
+ "create_time": parseInt(serviceId) == -1 ? new Date().toLocaleString() : $("#create_time").val(),
+ "update_time": new Date().toLocaleString(),
+ "version": "0.6.0",
+ "saveThreshold": saveThreshold,
+ // "cloudflare": cloudflare,
+ "quitWaitTime": parseInt($("#quitWaitTime").val()),
+ "environment": environment,
+ "maximizeWindow": parseInt($("#maximizeWindow").val()),
+ "maxViewLength": parseInt($("#maxViewLength").val()),
+ "recordLog": parseInt($("#recordLog").val()),
+ "outputFormat": $("#outputFormat").val(),
+ "saveName": $("#saveName").val(),
+ "inputExcel": $("#inputExcel").val(),
+ "startFromExit": parseInt($("#startFromExit").val()),
+ "pauseKey": $("#pauseKey").val(),
+ "containJudge": containJudge,
+ "desc": serviceDescription,
+ "inputParameters": inputParameters,
+ "outputParameters": outputParameters,
+ "graph": nodeList, //图结构要存储下来
+ };
+ if (serviceInfo.outputFormat == "mysql") {
+ if (!isValidMySQLTableName(serviceInfo.saveName)) {
+ $('#myModal').modal('hide');
+ showError(LANG("提示:保存名不符合MySQL表名规范,请重试!", "The save name is not valid for MySQL table name!"));
+ return;
}
- $.post(backEndAddressServiceWrapper + "/manageTask", { paras: JSON.stringify(serviceInfo) },
- function(result) { $("#serviceId").val(parseInt(result)) });
- // alert("保存成功!");
- $('#myModal').modal('hide');
- showSuccess(LANG("保存成功!","Save successfully!"));
+ }
+ $.post(backEndAddressServiceWrapper + "/manageTask", {paras: JSON.stringify(serviceInfo)},
+ function (result) {
+ $("#serviceId").val(parseInt(result))
+ if (type == 1) { //任务另存为
+ let currentUrl = window.location.href;
+ let id = getUrlParam("id");
+ let newUrl = currentUrl.replace("id=" + id, "id=" + result + "&saveAs=1");
+ window.location.href = newUrl;
+ }
+ });
+ // alert("保存成功!");
+ $('#myModal').modal('hide');
+ showSuccess(LANG("保存成功!", "Save successfully!"));
// }
}
if (sId != null && sId != -1) //加载任务
{
- $.get(backEndAddressServiceWrapper + "/queryTask?id=" + sId, function(result) {
+ $.get(backEndAddressServiceWrapper + "/queryTask?id=" + sId, function (result) {
nodeList = result["graph"];
app.$data.list.nl = nodeList;
- for(let node of nodeList){ //兼容旧版本
- if(node["option"] == 1){
- if(!("cookies" in node["parameters"])) {
+ for (let node of nodeList) { //兼容旧版本
+ if (node["option"] == 1) {
+ if (!("cookies" in node["parameters"])) {
node["parameters"]["cookies"] = "";
}
}
@@ -570,15 +600,18 @@ if (sId != null && sId != -1) //加载任务
$("#serviceId").val(result["id"]);
$("#url").val(result["url"]);
$("#serviceDescription").val(result["desc"]);
- for(let key of Object.keys(result)){
- try{
- $("#"+key).val(result[key]);
- } catch(e){
+ for (let key of Object.keys(result)) {
+ try {
+ $("#" + key).val(result[key]);
+ } catch (e) {
console.log(e);
}
}
- if(result["version"]!= serviceInfo["version"]){
- showInfo(LANG("提示:该任务为" + result["version"] + "版本任务,当前版本为" + serviceInfo["version"] + ",可能存在兼容性问题,请按照当前版本指南设计任务流程以避免任务执行不正常。","This task is designed by EasySpider " + result["version"] + ", current version of EasySpider is " + serviceInfo["version"] + ", there may be compatibility issues, please design the task flow according to the current version guide to avoid abnormal task execution."));
+ if (result["version"] != serviceInfo["version"]) {
+ showInfo(LANG("提示:该任务为" + result["version"] + "版本任务,当前版本为" + serviceInfo["version"] + ",可能存在兼容性问题,请按照当前版本指南设计任务流程以避免任务执行不正常。", "This task is designed by EasySpider " + result["version"] + ", current version of EasySpider is " + serviceInfo["version"] + ", there may be compatibility issues, please design the task flow according to the current version guide to avoid abnormal task execution."));
+ }
+ if (getUrlParam("saveAs") == 1) {
+ showSuccess(LANG("另存为成功!", "Save as successfully!"));
}
refresh();
});
@@ -587,7 +620,7 @@ if (sId != null && sId != -1) //加载任务
}
function LANG(zh, en) {
- if(window.location.href.indexOf("_CN") != -1){
+ if (window.location.href.indexOf("_CN") != -1) {
return zh;
} else {
return en;
diff --git a/ElectronJS/src/taskGrid/taskList.html b/ElectronJS/src/taskGrid/taskList.html
index 1007bef..76fc60d 100644
--- a/ElectronJS/src/taskGrid/taskList.html
+++ b/ElectronJS/src/taskGrid/taskList.html
@@ -56,7 +56,7 @@
{{list[i-1]["url"]}}
{{"Task Information~任务信息" | lang}}
{{"Modify Task~修改任务" | lang}}
- {{"Delete Task~删除任务" | lang}}
+ {{"Delete Task (Double Click)~删除任务(双击)" | lang}}
@@ -96,13 +96,13 @@
window.location.href = "taskInfo.html?type="+getUrlParam("type")+"&id=" + id + "&lang="+getUrlParam("lang")+"&wsport="+getUrlParam("wsport")+"&backEndAddressServiceWrapper="+ app.$data.backEndAddressServiceWrapper; //跳转链接
},
deleteTask: function(id) {
- let text = "Are you sure to remove the selected task?";
- if (getUrlParam("lang") == "en"|| getUrlParam("lang")=="") {
- text = "Are you sure to remove the selected task?";
- } else if (getUrlParam("lang") == "zh") {
- text = "确定要删除选中的任务吗?";
- }
- if (confirm(text)) {
+ // let text = "Are you sure to remove the selected task?";
+ // if (getUrlParam("lang") == "en"|| getUrlParam("lang")=="") {
+ // text = "Are you sure to remove the selected task?";
+ // } else if (getUrlParam("lang") == "zh") {
+ // text = "确定要删除选中的任务吗?";
+ // }
+ // if (confirm(text)) {
$.get(app.$data.backEndAddressServiceWrapper + "/deleteTask?id=" + id, function(res) {
$.get(app.$data.backEndAddressServiceWrapper + "/queryTasks", function(re) {
result = re.sort(desc);
@@ -110,7 +110,7 @@
});
});
// alert("Sorry, the task cannot be deleted since the system is a demo system for paper reviewers, please contact the author (naibowang@u.nus.edu) to remove it.")
- }
+ // }
},
}
});
diff --git a/ElectronJS/tasks/215.json b/ElectronJS/tasks/215.json
index 066176e..568540f 100644
--- a/ElectronJS/tasks/215.json
+++ b/ElectronJS/tasks/215.json
@@ -1 +1 @@
-{"id":215,"name":"弹窗示例","url":"https://easyspider.cn/test_pages/alert_test.html","links":"https://easyspider.cn/test_pages/alert_test.html","create_time":"12/5/2023, 1:53:45 AM","update_time":"12/6/2023, 9:33:12 PM","version":"0.6.0","saveThreshold":10,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://easyspider.cn/test_pages/alert_test.html","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://easyspider.cn/test_pages/alert_test.html","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://easyspider.cn/test_pages/alert_test.html"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"\n 弹窗示例\n \n \n function showAlert() {\n alert('你已经点击了按钮!');\n }\n \n\n\n\n#wrapperToolkitIframe{\n position: absolute;\n top:0;\n}\n.toolcannotdrag{\n background-color: navy;\n width: 100%;\n text-align: center;\n font-size: 13px;\n height: 26px !important;\n padding-top: 8px !important;\n color: white;\n}\n\n\n点击我\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: //html \n"},{"id":1,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":2,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,4,3,5],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://easyspider.cn/test_pages/alert_test.html","links":"https://easyspider.cn/test_pages/alert_test.html","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":-1,"index":2,"parentId":0,"type":0,"option":2,"title":"点击点击我","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/button[1]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":2,"allXPaths":["/html/body/button[1]","//button[contains(., '点击我')]","/html/body/button"]}},{"id":3,"index":3,"parentId":0,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":0,"relative":false,"name":"参数1_文本","desc":"","extractType":0,"relativeXPath":"/html/body[1]/p[eval(\"self.a+1\")]","allXPaths":["//html[1]","//html[contains(., '弹窗示例')]","/html"],"exampleValues":[{"num":0,"value":"\n 弹窗示例\n \n \n function showAlert() {\n alert('你已经点击了按钮!');\n }\n \n\n\n\n#wrapperToolkitIframe{\n position: absolute;\n top:0;\n}\n.toolcannotdrag{\n background-color: navy;\n width: 100%;\n text-align: center;\n font-size: 13px;\n height: 26px !important;\n padding-top: 8px !important;\n color: white;\n}\n\n\n点击我\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: //html \n"}],"unique_index":"d8of3rzoypelpr7n0qm","iframe":false,"default":"12345","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"alert(eval(\"self.a+2+int('1')\"))","afterJSWaitTime":0,"downloadPic":0}]}},{"id":2,"index":4,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"self.a = 1\nself.b = \"45\"","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":4,"index":5,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":0,"code":"console.log(\"Field[\"参数1_文本\"]Field[\"参数1_文本\"]\")","waitTime":0,"recordASField":0,"paraType":"text"}}]}
\ No newline at end of file
+{"id":215,"name":"弹窗示例","url":"https://easyspider.cn/test_pages/alert_test.html","links":"https://easyspider.cn/test_pages/alert_test.html","create_time":"12/5/2023, 1:53:45 AM","update_time":"12/13/2023, 3:50:21 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://easyspider.cn/test_pages/alert_test.html","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://easyspider.cn/test_pages/alert_test.html","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://easyspider.cn/test_pages/alert_test.html"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"\n 弹窗示例\n \n \n function showAlert() {\n alert('你已经点击了按钮!');\n }\n \n\n\n\n#wrapperToolkitIframe{\n position: absolute;\n top:0;\n}\n.toolcannotdrag{\n background-color: navy;\n width: 100%;\n text-align: center;\n font-size: 13px;\n height: 26px !important;\n padding-top: 8px !important;\n color: white;\n}\n\n\n点击我\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: //html \n"},{"id":1,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":2,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,4,3,5],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://easyspider.cn/test_pages/alert_test.html","links":"https://easyspider.cn/test_pages/alert_test.html","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":-1,"index":2,"parentId":0,"type":0,"option":2,"title":"点击点击我","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/button[1]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":2,"allXPaths":["/html/body/button[1]","//button[contains(., '点击我')]","/html/body/button"]}},{"id":3,"index":3,"parentId":0,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":0,"relative":false,"name":"参数1_文本","desc":"","extractType":0,"relativeXPath":"/html/body[1]/p[eval(\"self.a+1\")]","allXPaths":["//html[1]","//html[contains(., '弹窗示例')]","/html"],"exampleValues":[{"num":0,"value":"\n 弹窗示例\n \n \n function showAlert() {\n alert('你已经点击了按钮!');\n }\n \n\n\n\n#wrapperToolkitIframe{\n position: absolute;\n top:0;\n}\n.toolcannotdrag{\n background-color: navy;\n width: 100%;\n text-align: center;\n font-size: 13px;\n height: 26px !important;\n padding-top: 8px !important;\n color: white;\n}\n\n\n点击我\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: //html \n"}],"unique_index":"d8of3rzoypelpr7n0qm","iframe":false,"default":"12345","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"alert(eval(\"self.a+2+int('1')\"))","afterJSWaitTime":0,"downloadPic":0}]}},{"id":2,"index":4,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"self.a = 1\nself.b = \"45\"","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":4,"index":5,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":0,"code":"console.log(\"Field[\"参数1_文本\"]Field[\"参数1_文本\"]\")","waitTime":0,"recordASField":0,"paraType":"text"}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/221.json b/ElectronJS/tasks/221.json
index c5060db..b3faf5c 100644
--- a/ElectronJS/tasks/221.json
+++ b/ElectronJS/tasks/221.json
@@ -1,889 +1 @@
-{
- "id": 221,
- "name": "不固定元素列表测试:【软科排名】-中国最好学科排名|最权威的大学学科|高校学科排名",
- "url": "https://www.shanghairanking.cn/rankings/bcsr/2023",
- "links": "https://www.shanghairanking.cn/rankings/bcsr/2023",
- "create_time": "12/5/2023, 4:12:11 AM",
- "update_time": "12/10/2023, 5:56:54 AM",
- "version": "0.6.0",
- "saveThreshold": 10,
- "quitWaitTime": 60,
- "environment": 0,
- "maximizeWindow": 0,
- "maxViewLength": 15,
- "recordLog": 1,
- "outputFormat": "xlsx",
- "saveName": "current_time",
- "inputExcel": "",
- "startFromExit": 0,
- "pauseKey": "p",
- "containJudge": false,
- "desc": "https://www.shanghairanking.cn/rankings/bcsr/2023",
- "inputParameters": [
- {
- "id": 0,
- "name": "urlList_0",
- "nodeId": 1,
- "nodeName": "打开网页",
- "value": "https://www.shanghairanking.cn/rankings/bcsr/2023",
- "desc": "要采集的网址列表,多行以\\n分开",
- "type": "text",
- "exampleValue": "https://www.shanghairanking.cn/rankings/bcsr/2023"
- },
- {
- "id": 1,
- "name": "loopTimes_循环点击单个元素_1",
- "nodeId": 6,
- "nodeName": "循环点击单个元素",
- "desc": "循环循环点击单个元素执行的次数(0代表无限循环)",
- "type": "int",
- "exampleValue": 0,
- "value": 0
- }
- ],
- "outputParameters": [
- {
- "id": 0,
- "name": "参数1_文本",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "1"
- },
- {
- "id": 1,
- "name": "参数2_文本",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "1"
- },
- {
- "id": 2,
- "name": "参数3_文本",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "前3%"
- },
- {
- "id": 3,
- "name": "参数4_图片地址",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "https://www.shanghairanking.cn/_uni/logo/28312850.png"
- },
- {
- "id": 4,
- "name": "参数5_链接文本",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "复旦大学\n "
- },
- {
- "id": 5,
- "name": "参数6_链接地址",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "/institution/fudan-university"
- },
- {
- "id": 6,
- "name": "参数7_图片地址",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "/_nuxt/img/uncollection.388fe56.svg"
- },
- {
- "id": 7,
- "name": "参数8_链接文本",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "\n "
- },
- {
- "id": 8,
- "name": "参数9_链接地址",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "/institution/fudan-university"
- },
- {
- "id": 9,
- "name": "参数10_文本",
- "desc": "",
- "type": "text",
- "recordASField": 1,
- "exampleValue": "1044"
- },
- {
- "id": 10,
- "name": "发送邮件123",
- "desc": "自定义操作返回的数据",
- "type": "text",
- "recordASField": 0,
- "exampleValue": ""
- }
- ],
- "graph": [
- {
- "index": 0,
- "id": 0,
- "parentId": 0,
- "type": -1,
- "option": 0,
- "title": "root",
- "sequence": [1, 8, 2],
- "parameters": {
- "history": 1,
- "tabIndex": 0,
- "useLoop": false,
- "xpath": "",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0
- },
- "isInLoop": false
- },
- {
- "id": 1,
- "index": 1,
- "parentId": 0,
- "type": 0,
- "option": 1,
- "title": "打开网页",
- "sequence": [],
- "isInLoop": false,
- "position": 0,
- "parameters": {
- "useLoop": false,
- "xpath": "",
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "url": "https://www.shanghairanking.cn/rankings/bcsr/2023",
- "links": "https://www.shanghairanking.cn/rankings/bcsr/2023",
- "maxWaitTime": 10,
- "scrollType": 0,
- "scrollCount": 1,
- "scrollWaitTime": 1,
- "cookies": ""
- }
- },
- {
- "id": 3,
- "index": 2,
- "parentId": 0,
- "type": 1,
- "option": 8,
- "title": "循环点击每个元素",
- "sequence": [3, 6],
- "isInLoop": false,
- "position": 2,
- "parameters": {
- "history": 4,
- "tabIndex": -1,
- "useLoop": false,
- "xpath": "/html/body/div[1]/div[1]/div[1]/div[2]/div[2]/div[1]/div/div[2]/div/a[1]/span[2]",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "scrollType": 0,
- "scrollCount": 1,
- "scrollWaitTime": 1,
- "loopType": 1,
- "pathList": "",
- "textList": "",
- "code": "",
- "waitTime": 0,
- "exitCount": 0,
- "historyWait": 2,
- "breakMode": 0,
- "breakCode": "",
- "breakCodeWaitTime": 0,
- "allXPaths": ""
- }
- },
- {
- "id": 4,
- "index": 3,
- "parentId": 3,
- "type": 0,
- "option": 2,
- "title": "点击元素",
- "sequence": [],
- "isInLoop": true,
- "position": 0,
- "parameters": {
- "history": 4,
- "tabIndex": -1,
- "useLoop": true,
- "xpath": "",
- "iframe": false,
- "wait": 2,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "scrollType": 0,
- "scrollCount": 1,
- "scrollWaitTime": 1,
- "clickWay": 0,
- "maxWaitTime": 10,
- "paras": [],
- "alertHandleType": 0,
- "allXPaths": "",
- "loopType": 1,
- "codeMode": -1
- }
- },
- {
- "id": 6,
- "index": 4,
- "parentId": 5,
- "type": 1,
- "option": 8,
- "title": "循环采集数据",
- "sequence": [5],
- "isInLoop": true,
- "position": 0,
- "parameters": {
- "history": 5,
- "tabIndex": -1,
- "useLoop": false,
- "xpath": "/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[1]/div[1]/div[2]/table[1]/tbody[1]/tr",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "scrollType": 0,
- "scrollCount": 1,
- "scrollWaitTime": 1,
- "loopType": 1,
- "pathList": "",
- "textList": "",
- "code": "",
- "waitTime": 0,
- "exitCount": 0,
- "historyWait": 2,
- "breakMode": 0,
- "breakCode": "",
- "breakCodeWaitTime": 0,
- "allXPaths": [
- "/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[1]/div[1]/div[2]/table[1]/tbody[1]/tr[1]",
- "//tr[contains(., '')]",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]"
- ]
- }
- },
- {
- "id": 8,
- "index": 5,
- "parentId": 6,
- "type": 0,
- "option": 3,
- "title": "提取数据",
- "sequence": [],
- "isInLoop": true,
- "position": 0,
- "parameters": {
- "history": 5,
- "tabIndex": -1,
- "useLoop": false,
- "xpath": "",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "clear": 0,
- "newLine": 1,
- "paras": [
- {
- "nodeType": 0,
- "contentType": 1,
- "relative": true,
- "name": "参数1_文本",
- "desc": "",
- "relativeXPath": "/td[1]/div[1]",
- "allXPaths": [
- "/td[1]/div[1]",
- "//div[contains(., '')]",
- "//DIV[@class='ranking']",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-4]/div"
- ],
- "exampleValues": [{ "num": 0, "value": "1" }],
- "unique_index": "/td[1]/div[1]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 0,
- "contentType": 1,
- "relative": true,
- "name": "参数2_文本",
- "desc": "",
- "relativeXPath": "/td[2]/span[1]",
- "allXPaths": [
- "/td[2]/span[1]",
- "//span[contains(., '1')]",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-3]/span"
- ],
- "exampleValues": [{ "num": 0, "value": "1" }],
- "unique_index": "/td[2]/span[1]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 0,
- "contentType": 1,
- "relative": true,
- "name": "参数3_文本",
- "desc": "",
- "relativeXPath": "/td[3]",
- "allXPaths": [
- "/td[3]",
- "//td[contains(., '')]",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-2]"
- ],
- "exampleValues": [{ "num": 0, "value": "前3%" }],
- "unique_index": "/td[3]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 4,
- "contentType": 1,
- "relative": true,
- "name": "参数4_图片地址",
- "desc": "",
- "relativeXPath": "/td[4]/div[1]/div[1]/img[1]",
- "allXPaths": [
- "/td[4]/div[1]/div[1]/img[1]",
- "//img[contains(., '')]",
- "//IMG[@class='univ-logo']",
- "//IMG[@alt='复旦大学']",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div[last()-1]/img"
- ],
- "exampleValues": [
- {
- "num": 0,
- "value": "https://www.shanghairanking.cn/_uni/logo/28312850.png"
- }
- ],
- "unique_index": "/td[4]/div[1]/div[1]/img[1]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 1,
- "contentType": 0,
- "relative": true,
- "name": "参数5_链接文本",
- "desc": "",
- "relativeXPath": "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]",
- "allXPaths": [
- "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]",
- "//a[contains(., '复旦大学')]",
- "//A[@class='name-cn']",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div[last()-1]/div/div/a"
- ],
- "exampleValues": [{ "num": 0, "value": "复旦大学\n " }],
- "unique_index": "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 2,
- "contentType": 0,
- "relative": true,
- "name": "参数6_链接地址",
- "desc": "",
- "relativeXPath": "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]",
- "allXPaths": [
- "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]",
- "//a[contains(., '复旦大学')]",
- "//A[@class='name-cn']",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div[last()-1]/div/div/a"
- ],
- "exampleValues": [
- { "num": 0, "value": "/institution/fudan-university" }
- ],
- "unique_index": "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 4,
- "contentType": 1,
- "relative": true,
- "name": "参数7_图片地址",
- "desc": "",
- "relativeXPath": "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/img[1]",
- "allXPaths": [
- "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/img[1]",
- "//img[contains(., '')]",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div[last()-1]/div/div/div/img"
- ],
- "exampleValues": [
- { "num": 0, "value": "/_nuxt/img/uncollection.388fe56.svg" }
- ],
- "unique_index": "/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/img[1]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 1,
- "contentType": 0,
- "relative": true,
- "name": "参数8_链接文本",
- "desc": "",
- "relativeXPath": "/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]",
- "allXPaths": [
- "/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]",
- "//a[contains(., '')]",
- "//A[@class='name-en']",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div/div/div/a"
- ],
- "exampleValues": [{ "num": 0, "value": "\n " }],
- "unique_index": "/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 2,
- "contentType": 0,
- "relative": true,
- "name": "参数9_链接地址",
- "desc": "",
- "relativeXPath": "/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]",
- "allXPaths": [
- "/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]",
- "//a[contains(., '')]",
- "//A[@class='name-en']",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div/div/div/a"
- ],
- "exampleValues": [
- { "num": 0, "value": "/institution/fudan-university" }
- ],
- "unique_index": "/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- },
- {
- "nodeType": 0,
- "contentType": 1,
- "relative": true,
- "name": "参数10_文本",
- "desc": "",
- "relativeXPath": "/td[5]",
- "allXPaths": [
- "/td[5]",
- "//td[contains(., '')]",
- "/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td"
- ],
- "exampleValues": [{ "num": 0, "value": "1044" }],
- "unique_index": "/td[5]",
- "iframe": false,
- "default": "",
- "paraType": "text",
- "recordASField": 1,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "JS": "",
- "JSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "downloadPic": 0
- }
- ]
- }
- },
- {
- "id": 5,
- "index": 6,
- "parentId": 3,
- "type": 1,
- "option": 8,
- "title": "循环点击单个元素",
- "sequence": [4, 7],
- "isInLoop": true,
- "position": 1,
- "parameters": {
- "history": 5,
- "tabIndex": -1,
- "useLoop": false,
- "xpath": "//*[contains(@class, \"ant-pagination-next\")]/a[1]",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "scrollType": 0,
- "scrollCount": 1,
- "scrollWaitTime": 1,
- "loopType": 0,
- "pathList": "",
- "textList": "",
- "code": "",
- "waitTime": 0,
- "exitCount": 0,
- "historyWait": 2,
- "breakMode": 0,
- "breakCode": "",
- "breakCodeWaitTime": 0,
- "allXPaths": [
- "/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[1]/div[1]/ul[1]/li[5]/a[1]",
- "//a[contains(., '')]",
- "//A[@class='ant-pagination-item-link']",
- "/html/body/div[last()-3]/div/div/div[last()-2]/div/div/div/div[last()-1]/div/ul/li[last()-1]/a"
- ],
- "codeMode": -1
- }
- },
- {
- "id": 7,
- "index": 7,
- "parentId": 5,
- "type": 0,
- "option": 2,
- "title": "点击元素",
- "sequence": [],
- "isInLoop": true,
- "position": 1,
- "parameters": {
- "history": 5,
- "tabIndex": -1,
- "useLoop": true,
- "xpath": "",
- "iframe": false,
- "wait": 2,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "scrollType": 0,
- "scrollCount": 1,
- "scrollWaitTime": 1,
- "clickWay": 0,
- "maxWaitTime": 10,
- "paras": [],
- "alertHandleType": 0,
- "allXPaths": [
- "/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[1]/div[1]/ul[1]/li[5]/a[1]",
- "//a[contains(., '')]",
- "//A[@class='ant-pagination-item-link']",
- "/html/body/div[last()-3]/div/div/div[last()-2]/div/div/div/div[last()-1]/div/ul/li[last()-1]/a"
- ],
- "loopType": 0
- }
- },
- {
- "id": 2,
- "index": 8,
- "parentId": 0,
- "type": 0,
- "option": 5,
- "title": "发送邮件123",
- "sequence": [],
- "isInLoop": false,
- "position": 1,
- "parameters": {
- "history": 1,
- "tabIndex": 0,
- "useLoop": false,
- "xpath": "",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "clear": 0,
- "newLine": 1,
- "codeMode": "9",
- "code": "",
- "waitTime": 0,
- "recordASField": 0,
- "paraType": "text",
- "emailConfig": {
- "host": "smtp.163.co23m",
- "port": "465",
- "username": "test@163.com",
- "password": "asdf",
- "from": "",
- "to": "test@163.com",
- "subject": "123",
- "content": "434"
- }
- }
- },
- {
- "id": -1,
- "index": 9,
- "parentId": 0,
- "type": 0,
- "option": 5,
- "title": "暂停程序",
- "sequence": [],
- "isInLoop": false,
- "position": 1,
- "parameters": {
- "history": 1,
- "tabIndex": 0,
- "useLoop": false,
- "xpath": "",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "clear": 0,
- "newLine": 1,
- "codeMode": "7",
- "code": "",
- "waitTime": 0,
- "recordASField": 0,
- "paraType": "text",
- "emailConfig": {
- "host": "",
- "port": 465,
- "username": "",
- "password": "",
- "from": "",
- "to": "",
- "subject": "",
- "content": ""
- }
- }
- },
- {
- "id": -1,
- "index": 10,
- "parentId": 0,
- "type": 0,
- "option": 5,
- "title": "执行JavaScript",
- "sequence": [],
- "isInLoop": false,
- "position": 1,
- "parameters": {
- "history": 1,
- "tabIndex": 0,
- "useLoop": false,
- "xpath": "",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "clear": 0,
- "newLine": 1,
- "codeMode": "0",
- "code": "",
- "waitTime": 0,
- "recordASField": 0,
- "paraType": "text",
- "emailConfig": {
- "host": "",
- "port": 465,
- "username": "",
- "password": "",
- "from": "",
- "to": "",
- "subject": "",
- "content": ""
- }
- }
- },
- {
- "id": -1,
- "index": 11,
- "parentId": 0,
- "type": 0,
- "option": 5,
- "title": "暂停程序dfgs",
- "sequence": [],
- "isInLoop": false,
- "position": 1,
- "parameters": {
- "history": 1,
- "tabIndex": 0,
- "useLoop": false,
- "xpath": "",
- "iframe": false,
- "wait": 0,
- "waitType": 0,
- "beforeJS": "",
- "beforeJSWaitTime": 0,
- "afterJS": "",
- "afterJSWaitTime": 0,
- "waitElement": "",
- "waitElementTime": 10,
- "waitElementIframeIndex": 0,
- "clear": 0,
- "newLine": 1,
- "codeMode": "7",
- "code": "",
- "waitTime": 0,
- "recordASField": 0,
- "paraType": "text",
- "emailConfig": {
- "host": "",
- "port": 465,
- "username": "",
- "password": "",
- "from": "",
- "to": "",
- "subject": "",
- "content": ""
- }
- }
- }
- ]
-}
+{"id":221,"name":"不固定元素列表测试:【软科排名】-中国最好学科排名|最权威的大学学科|高校学科排名","url":"https://www.shanghairanking.cn/rankings/bcsr/2023","links":"https://www.shanghairanking.cn/rankings/bcsr/2023","create_time":"12/5/2023, 4:12:11 AM","update_time":"12/13/2023, 3:06:51 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://www.shanghairanking.cn/rankings/bcsr/2023","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.shanghairanking.cn/rankings/bcsr/2023","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.shanghairanking.cn/rankings/bcsr/2023"},{"id":1,"name":"loopTimes_循环点击单个元素_1","nodeId":6,"nodeName":"循环点击单个元素","desc":"循环循环点击单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"1"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"1"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"前3%"},{"id":3,"name":"参数4_图片地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://www.shanghairanking.cn/_uni/logo/28312850.png"},{"id":4,"name":"参数5_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"复旦大学\n "},{"id":5,"name":"参数6_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"/institution/fudan-university"},{"id":6,"name":"参数7_图片地址","desc":"","type":"text","recordASField":1,"exampleValue":"/_nuxt/img/uncollection.388fe56.svg"},{"id":7,"name":"参数8_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"\n "},{"id":8,"name":"参数9_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"/institution/fudan-university"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"1044"},{"id":10,"name":"自定义参数_1","desc":"","type":"text","recordASField":1,"exampleValue":"自定义值"},{"id":11,"name":"发送邮件123","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,8,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.shanghairanking.cn/rankings/bcsr/2023","links":"https://www.shanghairanking.cn/rankings/bcsr/2023","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":3,"index":2,"parentId":0,"type":1,"option":8,"title":"循环点击每个元素","sequence":[3,6],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[1]/div[1]/div[2]/div[2]/div[1]/div/div[2]/div/a[1]/span[2]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":""}},{"id":4,"index":3,"parentId":3,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":"","loopType":1,"codeMode":-1,"newTab":1}},{"id":6,"index":4,"parentId":5,"type":1,"option":8,"title":"循环采集数据","sequence":[5],"isInLoop":true,"position":0,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[1]/div[1]/div[2]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[1]/div[1]/div[2]/table[1]/tbody[1]/tr[1]","//tr[contains(., '')]","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]"]}},{"id":8,"index":5,"parentId":6,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[1]/div[1]","allXPaths":["/td[1]/div[1]","//div[contains(., '')]","//DIV[@class='ranking']","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-4]/div"],"exampleValues":[{"num":0,"value":"1"}],"unique_index":"/td[1]/div[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]/span[1]","allXPaths":["/td[2]/span[1]","//span[contains(., '1')]","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-3]/span"],"exampleValues":[{"num":0,"value":"1"}],"unique_index":"/td[2]/span[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '')]","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-2]"],"exampleValues":[{"num":0,"value":"前3%"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":4,"contentType":1,"relative":true,"name":"参数4_图片地址","desc":"","relativeXPath":"/td[4]/div[1]/div[1]/img[1]","allXPaths":["/td[4]/div[1]/div[1]/img[1]","//img[contains(., '')]","//IMG[@class='univ-logo']","//IMG[@alt='复旦大学']","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div[last()-1]/img"],"exampleValues":[{"num":0,"value":"https://www.shanghairanking.cn/_uni/logo/28312850.png"}],"unique_index":"/td[4]/div[1]/div[1]/img[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数5_链接文本","desc":"","relativeXPath":"/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]","allXPaths":["/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]","//a[contains(., '复旦大学')]","//A[@class='name-cn']","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div[last()-1]/div/div/a"],"exampleValues":[{"num":0,"value":"复旦大学\n "}],"unique_index":"/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数6_链接地址","desc":"","relativeXPath":"/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]","allXPaths":["/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]","//a[contains(., '复旦大学')]","//A[@class='name-cn']","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div[last()-1]/div/div/a"],"exampleValues":[{"num":0,"value":"/institution/fudan-university"}],"unique_index":"/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":4,"contentType":1,"relative":true,"name":"参数7_图片地址","desc":"","relativeXPath":"/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/img[1]","allXPaths":["/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/img[1]","//img[contains(., '')]","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div[last()-1]/div/div/div/img"],"exampleValues":[{"num":0,"value":"/_nuxt/img/uncollection.388fe56.svg"}],"unique_index":"/td[4]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/img[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数8_链接文本","desc":"","relativeXPath":"/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]","allXPaths":["/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]","//a[contains(., '')]","//A[@class='name-en']","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div/div/div/a"],"exampleValues":[{"num":0,"value":"\n "}],"unique_index":"/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数9_链接地址","desc":"","relativeXPath":"/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]","allXPaths":["/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]","//a[contains(., '')]","//A[@class='name-en']","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td[last()-1]/div/div/div/div/div/a"],"exampleValues":[{"num":0,"value":"/institution/fudan-university"}],"unique_index":"/td[4]/div[1]/div[2]/div[2]/div[1]/div[1]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '')]","/html/body/div[last()-3]/div/div/div[last()-1]/div/div/div/div[last()-1]/div/div[last()-1]/table/tbody/tr[last()-29]/td"],"exampleValues":[{"num":0,"value":"1044"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":0,"relative":false,"name":"自定义参数_1","desc":"","iframe":false,"extractType":0,"relativeXPath":"//body","recordASField":1,"allXPaths":[],"exampleValues":[{"num":0,"value":"自定义值"}],"default":"","beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0,"paraType":"text"}]}},{"id":5,"index":6,"parentId":3,"type":1,"option":8,"title":"循环点击单个元素","sequence":[4,7],"isInLoop":true,"position":1,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"ant-pagination-next\")]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[1]/div[1]/ul[1]/li[5]/a[1]","//a[contains(., '')]","//A[@class='ant-pagination-item-link']","/html/body/div[last()-3]/div/div/div[last()-2]/div/div/div/div[last()-1]/div/ul/li[last()-1]/a"],"codeMode":-1}},{"id":7,"index":7,"parentId":5,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":5,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[1]/div[1]/div[2]/div[1]/div[3]/div[2]/div[1]/div[1]/ul[1]/li[5]/a[1]","//a[contains(., '')]","//A[@class='ant-pagination-item-link']","/html/body/div[last()-3]/div/div/div[last()-2]/div/div/div/div[last()-1]/div/ul/li[last()-1]/a"],"loopType":0}},{"id":2,"index":8,"parentId":0,"type":0,"option":5,"title":"发送邮件123","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"9","code":"","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"smtp.163.co23m","port":"465","username":"test@163.com","password":"asdf","from":"","to":"test@163.com","subject":"123","content":"434"}}},{"id":-1,"index":9,"parentId":0,"type":0,"option":5,"title":"暂停程序","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"7","code":"","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"","port":465,"username":"","password":"","from":"","to":"","subject":"","content":""}}},{"id":-1,"index":10,"parentId":0,"type":0,"option":5,"title":"执行JavaScript","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"0","code":"","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"","port":465,"username":"","password":"","from":"","to":"","subject":"","content":""}}},{"id":-1,"index":11,"parentId":0,"type":0,"option":5,"title":"暂停程序dfgs","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"7","code":"","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"","port":465,"username":"","password":"","from":"","to":"","subject":"","content":""}}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/237.json b/ElectronJS/tasks/237.json
index 6a780b1..b2a0244 100644
--- a/ElectronJS/tasks/237.json
+++ b/ElectronJS/tasks/237.json
@@ -1 +1 @@
-{"id":237,"name":"EXEC自定义函数示例:中国地震台网——历史查询","url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","create_time":"12/9/2023, 3:36:47 AM","update_time":"12/11/2023, 4:27:41 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"k","containJudge":false,"desc":"https://www.ceic.ac.cn/history","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.ceic.ac.cn/history","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.ceic.ac.cn/history"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"15\n25\n35","value":"15\n25\n35"},{"id":2,"name":"loopTimes_循环点击单个元素_2","nodeId":5,"nodeName":"循环点击单个元素","desc":"循环循环点击单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"3.7"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-11-3003:44:10"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"37.53"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"112.47"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"28"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"山西太原市清徐县"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://news.ceic.ac.cn/CC20231130034410.html"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"震级(M)"},{"id":8,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"发震时刻(UTC+8)"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"纬度(°)"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"经度(°)"},{"id":11,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"深度(千米)"},{"id":12,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"参考位置"},{"id":13,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[3,4,9,5],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":"3","pathList":"","textList":"15\n25\n35","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"weidu1\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[2]/input[1]","//input[contains(., '')]","id(\"weidu1\")","//INPUT[@class='span1']","//INPUT[@name='weidu1']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div[last()-3]/input[last()-1]"]}},{"id":4,"index":4,"parentId":2,"type":0,"option":2,"title":"点击查询","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[5]/a[1]","//a[contains(., '查询')]","id(\"search\")","//A[@class='check']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div/a"]}},{"id":6,"index":5,"parentId":2,"type":1,"option":8,"title":"循环点击单个元素","sequence":[7,6],"isInLoop":true,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"pagination\")]/ul[1]/li[last()-1]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"]}},{"id":8,"index":6,"parentId":6,"type":0,"option":2,"title":"点击»","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"],"loopType":0}},{"id":7,"index":7,"parentId":6,"type":1,"option":8,"title":"循环采集数据","sequence":[8],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '震级(M)发震时刻(')]","//TR[@class='speed-tr-h1']","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]"]}},{"id":9,"index":8,"parentId":7,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[eval(\"self.test()\")]","allXPaths":["/td[1]","//td[contains(., '3.7')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-5]"],"exampleValues":[{"num":0,"value":"3.7"}],"unique_index":"/td[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]","allXPaths":["/td[2]","//td[contains(., '2023-11-30')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-4]"],"exampleValues":[{"num":0,"value":"2023-11-3003:44:10"}],"unique_index":"/td[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"arguments[0].innerText = \"123\"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '37.53')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-3]"],"exampleValues":[{"num":0,"value":"37.53"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '112.47')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-2]"],"exampleValues":[{"num":0,"value":"112.47"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '28')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-1]"],"exampleValues":[{"num":0,"value":"28"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"山西太原市清徐县"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"https://news.ceic.ac.cn/CC20231130034410.html"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/th[1]","allXPaths":["/th[1]","//th[contains(., '震级(M)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-5]"],"exampleValues":[{"num":1,"value":"震级(M)"}],"unique_index":"/th[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/th[2]","allXPaths":["/th[2]","//th[contains(., '发震时刻(UTC+8')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-4]"],"exampleValues":[{"num":1,"value":"发震时刻(UTC+8)"}],"unique_index":"/th[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/th[3]","allXPaths":["/th[3]","//th[contains(., '纬度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-3]"],"exampleValues":[{"num":1,"value":"纬度(°)"}],"unique_index":"/th[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/th[4]","allXPaths":["/th[4]","//th[contains(., '经度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-2]"],"exampleValues":[{"num":1,"value":"经度(°)"}],"unique_index":"/th[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/th[5]","allXPaths":["/th[5]","//th[contains(., '深度(千米)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-1]"],"exampleValues":[{"num":1,"value":"深度(千米)"}],"unique_index":"/th[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/th[6]","allXPaths":["/th[6]","//th[contains(., '参考位置')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th"],"exampleValues":[{"num":1,"value":"参考位置"}],"unique_index":"/th[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":5,"index":9,"parentId":2,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":true,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"def test():\n a = 1\n print(\"AMESSAGE:\",a)\n return a\nself.test =test","waitTime":0,"recordASField":0,"paraType":"text"}}]}
\ No newline at end of file
+{"id":237,"name":"EXEC自定义函数示例:中国地震台网——历史查询","url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","create_time":"12/9/2023, 3:36:47 AM","update_time":"12/12/2023, 7:12:50 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"k","containJudge":true,"desc":"https://www.ceic.ac.cn/history","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.ceic.ac.cn/history","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.ceic.ac.cn/history"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"15\n25\n35","value":"15\n25\n35"},{"id":2,"name":"loopTimes_循环点击单个元素_2","nodeId":5,"nodeName":"循环点击单个元素","desc":"循环循环点击单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"3.7"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-11-3003:44:10"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"37.53"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"112.47"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"28"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"山西太原市清徐县"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://news.ceic.ac.cn/CC20231130034410.html"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"震级(M)"},{"id":8,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"发震时刻(UTC+8)"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"纬度(°)"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"经度(°)"},{"id":11,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"深度(千米)"},{"id":12,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"参考位置"},{"id":13,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[3,4,9,5],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":"3","pathList":"","textList":"15\n25\n35","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"weidu1\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[2]/input[1]","//input[contains(., '')]","id(\"weidu1\")","//INPUT[@class='span1']","//INPUT[@name='weidu1']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div[last()-3]/input[last()-1]"]}},{"id":4,"index":4,"parentId":2,"type":0,"option":2,"title":"点击查询","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[5]/a[1]","//a[contains(., '查询')]","id(\"search\")","//A[@class='check']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div/a"]}},{"id":6,"index":5,"parentId":2,"type":1,"option":8,"title":"循环点击单个元素","sequence":[7,6],"isInLoop":true,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"pagination\")]/ul[1]/li[last()-1]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"]}},{"id":8,"index":6,"parentId":6,"type":0,"option":2,"title":"点击»","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"],"loopType":0}},{"id":7,"index":7,"parentId":6,"type":1,"option":8,"title":"循环采集数据","sequence":[10],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '震级(M)发震时刻(')]","//TR[@class='speed-tr-h1']","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]"]}},{"id":12,"index":8,"parentId":10,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[eval(\"self.test()\")]","allXPaths":["/td[1]","//td[contains(., '3.7')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-5]"],"exampleValues":[{"num":0,"value":"3.7"}],"unique_index":"/td[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]","allXPaths":["/td[2]","//td[contains(., '2023-11-30')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-4]"],"exampleValues":[{"num":0,"value":"2023-11-3003:44:10"}],"unique_index":"/td[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"arguments[0].innerText = \"123\"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '37.53')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-3]"],"exampleValues":[{"num":0,"value":"37.53"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '112.47')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-2]"],"exampleValues":[{"num":0,"value":"112.47"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '28')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-1]"],"exampleValues":[{"num":0,"value":"28"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"山西太原市清徐县"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"https://news.ceic.ac.cn/CC20231130034410.html"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/th[1]","allXPaths":["/th[1]","//th[contains(., '震级(M)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-5]"],"exampleValues":[{"num":1,"value":"震级(M)"}],"unique_index":"/th[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/th[2]","allXPaths":["/th[2]","//th[contains(., '发震时刻(UTC+8')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-4]"],"exampleValues":[{"num":1,"value":"发震时刻(UTC+8)"}],"unique_index":"/th[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/th[3]","allXPaths":["/th[3]","//th[contains(., '纬度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-3]"],"exampleValues":[{"num":1,"value":"纬度(°)"}],"unique_index":"/th[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/th[4]","allXPaths":["/th[4]","//th[contains(., '经度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-2]"],"exampleValues":[{"num":1,"value":"经度(°)"}],"unique_index":"/th[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/th[5]","allXPaths":["/th[5]","//th[contains(., '深度(千米)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-1]"],"exampleValues":[{"num":1,"value":"深度(千米)"}],"unique_index":"/th[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/th[6]","allXPaths":["/th[6]","//th[contains(., '参考位置')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th"],"exampleValues":[{"num":1,"value":"参考位置"}],"unique_index":"/th[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":5,"index":9,"parentId":2,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":true,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"def test():\n a = 1\n print(\"AMESSAGE:\",a)\n return a\nself.test =test","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":9,"index":10,"parentId":7,"type":2,"option":9,"title":"判断条件","sequence":[11,12],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":10,"parentId":9,"index":11,"type":3,"option":10,"title":"条件分支1","sequence":[8],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"39.78","code":"","waitTime":0},"position":0},{"id":11,"parentId":9,"index":12,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/256.json b/ElectronJS/tasks/256.json
index 69495e2..f2e97ef 100644
--- a/ElectronJS/tasks/256.json
+++ b/ElectronJS/tasks/256.json
@@ -1 +1 @@
-{"id":256,"name":"","url":"https://easyspider.cn/test_pages/empty.html","links":"https://easyspider.cn/test_pages/empty.html","create_time":"12/12/2023, 12:51:13 AM","update_time":"12/12/2023, 1:26:14 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":true,"desc":"https://easyspider.cn/test_pages/empty.html","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://easyspider.cn/test_pages/empty.html","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://easyspider.cn/test_pages/empty.html"}],"outputParameters":[{"id":0,"name":"删除Body节点","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":1,"name":"自定义参数_1","desc":"","type":"text","recordASField":1,"exampleValue":"自定义值"},{"id":2,"name":"刷新页面","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,4,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://easyspider.cn/test_pages/empty.html","links":"https://easyspider.cn/test_pages/empty.html","maxWaitTime":10,"scrollType":3,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":3,"index":2,"parentId":0,"type":0,"option":5,"title":"删除Body节点","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":1,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":0,"code":"document.body.parentNode.removeChild(document.body);","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"","port":465,"username":"","password":"","from":"","to":"","subject":"","content":""}}},{"id":6,"index":3,"parentId":4,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":false,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":5,"relative":false,"name":"自定义参数_1","desc":"","iframe":false,"extractType":0,"relativeXPath":"//body","recordASField":1,"allXPaths":[],"exampleValues":[{"num":0,"value":"自定义值"}],"default":"","beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0,"paraType":"text"}]}},{"id":2,"index":4,"parentId":0,"type":2,"option":9,"title":"判断条件","sequence":[5,6],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":4,"parentId":2,"index":5,"type":3,"option":10,"title":"条件分支1 - 页面有内容","sequence":[3],"isInLoop":false,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"//body","code":"","waitTime":0,"class":"2"},"position":0},{"id":5,"parentId":2,"index":6,"type":3,"option":10,"title":"条件分支2 - 页面没内容","sequence":[7],"isInLoop":false,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1},{"id":7,"index":7,"parentId":5,"type":0,"option":5,"title":"刷新页面","sequence":[],"isInLoop":false,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":0,"code":"location.reload()","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"","port":465,"username":"","password":"","from":"","to":"","subject":"","content":""}}}]}
\ No newline at end of file
+{"id":256,"name":"","url":"https://easyspider.cn/test_pages/empty.html","links":"https://easyspider.cn/test_pages/empty.html","create_time":"12/12/2023, 12:51:13 AM","update_time":"12/12/2023, 1:42:26 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":true,"desc":"https://easyspider.cn/test_pages/empty.html","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://easyspider.cn/test_pages/empty.html","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://easyspider.cn/test_pages/empty.html"},{"id":1,"name":"loopText_1","nodeId":8,"nodeName":"循环","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n","value":"1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n"}],"outputParameters":[{"id":0,"name":"删除Body节点","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":1,"name":"自定义参数_1","desc":"","type":"text","recordASField":1,"exampleValue":"自定义值"},{"id":2,"name":"刷新页面","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""},{"id":3,"name":"执行Python代码","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,8],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://easyspider.cn/test_pages/empty.html","links":"https://easyspider.cn/test_pages/empty.html","maxWaitTime":10,"scrollType":3,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":5,"title":"删除Body节点","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":1,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":0,"code":"document.body.parentNode.removeChild(document.body);","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"","port":465,"username":"","password":"","from":"","to":"","subject":"","content":""}}},{"id":8,"index":3,"parentId":6,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":5,"relative":false,"name":"自定义参数_1","desc":"","iframe":false,"extractType":0,"relativeXPath":"//body","recordASField":1,"allXPaths":[],"exampleValues":[{"num":0,"value":"自定义值"}],"default":"","beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0,"paraType":"text"}]}},{"id":4,"index":4,"parentId":3,"type":2,"option":9,"title":"判断条件","sequence":[5,6],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":6,"parentId":4,"index":5,"type":3,"option":10,"title":"条件分支1 - 页面有内容","sequence":[3],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"//body","code":"","waitTime":0,"class":"2"},"position":0},{"id":7,"parentId":4,"index":6,"type":3,"option":10,"title":"条件分支2 - 页面没内容","sequence":[7],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1},{"id":9,"index":7,"parentId":7,"type":0,"option":5,"title":"刷新页面","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":0,"code":"location.reload()","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"","port":465,"username":"","password":"","from":"","to":"","subject":"","content":""}}},{"id":3,"index":8,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[4,9],"isInLoop":false,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":3,"pathList":"","textList":"1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n1\n","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":5,"index":9,"parentId":3,"type":0,"option":5,"title":"执行Python代码","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":5,"code":"print(\"2\")","waitTime":0,"recordASField":0,"paraType":"text","emailConfig":{"host":"","port":465,"username":"","password":"","from":"","to":"","subject":"","content":""}}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/257.json b/ElectronJS/tasks/257.json
new file mode 100644
index 0000000..b9dad9d
--- /dev/null
+++ b/ElectronJS/tasks/257.json
@@ -0,0 +1 @@
+{"id":257,"name":"百度一下,你就知道","url":"https://www.baidu.com","links":"https://www.baidu.com","create_time":"12/12/2023, 5:59:29 AM","update_time":"12/12/2023, 5:59:29 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":true,"desc":"https://www.baidu.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.baidu.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.baidu.com"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,3,6],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.baidu.com","links":"https://www.baidu.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":2,"title":"点击“同志加兄弟...","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a[1]/span[2]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[2]/div[1]/div[5]/div[1]/div[1]/div[3]/ul[1]/li[1]/a[1]/span[2]","//span[contains(., '“同志加兄弟”:中越')]","//SPAN[@class='title-content-title']","/html/body/div[last()-5]/div[last()-3]/div[last()-3]/div/div/div/ul/li[last()-5]/a/span"]}},{"id":3,"index":3,"parentId":0,"type":2,"option":9,"title":"判断条件","sequence":[4,5],"isInLoop":false,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":5,"parentId":3,"index":4,"type":3,"option":10,"title":"条件分支1","sequence":[],"isInLoop":false,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"hao123","code":"","waitTime":0},"position":0},{"id":6,"parentId":3,"index":5,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":false,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"元首","code":"","waitTime":0},"position":1},{"id":4,"index":6,"parentId":0,"type":0,"option":2,"title":"点击\n换一...","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"head_wrapper\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[2]/div[1]/div[5]","//div[contains(., '')]","id(\"head_wrapper\")","//DIV[@class='head_wrapper s-isindex-wrap nologin']","/html/body/div[last()-6]/div[last()-3]/div[last()-3]"]}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/258.json b/ElectronJS/tasks/258.json
new file mode 100644
index 0000000..431030a
--- /dev/null
+++ b/ElectronJS/tasks/258.json
@@ -0,0 +1 @@
+{"id":258,"name":"搜狗搜索引擎 - 上网从搜狗开始","url":"https://www.sogou.com","links":"https://www.sogou.com","create_time":"","update_time":"12/12/2023, 7:38:19 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":true,"desc":"https://www.sogou.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.sogou.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.sogou.com"},{"id":1,"name":"inputText_1","nodeName":"输入文字","nodeId":2,"desc":"要输入的文本,如京东搜索框输入:电脑","type":"text","exampleValue":"1","value":"1"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,3,4,5],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.sogou.com","links":"https://www.sogou.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"query\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[2]/div[4]/form[1]/span[1]/input[1]","//input[contains(., '')]","id(\"query\")","//INPUT[@class='sec-input active']","//INPUT[@name='query']","/html/body/div[last()-3]/div[last()-3]/div/form/span[last()-1]/input"]}},{"id":3,"index":3,"parentId":0,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"stb\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[2]/div[4]/form[1]/span[2]/input[1]","//input[contains(., '')]","id(\"stb\")","/html/body/div[last()-3]/div[last()-3]/div/form/span/input"]}},{"id":4,"index":4,"parentId":0,"type":0,"option":2,"title":"点击【1是什么意...","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"results\")]/div[4]/div[1]/h3[1]/a[1]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[3]/div[2]/div[1]/div[3]/div[1]/div[4]/div[1]/h3[1]/a[1]","//a[contains(., '【1是什么意思】 -')]","//A[@class=' ']","/html/body/div[last()-3]/div[last()-4]/div[last()-1]/div/div/div[last()-9]/div[last()-1]/h3/a"]}},{"id":5,"index":5,"parentId":0,"type":2,"option":9,"title":"判断条件","sequence":[6,7,8],"isInLoop":false,"position":4,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":6,"parentId":5,"index":6,"type":3,"option":10,"title":"条件分支1","sequence":[],"isInLoop":false,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":2,"value":"//*[@id=\"sogou_vr_21167301_T3_0\"]","code":"","waitTime":0},"position":0},{"id":7,"parentId":5,"index":7,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":false,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"懂视","code":"","waitTime":0},"position":1},{"index":8,"id":8,"parentId":5,"type":3,"option":10,"title":"条件分支3","sequence":[],"isInLoop":false,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"自然数","code":"","waitTime":0},"position":2}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/259.json b/ElectronJS/tasks/259.json
new file mode 100644
index 0000000..f9d9ab7
--- /dev/null
+++ b/ElectronJS/tasks/259.json
@@ -0,0 +1 @@
+{"id":259,"name":"","url":"https://mall.espic.com.cn/mall-view/","links":"https://mall.espic.com.cn/mall-view/","create_time":"12/12/2023, 5:26:03 PM","update_time":"12/12/2023, 5:26:03 PM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://mall.espic.com.cn/mall-view/","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://mall.espic.com.cn/mall-view/","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://mall.espic.com.cn/mall-view/"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://mall.espic.com.cn/mall-view/","links":"https://mall.espic.com.cn/mall-view/","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/260.json b/ElectronJS/tasks/260.json
new file mode 100644
index 0000000..12cab98
--- /dev/null
+++ b/ElectronJS/tasks/260.json
@@ -0,0 +1 @@
+{"id":260,"name":"EXEC自定义函数示例:中国地震台网——历史查询","url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","create_time":"12/12/2023, 5:37:19 PM","update_time":"12/13/2023, 4:05:10 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"k","containJudge":true,"desc":"https://www.ceic.ac.cn/history","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.ceic.ac.cn/history","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.ceic.ac.cn/history"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环 - 文本列表","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"15\n25\n35","value":"15\n25\n35"},{"id":2,"name":"loopTimes_循环 - 单个元素_2","nodeId":5,"nodeName":"循环 - 单个元素","desc":"循环循环 - 单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"3.7"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-11-3003:44:10"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"37.53"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"112.47"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"28"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"山西太原市清徐县"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://news.ceic.ac.cn/CC20231130034410.html"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"震级(M)"},{"id":8,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"发震时刻(UTC+8)"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"纬度(°)"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"经度(°)"},{"id":11,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"深度(千米)"},{"id":12,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"参考位置"},{"id":13,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环 - 文本列表","sequence":[3,4,9,5],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":3,"pathList":"","textList":"15\n25\n35","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"weidu1\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"arguments[0].valueeval(\") += \"11\"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[2]/input[1]","//input[contains(., '')]","id(\"weidu1\")","//INPUT[@class='span1']","//INPUT[@name='weidu1']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div[last()-3]/input[last()-1]"]}},{"id":4,"index":4,"parentId":2,"type":0,"option":2,"title":"点击查询","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[5]/a[1]","//a[contains(., '查询')]","id(\"search\")","//A[@class='check']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div/a"]}},{"id":6,"index":5,"parentId":2,"type":1,"option":8,"title":"循环 - 单个元素","sequence":[7,6],"isInLoop":true,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"pagination\")]/ul[1]/li[last()-1]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"]}},{"id":8,"index":6,"parentId":6,"type":0,"option":2,"title":"点击»","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"],"loopType":0}},{"id":7,"index":7,"parentId":6,"type":1,"option":8,"title":"循环采集数据","sequence":[10],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '震级(M)发震时刻(')]","//TR[@class='speed-tr-h1']","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]"]}},{"id":12,"index":8,"parentId":10,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[eval(\"self.test()\")]","allXPaths":["/td[1]","//td[contains(., '3.7')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-5]"],"exampleValues":[{"num":0,"value":"3.7"}],"unique_index":"/td[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]","allXPaths":["/td[2]","//td[contains(., '2023-11-30')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-4]"],"exampleValues":[{"num":0,"value":"2023-11-3003:44:10"}],"unique_index":"/td[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"arguments[0].innerText = \"123\"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '37.53')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-3]"],"exampleValues":[{"num":0,"value":"37.53"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '112.47')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-2]"],"exampleValues":[{"num":0,"value":"112.47"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '28')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-1]"],"exampleValues":[{"num":0,"value":"28"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"山西太原市清徐县"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"https://news.ceic.ac.cn/CC20231130034410.html"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/th[1]","allXPaths":["/th[1]","//th[contains(., '震级(M)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-5]"],"exampleValues":[{"num":1,"value":"震级(M)"}],"unique_index":"/th[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/th[2]","allXPaths":["/th[2]","//th[contains(., '发震时刻(UTC+8')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-4]"],"exampleValues":[{"num":1,"value":"发震时刻(UTC+8)"}],"unique_index":"/th[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/th[3]","allXPaths":["/th[3]","//th[contains(., '纬度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-3]"],"exampleValues":[{"num":1,"value":"纬度(°)"}],"unique_index":"/th[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/th[4]","allXPaths":["/th[4]","//th[contains(., '经度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-2]"],"exampleValues":[{"num":1,"value":"经度(°)"}],"unique_index":"/th[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/th[5]","allXPaths":["/th[5]","//th[contains(., '深度(千米)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-1]"],"exampleValues":[{"num":1,"value":"深度(千米)"}],"unique_index":"/th[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/th[6]","allXPaths":["/th[6]","//th[contains(., '参考位置')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th"],"exampleValues":[{"num":1,"value":"参考位置"}],"unique_index":"/th[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":5,"index":9,"parentId":2,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":true,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"def test():\n a = 1\n print(\"AMESSAGE:\",a)\n return a\nself.test =test","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":9,"index":10,"parentId":7,"type":2,"option":9,"title":"判断条件","sequence":[11,12],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":10,"parentId":9,"index":11,"type":3,"option":10,"title":"条件分支1","sequence":[8],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"39.78","code":"","waitTime":0},"position":0},{"id":11,"parentId":9,"index":12,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/261.json b/ElectronJS/tasks/261.json
new file mode 100644
index 0000000..e096e48
--- /dev/null
+++ b/ElectronJS/tasks/261.json
@@ -0,0 +1 @@
+{"id":-2,"name":"EXEC自定义函数示例:中国地震台网——历史查询","url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","create_time":"12/12/2023, 5:41:40 PM","update_time":"12/12/2023, 5:41:40 PM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"k","containJudge":true,"desc":"https://www.ceic.ac.cn/history","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.ceic.ac.cn/history","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.ceic.ac.cn/history"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环 - 文本列表","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"15\n25\n35","value":"15\n25\n35"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"3.7"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-11-3003:44:10"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"37.53"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"112.47"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"28"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"山西太原市清徐县"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://news.ceic.ac.cn/CC20231130034410.html"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"震级(M)"},{"id":8,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"发震时刻(UTC+8)"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"纬度(°)"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"经度(°)"},{"id":11,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"深度(千米)"},{"id":12,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"参考位置"},{"id":13,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环 - 文本列表","sequence":[3,4,9,5],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":3,"pathList":"","textList":"15\n25\n35","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"weidu1\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[2]/input[1]","//input[contains(., '')]","id(\"weidu1\")","//INPUT[@class='span1']","//INPUT[@name='weidu1']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div[last()-3]/input[last()-1]"]}},{"id":4,"index":4,"parentId":2,"type":0,"option":2,"title":"点击查询","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[5]/a[1]","//a[contains(., '查询')]","id(\"search\")","//A[@class='check']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div/a"]}},{"id":6,"index":5,"parentId":2,"type":1,"option":8,"title":"循环 - 不固定元素列表","sequence":[7,6],"isInLoop":true,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"pagination\")]/ul[1]/li[last()-1]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"]}},{"id":8,"index":6,"parentId":6,"type":0,"option":2,"title":"点击»","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"],"loopType":0}},{"id":7,"index":7,"parentId":6,"type":1,"option":8,"title":"循环采集数据","sequence":[10],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '震级(M)发震时刻(')]","//TR[@class='speed-tr-h1']","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]"]}},{"id":12,"index":8,"parentId":10,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[eval(\"self.test()\")]","allXPaths":["/td[1]","//td[contains(., '3.7')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-5]"],"exampleValues":[{"num":0,"value":"3.7"}],"unique_index":"/td[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]","allXPaths":["/td[2]","//td[contains(., '2023-11-30')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-4]"],"exampleValues":[{"num":0,"value":"2023-11-3003:44:10"}],"unique_index":"/td[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"arguments[0].innerText = \"123\"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '37.53')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-3]"],"exampleValues":[{"num":0,"value":"37.53"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '112.47')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-2]"],"exampleValues":[{"num":0,"value":"112.47"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '28')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-1]"],"exampleValues":[{"num":0,"value":"28"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"山西太原市清徐县"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"https://news.ceic.ac.cn/CC20231130034410.html"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/th[1]","allXPaths":["/th[1]","//th[contains(., '震级(M)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-5]"],"exampleValues":[{"num":1,"value":"震级(M)"}],"unique_index":"/th[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/th[2]","allXPaths":["/th[2]","//th[contains(., '发震时刻(UTC+8')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-4]"],"exampleValues":[{"num":1,"value":"发震时刻(UTC+8)"}],"unique_index":"/th[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/th[3]","allXPaths":["/th[3]","//th[contains(., '纬度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-3]"],"exampleValues":[{"num":1,"value":"纬度(°)"}],"unique_index":"/th[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/th[4]","allXPaths":["/th[4]","//th[contains(., '经度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-2]"],"exampleValues":[{"num":1,"value":"经度(°)"}],"unique_index":"/th[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/th[5]","allXPaths":["/th[5]","//th[contains(., '深度(千米)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-1]"],"exampleValues":[{"num":1,"value":"深度(千米)"}],"unique_index":"/th[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/th[6]","allXPaths":["/th[6]","//th[contains(., '参考位置')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th"],"exampleValues":[{"num":1,"value":"参考位置"}],"unique_index":"/th[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":5,"index":9,"parentId":2,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":true,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"def test():\n a = 1\n print(\"AMESSAGE:\",a)\n return a\nself.test =test","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":9,"index":10,"parentId":7,"type":2,"option":9,"title":"判断条件","sequence":[11,12],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":10,"parentId":9,"index":11,"type":3,"option":10,"title":"条件分支1","sequence":[8],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"39.78","code":"","waitTime":0},"position":0},{"id":11,"parentId":9,"index":12,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/262.json b/ElectronJS/tasks/262.json
new file mode 100644
index 0000000..07b252a
--- /dev/null
+++ b/ElectronJS/tasks/262.json
@@ -0,0 +1 @@
+{"id":-2,"name":"EXEC自定义函数示例:中国地震台网——历史查询","url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","create_time":"12/12/2023, 5:45:12 PM","update_time":"12/12/2023, 5:45:12 PM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"k","containJudge":true,"desc":"https://www.ceic.ac.cn/history","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.ceic.ac.cn/history","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.ceic.ac.cn/history"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环 - 文本列表","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"15\n25\n35","value":"15\n25\n35"},{"id":2,"name":"loopTimes_循环 - 单个元素_2","nodeId":5,"nodeName":"循环 - 单个元素","desc":"循环循环 - 单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"3.7"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-11-3003:44:10"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"37.53"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"112.47"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"28"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"山西太原市清徐县"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://news.ceic.ac.cn/CC20231130034410.html"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"震级(M)"},{"id":8,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"发震时刻(UTC+8)"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"纬度(°)"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"经度(°)"},{"id":11,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"深度(千米)"},{"id":12,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"参考位置"},{"id":13,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环 - 文本列表","sequence":[3,4,9,5],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":3,"pathList":"","textList":"15\n25\n35","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"weidu1\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[2]/input[1]","//input[contains(., '')]","id(\"weidu1\")","//INPUT[@class='span1']","//INPUT[@name='weidu1']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div[last()-3]/input[last()-1]"]}},{"id":4,"index":4,"parentId":2,"type":0,"option":2,"title":"点击查询","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[5]/a[1]","//a[contains(., '查询')]","id(\"search\")","//A[@class='check']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div/a"]}},{"id":6,"index":5,"parentId":2,"type":1,"option":8,"title":"循环 - 单个元素","sequence":[7,6],"isInLoop":true,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"pagination\")]/ul[1]/li[last()-1]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"]}},{"id":8,"index":6,"parentId":6,"type":0,"option":2,"title":"点击»","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"],"loopType":0}},{"id":7,"index":7,"parentId":6,"type":1,"option":8,"title":"循环采集数据","sequence":[10],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '震级(M)发震时刻(')]","//TR[@class='speed-tr-h1']","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]"]}},{"id":12,"index":8,"parentId":10,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[eval(\"self.test()\")]","allXPaths":["/td[1]","//td[contains(., '3.7')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-5]"],"exampleValues":[{"num":0,"value":"3.7"}],"unique_index":"/td[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]","allXPaths":["/td[2]","//td[contains(., '2023-11-30')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-4]"],"exampleValues":[{"num":0,"value":"2023-11-3003:44:10"}],"unique_index":"/td[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"arguments[0].innerText = \"123\"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '37.53')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-3]"],"exampleValues":[{"num":0,"value":"37.53"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '112.47')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-2]"],"exampleValues":[{"num":0,"value":"112.47"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '28')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-1]"],"exampleValues":[{"num":0,"value":"28"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"山西太原市清徐县"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"https://news.ceic.ac.cn/CC20231130034410.html"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/th[1]","allXPaths":["/th[1]","//th[contains(., '震级(M)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-5]"],"exampleValues":[{"num":1,"value":"震级(M)"}],"unique_index":"/th[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/th[2]","allXPaths":["/th[2]","//th[contains(., '发震时刻(UTC+8')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-4]"],"exampleValues":[{"num":1,"value":"发震时刻(UTC+8)"}],"unique_index":"/th[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/th[3]","allXPaths":["/th[3]","//th[contains(., '纬度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-3]"],"exampleValues":[{"num":1,"value":"纬度(°)"}],"unique_index":"/th[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/th[4]","allXPaths":["/th[4]","//th[contains(., '经度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-2]"],"exampleValues":[{"num":1,"value":"经度(°)"}],"unique_index":"/th[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/th[5]","allXPaths":["/th[5]","//th[contains(., '深度(千米)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-1]"],"exampleValues":[{"num":1,"value":"深度(千米)"}],"unique_index":"/th[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/th[6]","allXPaths":["/th[6]","//th[contains(., '参考位置')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th"],"exampleValues":[{"num":1,"value":"参考位置"}],"unique_index":"/th[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":5,"index":9,"parentId":2,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":true,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"def test():\n a = 1\n print(\"AMESSAGE:\",a)\n return a\nself.test =test","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":9,"index":10,"parentId":7,"type":2,"option":9,"title":"判断条件","sequence":[11,12],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":10,"parentId":9,"index":11,"type":3,"option":10,"title":"条件分支1","sequence":[8],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"39.78","code":"","waitTime":0},"position":0},{"id":11,"parentId":9,"index":12,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/263.json b/ElectronJS/tasks/263.json
new file mode 100644
index 0000000..f22889d
--- /dev/null
+++ b/ElectronJS/tasks/263.json
@@ -0,0 +1 @@
+{"id":-2,"name":"EXEC自定义函数示例:中国地震台网——历史查询","url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","create_time":"12/12/2023, 5:47:05 PM","update_time":"12/12/2023, 5:47:05 PM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"k","containJudge":true,"desc":"https://www.ceic.ac.cn/history","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.ceic.ac.cn/history","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.ceic.ac.cn/history"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环 - 文本列表","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"15\n25\n35","value":"15\n25\n35"},{"id":2,"name":"loopTimes_循环 - 单个元素_2","nodeId":5,"nodeName":"循环 - 单个元素","desc":"循环循环 - 单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"3.7"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-11-3003:44:10"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"37.53"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"112.47"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"28"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"山西太原市清徐县"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://news.ceic.ac.cn/CC20231130034410.html"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"震级(M)"},{"id":8,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"发震时刻(UTC+8)"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"纬度(°)"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"经度(°)"},{"id":11,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"深度(千米)"},{"id":12,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"参考位置"},{"id":13,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环 - 文本列表","sequence":[3,4,9,5],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":3,"pathList":"","textList":"15\n25\n35","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":4,"title":"输入文字1","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"weidu1\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[2]/input[1]","//input[contains(., '')]","id(\"weidu1\")","//INPUT[@class='span1']","//INPUT[@name='weidu1']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div[last()-3]/input[last()-1]"]}},{"id":4,"index":4,"parentId":2,"type":0,"option":2,"title":"点击查询","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[5]/a[1]","//a[contains(., '查询')]","id(\"search\")","//A[@class='check']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div/a"]}},{"id":6,"index":5,"parentId":2,"type":1,"option":8,"title":"循环 - 单个元素","sequence":[7,6],"isInLoop":true,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"pagination\")]/ul[1]/li[last()-1]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"]}},{"id":8,"index":6,"parentId":6,"type":0,"option":2,"title":"点击»","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"],"loopType":0}},{"id":7,"index":7,"parentId":6,"type":1,"option":8,"title":"循环采集数据","sequence":[10],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '震级(M)发震时刻(')]","//TR[@class='speed-tr-h1']","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]"]}},{"id":12,"index":8,"parentId":10,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[eval(\"self.test()\")]","allXPaths":["/td[1]","//td[contains(., '3.7')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-5]"],"exampleValues":[{"num":0,"value":"3.7"}],"unique_index":"/td[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]","allXPaths":["/td[2]","//td[contains(., '2023-11-30')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-4]"],"exampleValues":[{"num":0,"value":"2023-11-3003:44:10"}],"unique_index":"/td[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"arguments[0].innerText = \"123\"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '37.53')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-3]"],"exampleValues":[{"num":0,"value":"37.53"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '112.47')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-2]"],"exampleValues":[{"num":0,"value":"112.47"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '28')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-1]"],"exampleValues":[{"num":0,"value":"28"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"山西太原市清徐县"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"https://news.ceic.ac.cn/CC20231130034410.html"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/th[1]","allXPaths":["/th[1]","//th[contains(., '震级(M)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-5]"],"exampleValues":[{"num":1,"value":"震级(M)"}],"unique_index":"/th[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/th[2]","allXPaths":["/th[2]","//th[contains(., '发震时刻(UTC+8')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-4]"],"exampleValues":[{"num":1,"value":"发震时刻(UTC+8)"}],"unique_index":"/th[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/th[3]","allXPaths":["/th[3]","//th[contains(., '纬度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-3]"],"exampleValues":[{"num":1,"value":"纬度(°)"}],"unique_index":"/th[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/th[4]","allXPaths":["/th[4]","//th[contains(., '经度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-2]"],"exampleValues":[{"num":1,"value":"经度(°)"}],"unique_index":"/th[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/th[5]","allXPaths":["/th[5]","//th[contains(., '深度(千米)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-1]"],"exampleValues":[{"num":1,"value":"深度(千米)"}],"unique_index":"/th[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/th[6]","allXPaths":["/th[6]","//th[contains(., '参考位置')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th"],"exampleValues":[{"num":1,"value":"参考位置"}],"unique_index":"/th[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":5,"index":9,"parentId":2,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":true,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"def test():\n a = 1\n print(\"AMESSAGE:\",a)\n return a\nself.test =test","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":9,"index":10,"parentId":7,"type":2,"option":9,"title":"判断条件","sequence":[11,12],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":10,"parentId":9,"index":11,"type":3,"option":10,"title":"条件分支1","sequence":[8],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"39.78","code":"","waitTime":0},"position":0},{"id":11,"parentId":9,"index":12,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/264.json b/ElectronJS/tasks/264.json
new file mode 100644
index 0000000..7bbec8f
--- /dev/null
+++ b/ElectronJS/tasks/264.json
@@ -0,0 +1 @@
+{"id":-2,"name":"EXEC自定义函数示例:中国地震台网——历史查询","url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","create_time":"12/12/2023, 5:48:23 PM","update_time":"12/12/2023, 5:48:31 PM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"k","containJudge":true,"desc":"https://www.ceic.ac.cn/history","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.ceic.ac.cn/history","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.ceic.ac.cn/history"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环 - 文本列表","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"15\n25\n35","value":"15\n25\n35"},{"id":2,"name":"loopTimes_循环 - 单个元素_2","nodeId":5,"nodeName":"循环 - 单个元素","desc":"循环循环 - 单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"3.7"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-11-3003:44:10"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"37.53"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"112.47"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"28"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"山西太原市清徐县"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://news.ceic.ac.cn/CC20231130034410.html"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"震级(M)"},{"id":8,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"发震时刻(UTC+8)"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"纬度(°)"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"经度(°)"},{"id":11,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"深度(千米)"},{"id":12,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"参考位置"},{"id":13,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环 - 文本列表","sequence":[3,4,9,5],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":3,"pathList":"","textList":"15\n25\n35","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":4,"title":"输入文字1","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"weidu1\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[2]/input[1]","//input[contains(., '')]","id(\"weidu1\")","//INPUT[@class='span1']","//INPUT[@name='weidu1']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div[last()-3]/input[last()-1]"]}},{"id":4,"index":4,"parentId":2,"type":0,"option":2,"title":"点击查询","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[5]/a[1]","//a[contains(., '查询')]","id(\"search\")","//A[@class='check']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div/a"]}},{"id":6,"index":5,"parentId":2,"type":1,"option":8,"title":"循环 - 单个元素","sequence":[7,6],"isInLoop":true,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"pagination\")]/ul[1]/li[last()-1]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"]}},{"id":8,"index":6,"parentId":6,"type":0,"option":2,"title":"点击»","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"],"loopType":0}},{"id":7,"index":7,"parentId":6,"type":1,"option":8,"title":"循环采集数据","sequence":[10],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '震级(M)发震时刻(')]","//TR[@class='speed-tr-h1']","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]"]}},{"id":12,"index":8,"parentId":10,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[eval(\"self.test()\")]","allXPaths":["/td[1]","//td[contains(., '3.7')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-5]"],"exampleValues":[{"num":0,"value":"3.7"}],"unique_index":"/td[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]","allXPaths":["/td[2]","//td[contains(., '2023-11-30')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-4]"],"exampleValues":[{"num":0,"value":"2023-11-3003:44:10"}],"unique_index":"/td[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"arguments[0].innerText = \"123\"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '37.53')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-3]"],"exampleValues":[{"num":0,"value":"37.53"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '112.47')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-2]"],"exampleValues":[{"num":0,"value":"112.47"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '28')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-1]"],"exampleValues":[{"num":0,"value":"28"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"山西太原市清徐县"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"https://news.ceic.ac.cn/CC20231130034410.html"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/th[1]","allXPaths":["/th[1]","//th[contains(., '震级(M)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-5]"],"exampleValues":[{"num":1,"value":"震级(M)"}],"unique_index":"/th[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/th[2]","allXPaths":["/th[2]","//th[contains(., '发震时刻(UTC+8')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-4]"],"exampleValues":[{"num":1,"value":"发震时刻(UTC+8)"}],"unique_index":"/th[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/th[3]","allXPaths":["/th[3]","//th[contains(., '纬度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-3]"],"exampleValues":[{"num":1,"value":"纬度(°)"}],"unique_index":"/th[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/th[4]","allXPaths":["/th[4]","//th[contains(., '经度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-2]"],"exampleValues":[{"num":1,"value":"经度(°)"}],"unique_index":"/th[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/th[5]","allXPaths":["/th[5]","//th[contains(., '深度(千米)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-1]"],"exampleValues":[{"num":1,"value":"深度(千米)"}],"unique_index":"/th[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/th[6]","allXPaths":["/th[6]","//th[contains(., '参考位置')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th"],"exampleValues":[{"num":1,"value":"参考位置"}],"unique_index":"/th[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":5,"index":9,"parentId":2,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":true,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"def test():\n a = 1\n print(\"AMESSAGE:\",a)\n return a\nself.test =test","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":9,"index":10,"parentId":7,"type":2,"option":9,"title":"判断条件","sequence":[11,12],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":10,"parentId":9,"index":11,"type":3,"option":10,"title":"条件分支1","sequence":[8],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"39.78","code":"","waitTime":0},"position":0},{"id":11,"parentId":9,"index":12,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/265.json b/ElectronJS/tasks/265.json
new file mode 100644
index 0000000..019523d
--- /dev/null
+++ b/ElectronJS/tasks/265.json
@@ -0,0 +1 @@
+{"id":-2,"name":"EXEC自定义函数示例:中国地震台网——历史查询","url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","create_time":"12/12/2023, 5:48:35 PM","update_time":"12/12/2023, 5:48:41 PM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"k","containJudge":true,"desc":"https://www.ceic.ac.cn/history","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.ceic.ac.cn/history","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.ceic.ac.cn/history"},{"id":1,"name":"loopText_1","nodeId":2,"nodeName":"循环 - 文本列表","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"15\n250\n35","value":"15\n250\n35"},{"id":2,"name":"loopTimes_循环 - 单个元素_2","nodeId":5,"nodeName":"循环 - 单个元素","desc":"循环循环 - 单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"3.7"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-11-3003:44:10"},{"id":2,"name":"参数3_文本","desc":"","type":"text","recordASField":1,"exampleValue":"37.53"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"112.47"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"28"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"山西太原市清徐县"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://news.ceic.ac.cn/CC20231130034410.html"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"震级(M)"},{"id":8,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"发震时刻(UTC+8)"},{"id":9,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"纬度(°)"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"经度(°)"},{"id":11,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"深度(千米)"},{"id":12,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"参考位置"},{"id":13,"name":"自定义操作","desc":"自定义操作返回的数据","type":"text","recordASField":0,"exampleValue":""}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.ceic.ac.cn/history","links":"https://www.ceic.ac.cn/history","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环 - 文本列表","sequence":[3,4,9,5],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":3,"pathList":"","textList":"15\n250\n35","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0}},{"id":3,"index":3,"parentId":2,"type":0,"option":4,"title":"输入文字1","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"weidu1\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[2]/input[1]","//input[contains(., '')]","id(\"weidu1\")","//INPUT[@class='span1']","//INPUT[@name='weidu1']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div[last()-3]/input[last()-1]"]}},{"id":4,"index":4,"parentId":2,"type":0,"option":2,"title":"点击查询","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search\"]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[1]/form[1]/div[5]/a[1]","//a[contains(., '查询')]","id(\"search\")","//A[@class='check']","/html/body/div[last()-3]/div[last()-1]/div/div/div[last()-1]/form/div/a"]}},{"id":6,"index":5,"parentId":2,"type":1,"option":8,"title":"循环 - 单个元素","sequence":[7,6],"isInLoop":true,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"pagination\")]/ul[1]/li[last()-1]/a[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"]}},{"id":8,"index":6,"parentId":6,"type":0,"option":2,"title":"点击»","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/ul[1]/li[10]/a[1]","//a[contains(., '»')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div/div/div/ul/li[last()-1]/a"],"loopType":0}},{"id":7,"index":7,"parentId":6,"type":1,"option":8,"title":"循环采集数据","sequence":[10],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[1]/div[3]/div[1]/div[1]/div[2]/div[1]/div[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '震级(M)发震时刻(')]","//TR[@class='speed-tr-h1']","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]"]}},{"id":12,"index":8,"parentId":10,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数1_文本","desc":"","relativeXPath":"/td[eval(\"self.test()\")]","allXPaths":["/td[1]","//td[contains(., '3.7')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-5]"],"exampleValues":[{"num":0,"value":"3.7"}],"unique_index":"/td[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/td[2]","allXPaths":["/td[2]","//td[contains(., '2023-11-30')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-4]"],"exampleValues":[{"num":0,"value":"2023-11-3003:44:10"}],"unique_index":"/td[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"arguments[0].innerText = \"123\"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数3_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '37.53')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-3]"],"exampleValues":[{"num":0,"value":"37.53"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '112.47')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-2]"],"exampleValues":[{"num":0,"value":"112.47"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '28')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td[last()-1]"],"exampleValues":[{"num":0,"value":"28"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"山西太原市清徐县"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/td[6]/a[1]","allXPaths":["/td[6]/a[1]","//a[contains(., '山西太原市清徐县')]","id(\"cid\")","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-19]/td/a"],"exampleValues":[{"num":0,"value":"https://news.ceic.ac.cn/CC20231130034410.html"}],"unique_index":"/td[6]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/th[1]","allXPaths":["/th[1]","//th[contains(., '震级(M)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-5]"],"exampleValues":[{"num":1,"value":"震级(M)"}],"unique_index":"/th[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/th[2]","allXPaths":["/th[2]","//th[contains(., '发震时刻(UTC+8')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-4]"],"exampleValues":[{"num":1,"value":"发震时刻(UTC+8)"}],"unique_index":"/th[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/th[3]","allXPaths":["/th[3]","//th[contains(., '纬度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-3]"],"exampleValues":[{"num":1,"value":"纬度(°)"}],"unique_index":"/th[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/th[4]","allXPaths":["/th[4]","//th[contains(., '经度(°)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-2]"],"exampleValues":[{"num":1,"value":"经度(°)"}],"unique_index":"/th[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/th[5]","allXPaths":["/th[5]","//th[contains(., '深度(千米)')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th[last()-1]"],"exampleValues":[{"num":1,"value":"深度(千米)"}],"unique_index":"/th[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/th[6]","allXPaths":["/th[6]","//th[contains(., '参考位置')]","/html/body/div[last()-3]/div[last()-1]/div/div/div/div/div[last()-1]/table/tbody/tr[last()-20]/th"],"exampleValues":[{"num":1,"value":"参考位置"}],"unique_index":"/th[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}],"loopType":1}},{"id":5,"index":9,"parentId":2,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":true,"position":2,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"def test():\n a = 1\n print(\"AMESSAGE:\",a)\n return a\nself.test =test","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":9,"index":10,"parentId":7,"type":2,"option":9,"title":"判断条件","sequence":[11,12],"isInLoop":true,"position":0,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0}},{"id":10,"parentId":9,"index":11,"type":3,"option":10,"title":"条件分支1","sequence":[8],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":1,"value":"39.78","code":"","waitTime":0},"position":0},{"id":11,"parentId":9,"index":12,"type":3,"option":10,"title":"条件分支2","sequence":[],"isInLoop":true,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"class":0,"value":"","code":"","waitTime":0},"position":1}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/266.json b/ElectronJS/tasks/266.json
new file mode 100644
index 0000000..24d2424
--- /dev/null
+++ b/ElectronJS/tasks/266.json
@@ -0,0 +1 @@
+{"id":266,"name":"高级搜索-招标采购信息搜索","url":"https://www.chinabidding.cn/search/searchgj/zbcg?keywords=12","links":"https://www.chinabidding.cn/search/searchgj/zbcg?keywords=12","create_time":"12/12/2023, 6:00:52 PM","update_time":"12/12/2023, 6:08:57 PM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://www.chinabidding.cn/search/searchgj/zbcg?keywords=12","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.chinabidding.cn/search/searchgj/zbcg?keywords=12","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.chinabidding.cn/search/searchgj/zbcg?keywords=12"},{"id":1,"name":"loopTimes_循环点击单个元素_1","nodeId":2,"nodeName":"循环点击单个元素","desc":"循环循环点击单个元素执行的次数(0代表无限循环)","type":"int","exampleValue":0,"value":0}],"outputParameters":[{"id":0,"name":"参数1_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"济源市中医院急诊科急救设备采购项目成交结果公告"},{"id":1,"name":"参数2_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"/public/bidagency/index.html#/infoDetails?fid=1693858951806977"},{"id":2,"name":"参数3_图片地址","desc":"","type":"text","recordASField":1,"exampleValue":"/public/search/searchadvzbxx/test/images/souc_11.jpg"},{"id":3,"name":"参数4_文本","desc":"","type":"text","recordASField":1,"exampleValue":"收藏"},{"id":4,"name":"参数5_图片地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://cdn.chinabidding.cn/public/search/searchadvzbxx/test/images/souc_hua_11.jpg"},{"id":5,"name":"参数6_文本","desc":"","type":"text","recordASField":1,"exampleValue":"已收藏"},{"id":6,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"河南"},{"id":7,"name":"参数9_文本","desc":"","type":"text","recordASField":1,"exampleValue":"医疗卫生"},{"id":8,"name":"参数10_文本","desc":"","type":"text","recordASField":1,"exampleValue":"2023-12-12"},{"id":9,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"您搜索的关键词包含“”,搜索结果可能有偏差!如果信息没有搜索到,请换成“”关键词再次搜索。"},{"id":10,"name":"参数12_文本","desc":"","type":"text","recordASField":1,"exampleValue":"数字、字母或特殊字符"},{"id":11,"name":"参数13_文本","desc":"","type":"text","recordASField":1,"exampleValue":"文字"},{"id":12,"name":"参数14_文本","desc":"","type":"text","recordASField":1,"exampleValue":"\"\"及其后面的字词均被忽略,因为采购与招标网的查询限制在38个汉字以内。"},{"id":13,"name":"参数15_文本","desc":"","type":"text","recordASField":1,"exampleValue":"集团有"},{"id":14,"name":"参数16_图片地址","desc":"","type":"text","recordASField":1,"exampleValue":"/public/2020/img/searchgj/icon_gb.png"},{"id":15,"name":"参数17_文本","desc":"","type":"text","recordASField":1,"exampleValue":"广告"},{"id":16,"name":"参数18_文本","desc":"","type":"text","recordASField":1,"exampleValue":"360织语即时通讯-安全的企业内部沟通工具"},{"id":17,"name":"参数19_文本","desc":"","type":"text","recordASField":1,"exampleValue":"广告"},{"id":18,"name":"参数20_文本","desc":"","type":"text","recordASField":1,"exampleValue":"全国"}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.chinabidding.cn/search/searchgj/zbcg?keywords=12","links":"https://www.chinabidding.cn/search/searchgj/zbcg?keywords=12","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环点击单个元素","sequence":[4,3],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"pages\"]/a[4]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[5]/div[1]/div[11]/table[1]/tbody[1]/tr[1]/td[1]/div[2]/a[4]","//a[contains(., '后一页')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/div/a[last()-2]"]}},{"id":4,"index":3,"parentId":2,"type":0,"option":2,"title":"点击后一页","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[5]/div[1]/div[11]/table[1]/tbody[1]/tr[1]/td[1]/div[2]/a[4]","//a[contains(., '后一页')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/div/a[last()-2]"]}},{"id":3,"index":4,"parentId":2,"type":1,"option":8,"title":"循环采集数据","sequence":[5],"isInLoop":true,"position":0,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[5]/div[1]/div[11]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[5]/div[1]/div[11]/table[1]/tbody[1]/tr[1]/td[1]/table[1]/tbody[1]/tr[1]","//tr[contains(., '')]","id(\"resultPrompt\")","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-31]"]}},{"id":5,"index":5,"parentId":3,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":1,"contentType":0,"relative":true,"name":"参数1_链接文本","desc":"","relativeXPath":"/td[2]/a[1]","allXPaths":["/td[2]/a[1]","//a[contains(., '济源市中医院急诊科急')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td[last()-5]/a"],"exampleValues":[{"num":0,"value":"济源市中医院急诊科急救设备采购项目成交结果公告"}],"unique_index":"/td[2]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数2_链接地址","desc":"","relativeXPath":"/td[2]/a[1]","allXPaths":["/td[2]/a[1]","//a[contains(., '济源市中医院急诊科急')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td[last()-5]/a"],"exampleValues":[{"num":0,"value":"/public/bidagency/index.html#/infoDetails?fid=1693858951806977"}],"unique_index":"/td[2]/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":4,"contentType":1,"relative":true,"name":"参数3_图片地址","desc":"","relativeXPath":"/td[3]/img[1]","allXPaths":["/td[3]/img[1]","//img[contains(., '')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td[last()-4]/img"],"exampleValues":[{"num":0,"value":"/public/search/searchadvzbxx/test/images/souc_11.jpg"}],"unique_index":"/td[3]/img[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数4_文本","desc":"","relativeXPath":"/td[3]/span[1]","allXPaths":["/td[3]/span[1]","//span[contains(., '收藏')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td[last()-4]/span"],"exampleValues":[{"num":0,"value":"收藏"}],"unique_index":"/td[3]/span[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":4,"contentType":1,"relative":true,"name":"参数5_图片地址","desc":"","relativeXPath":"/td[4]/img[1]","allXPaths":["/td[4]/img[1]","//img[contains(., '')]","//IMG[@class='active']","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td[last()-3]/img"],"exampleValues":[{"num":0,"value":"https://cdn.chinabidding.cn/public/search/searchadvzbxx/test/images/souc_hua_11.jpg"}],"unique_index":"/td[4]/img[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数6_文本","desc":"","relativeXPath":"/td[4]/span[1]","allXPaths":["/td[4]/span[1]","//span[contains(., '已收藏')]","//SPAN[@class='active']","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td[last()-3]/span"],"exampleValues":[{"num":0,"value":"已收藏"}],"unique_index":"/td[4]/span[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/td[5]","allXPaths":["/td[5]","//td[contains(., '河南')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td[last()-2]"],"exampleValues":[{"num":0,"value":"河南"}],"unique_index":"/td[5]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数9_文本","desc":"","relativeXPath":"/td[6]","allXPaths":["/td[6]","//td[contains(., '医疗卫生')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td[last()-1]"],"exampleValues":[{"num":0,"value":"医疗卫生"}],"unique_index":"/td[6]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数10_文本","desc":"","relativeXPath":"/td[7]","allXPaths":["/td[7]","//td[contains(., '2023-12-1')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-29]/td"],"exampleValues":[{"num":0,"value":"2023-12-12"}],"unique_index":"/td[7]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/td[1]/div[1]/h4[1]","allXPaths":["/td[1]/div[1]/h4[1]","//h4[contains(., '')]","//H4[@class='promptText']","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-31]/td/div/h4[last()-1]"],"exampleValues":[{"num":1,"value":"您搜索的关键词包含“”,搜索结果可能有偏差!如果信息没有搜索到,请换成“”关键词再次搜索。"}],"unique_index":"/td[1]/div[1]/h4[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数12_文本","desc":"","relativeXPath":"/td[1]/div[1]/h4[1]/span[1]","allXPaths":["/td[1]/div[1]/h4[1]/span[1]","//span[contains(., '数字、字母或特殊字符')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-31]/td/div/h4[last()-1]/span[last()-1]"],"exampleValues":[{"num":1,"value":"数字、字母或特殊字符"}],"unique_index":"/td[1]/div[1]/h4[1]/span[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数13_文本","desc":"","relativeXPath":"/td[1]/div[1]/h4[1]/span[2]","allXPaths":["/td[1]/div[1]/h4[1]/span[2]","//span[contains(., '文字')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-31]/td/div/h4[last()-1]/span"],"exampleValues":[{"num":1,"value":"文字"}],"unique_index":"/td[1]/div[1]/h4[1]/span[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数14_文本","desc":"","relativeXPath":"/td[1]/div[1]/h4[2]","allXPaths":["/td[1]/div[1]/h4[2]","//h4[contains(., '')]","//H4[@class='promptText2']","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-31]/td/div/h4"],"exampleValues":[{"num":1,"value":"\"\"及其后面的字词均被忽略,因为采购与招标网的查询限制在38个汉字以内。"}],"unique_index":"/td[1]/div[1]/h4[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数15_文本","desc":"","relativeXPath":"/td[1]/div[1]/h4[2]/span[1]","allXPaths":["/td[1]/div[1]/h4[2]/span[1]","//span[contains(., '集团有')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-31]/td/div/h4/span"],"exampleValues":[{"num":1,"value":"集团有"}],"unique_index":"/td[1]/div[1]/h4[2]/span[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":4,"contentType":1,"relative":true,"name":"参数16_图片地址","desc":"","relativeXPath":"/td[1]/div[1]/div[1]/img[1]","allXPaths":["/td[1]/div[1]/div[1]/img[1]","//img[contains(., '')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-31]/td/div/div/img"],"exampleValues":[{"num":1,"value":"/public/2020/img/searchgj/icon_gb.png"}],"unique_index":"/td[1]/div[1]/div[1]/img[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数17_文本","desc":"","relativeXPath":"/td[2]/div[1]/span[1]","allXPaths":["/td[2]/div[1]/span[1]","//span[contains(., '广告')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-30]/td[last()-4]/div/span[last()-1]"],"exampleValues":[{"num":2,"value":"广告"}],"unique_index":"/td[2]/div[1]/span[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数18_文本","desc":"","relativeXPath":"/td[2]/div[1]/span[2]","allXPaths":["/td[2]/div[1]/span[2]","//span[contains(., '360织语即时通讯-')]","//SPAN[@class='advTitle']","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-30]/td[last()-4]/div/span"],"exampleValues":[{"num":2,"value":"360织语即时通讯-安全的企业内部沟通工具"}],"unique_index":"/td[2]/div[1]/span[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数19_文本","desc":"","relativeXPath":"/td[3]","allXPaths":["/td[3]","//td[contains(., '广告')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-30]/td[last()-3]"],"exampleValues":[{"num":2,"value":"广告"}],"unique_index":"/td[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数20_文本","desc":"","relativeXPath":"/td[4]","allXPaths":["/td[4]","//td[contains(., '全国')]","/html/body/div[last()-10]/div[last()-2]/div/table/tbody/tr/td/table/tbody/tr[last()-30]/td[last()-2]"],"exampleValues":[{"num":2,"value":"全国"}],"unique_index":"/td[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/267.json b/ElectronJS/tasks/267.json
new file mode 100644
index 0000000..f01da5d
--- /dev/null
+++ b/ElectronJS/tasks/267.json
@@ -0,0 +1 @@
+{"id":267,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"12/13/2023, 2:14:40 AM","update_time":"12/13/2023, 2:14:40 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"},{"id":1,"name":"inputText_1","nodeName":"输入文字","nodeId":2,"desc":"要输入的文本,如京东搜索框输入:电脑","type":"text","exampleValue":"1","value":"1"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,3],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"key\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"1","index":0,"allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/input[1]","//input[contains(., '')]","id(\"key\")","//INPUT[@class='text']","/html/body/div[last()-6]/div/div[last()-2]/div/input"]}},{"id":3,"index":3,"parentId":0,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search-link\"]/i[1]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/a[1]/i[1]","//i[contains(., '')]","/html/body/div[last()-6]/div/div[last()-2]/div/a/i"]}},{"id":-1,"index":4,"parentId":0,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"search-link\"]/i[1]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/a[1]/i[1]","//i[contains(., '')]","/html/body/div[last()-6]/div/div[last()-2]/div/a/i"]}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/268.json b/ElectronJS/tasks/268.json
new file mode 100644
index 0000000..4cda18b
--- /dev/null
+++ b/ElectronJS/tasks/268.json
@@ -0,0 +1 @@
+{"id":268,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"12/13/2023, 2:16:08 AM","update_time":"12/13/2023, 3:07:50 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"\n \n \n \n \n \n 京东首页\n \t\t\t\t\t\t\t\t\t\t\t海外 \t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t北京上海天津重庆河北山西河南辽宁吉林黑龙江内蒙古江苏山东安徽浙江福建湖北湖南广东广西江西四川海南贵州云南西藏陕西甘肃青海宁夏新疆港澳台湾钓鱼岛海外 \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t 地区专享版本 \t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t中國港澳 \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t中國台灣 \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t京东全球 \t\t\t\t\t \t\t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t Available Sites \t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tGlobal Site \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tСайт России \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tSitus Indonesia \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tSitio de España \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t เว็บไซต์ประเทศไทย \t\t\t\t\t\t \t\t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t\t\n \n \n 你好,请登录 免费注册\n \n \n \n 我的订单\n \n \n \n \n \n 我的京东\n \n \n \n \n \n \n 京东会员\n \n \n \n \n \n 企业采购\n \n \n \n \n \n 客户服务\n \n \n \n \n \n \n 网站导航\n \n \n \n \n \n \n 手机京东\n \n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n 网站无障碍\n \n \n \n \n \n \n\n \n \n \n (function (window) {\n window.data = window.data || {}\n window.data['cms_header'] = {\n setting: [{\"NAME\":\"手机\",\"URL\":\"//\",\"ANCHOR\":\"\",\"property\":\"\",\"CUSTOM1\":\"#050505\",\"CUSTOM2\":\"\",\"CUSTOM3\":\"\"}]\n }\n })(window)\n \n \n #search-2014 .text {border-color: #050505;}#search-2014 .button {background: #050505;} 京东 手机 全部分类◇ 搜索 >0 我的购物车 \n \n\n \n\n \n \n 顶通组件占位手机分类热门推荐苹果华为荣耀小米vivoOPPO运营商手机卡营业厅充话费配件充电器数据线手机壳贴膜移动电源创意配件热门分类全部手机5G手机苹果 iPhone 11iPhone XS Max华为Mate40 Pro 4Gnova 8 Pro 无充Nova8SE 乐活版Mate 40 RSNova 9P50 Pro 4G华为智选手机荣耀荣耀V30 PRO荣耀30 Pro荣耀X10 Max荣耀Play4 Pro小米小米10Redmi K30vivoS10 ProX60Y70t iQOO 8 iQOO Neo5 iQOO Z3OPPOReno 6OPPO K9 Find X3品牌中国移动中国联通中国电信精选店铺京东通信北京移动广东移动宽带专区50M300M优选品牌Anker罗马仕品胜倍思绿联亿色毕亚兹斯泰克热卖爆款移动电源原装充电器散热背夹扩展坞苹果数据线氮化镓Type C信号放大器手游周边王者荣耀手机散热器吃鸡神器弯头线游戏手柄王座同屏器新奇好物氮化镓PD快充双向快充创意配件配件频道海量配件低至9.包邮机身存储16GB8GB4GB分辨率全高清FHD+高清HD+屏幕尺寸5.0英寸及以下5.0~5.49英寸5.5~5.99英寸6.0~6.24英寸有新机游戏手机手机营业厅手机好店以旧换新企业购热卖推荐人气新品限时特惠配件专区摩斯维 适用华为mate40pro手机壳Mate40 Pro保护套真素皮超薄epro全包防摔马特男女 【买家推荐!石墨黑】真皮质感丨贈全屏膜¥59.000度 联想拯救者Y90钢化膜手机膜全屏防蓝光电竞磨砂防反光游戏保护膜防汗防指纹疏油玻璃贴膜 拯救者Y90(AG悦享版)¥99.00漫步者(EDIFIER)W820NB经典版 头戴蓝牙主动降噪耳机 金标认证 蓝牙5.2 手机电脑笔记本耳机 云岩白¥279.00闪魔 苹果13钢化膜 iphone13Promax手机膜mini全屏无边高清抗指纹保护贴膜 苹果13/13Pro【加强版】2片+神器¥19.80声阔Soundcore超能小彩蛋 LifeP3主动降噪真无线TWS入耳式蓝牙耳机适用苹果/华为/小米手机蓝30H续航版¥349.00\n \n \n\n \n \n \n\n \n\n \n \n window.pageConfig = window.pageConfig || {}\n window.pageConfig.o2JSConfig = {\n useTplInJs: true,\n pathRule: function (path) {\n return '//static.360buyimg.com/mtd/pc/cms' + '/floors/' + path + '.min.js'\n }\n }\n \n seajs.use(['//static.360buyimg.com/mtd/pc/base/1.0.1/channel.js'])\n \n seajs.use(['//wl.jd.com/wl.js'])\n \n \n \n !(function () {\n var testObject = {}\n if (!(Object.setPrototypeOf || testObject.__proto__)) {\n var nativeGetPrototypeOf = Object.getPrototypeOf\n Object.getPrototypeOf = function (object) {\n return object.__proto__ || nativeGetPrototypeOf.call(Object, object)\n }\n }\n })()\n \n \n \n \n \n \n // nerv-create-class 用 'nervjs'\n window.nervjs = Nerv\n // nerv-create-class\n !(function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(require(\"nervjs\")):\"function\"==typeof define&&define.amd?define([\"nervjs\"],e):t.NervCreateClass=e(t.nervjs)})(this,(function(t){\"use strict\";function e(t){return t===undefined||null===t}function n(){}function r(t){return\"function\"==typeof t}function o(t){return t===undefined}function i(t,n){for(var r in n)e(n[r])||(t[r]=n[r]);return t}function a(t){for(var e in t){var n=t[e];\"function\"!=typeof n||n.__bound||1===g[e]||((t[e]=n.bind(t)).__bound=!0)}}function c(t,e){void 0===e&&(e={});for(var n=0,r=t.length;n wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n } else if (!timeout) {\n timeout = setTimeout(later, remaining);\n }\n };\n return throttled;\n }\n // Context\n var LingAtomScrollContext = Nerv.createContext({\n scrollTop: 0,\n windowHeight: 0,\n bodyHeight: 0\n })\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n function genComponentElement (type, props, children) {\n \n return Nerv.createElement(\n Lc[type] ? Lc[type].component : 'div',\n props,\n children\n )\n \n }\n \n \n window.Lc = window.Lc || {}\n Lc['Page'] = { component: 'div' }\n \n \n function EventEmitter () {\n var eventEmitterPool = {}\n var eventEmitter = {\n on: function (eventName, handler) {\n eventEmitterPool[eventName] = eventEmitterPool[eventName] || []\n eventEmitterPool[eventName].push(handler)\n },\n trigger: function (eventName) {\n var handlers = eventEmitterPool[eventName] || []\n var args = Array.prototype.slice.call(arguments, 1)\n for (var i = 0; i < handlers.length; i++) {\n handlers[i].apply(this, args)\n }\n },\n off: function (eventName, handler) {\n if (!eventEmitterPool[eventName]) return\n if (!handler) {\n eventEmitterPool[eventName] = []\n return\n }\n var handlers = eventEmitterPool[eventName] || []\n for (var i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n eventEmitterPool[eventName].splice(i, 1)\n break\n }\n }\n }\n }\n return eventEmitter\n }\n var eventEmitter = EventEmitter()\n\n !function () {\n var downloadedBundles = [\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a6__5ee34e5afc685b3ecdd0f087.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a7__5ee34e58fc685b3ecdd0f078.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a8__5ee34e5afc685b3ecdd0f08a.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a9__5fa90cbc7e292cb70199df98.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd594__5ee34e59fc685b3ecdd0f07e.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5aa__5ee34e5bfc685b3ecdd0f094.js\"]\n var body = document.body || document.documentElement\n var Wrap = function (props) {\n return props.children\n }\n // Lazyload Component\n var LazyLoadComponent = NervCreateClass({\n // loading loaded\n status: '',\n getInitialState: function () {\n return {\n status: 'initial'\n }\n },\n updateOffsetTop: function () {\n if (this.state.status !== 'initial') return\n var node = Nerv.findDOMNode(this)\n var rect = node.getBoundingClientRect()\n var winHeight = this.props.__context.windowHeight\n var canLoad = rect.top < winHeight * 1.5 && rect.top + rect.height > -winHeight * 0.5\n if (canLoad) {\n this.downloadScript()\n }\n },\n delayLoaded: function () {\n var that = this\n setTimeout(function () {\n that.setState({ status: 'loaded' })\n }, 500)\n },\n downloadScript: function () {\n var that = this\n var myItem = this.props.item\n if (!myItem.reactBundle || downloadedBundles.indexOf(myItem.reactBundle) !== -1) {\n if (Lc[myItem.type]) {\n this.setState({ status: 'loading' })\n this.delayLoaded()\n } else {\n eventEmitter.on(myItem.type, function () {\n that.setState({ status: 'loading' })\n that.delayLoaded()\n })\n }\n return\n }\n myItem.reactBundle = myItem.reactBundle && myItem.reactBundle.replace('storage.jd.com', 'storage.360buyimg.com')\n downloadedBundles.push(myItem.reactBundle)\n var element = document.createElement('script')\n element.src = myItem.reactBundle\n element.charset = 'UTF-8'\n body.appendChild(element)\n element.onload = function () {\n that.setState({ status: 'loading' })\n that.delayLoaded()\n eventEmitter.trigger(myItem.type)\n }\n },\n componentDidMount: function () {\n this.updateOffsetTop()\n },\n componentWillReceiveProps: function (nextProps) {\n this.updateOffsetTop()\n },\n shouldComponentUpdate: function (nextProps, nextState) {\n return this.state.status !== nextState.status\n },\n componentDidCatch: function (error, info) {\n // console.log(error)\n // 上报组件渲染错误\n // @see //talos30011-prelb.o2athena.svc.n.jd.local/api-docs#null%2Fpaths%2F~1report%2Fpost\n var xhr = new XMLHttpRequest()\n xhr.open('POST', 'https://atom-log.3.cn/report', true)\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')\n xhr.send('platform=h5&url=' + location.href + '&cname=' + this.props.item.type + '&project=' + globalData.projectId)\n },\n getWrappedElement: function (extraProps) {\n if (this.WrappedElement) {\n return this.WrappedElement\n }\n var item = this.props.item\n var children = item.props.content || this.props.children || null\n var WrappedElement = genComponentElement(item.type, Object.assign({}, item.props, extraProps), children)\n this.WrappedElement = WrappedElement\n return WrappedElement\n },\n render: function () {\n var that = this\n var status = this.state.status\n // if (status === 'initial' || status === 'loading') {\n if (status === 'initial') {\n return Nerv.createElement(\n 'div',\n {\n style: {\n padding: '10px',\n backgroundClip: 'content-box',\n minHeight: '256px',\n height: '100%',\n backgroundColor: '#e3e4e5'\n }\n }\n // status === 'loading' ?\n // Nerv.createElement(\n // 'div',\n // {\n // style: {\n // width: 0,\n // height: 0,\n // overflow: 'hidden'\n // }\n // },\n // that.getWrappedElement()\n // ) : null\n )\n } else {\n // return that.getWrappedElement()\n // 缺点是多了一层 div\n this.cc = this.cc || that.getWrappedElement()\n return Nerv.createElement(\n 'div',\n status === 'loading' ? {\n style: {\n padding: '10px',\n backgroundClip: 'content-box',\n minHeight: '256px',\n height: '100%',\n backgroundColor: '#e3e4e5'\n }\n } : {},\n this.cc\n )\n }\n }\n })\n\n function createTree (tree) {\n tree = tree.filter(function (item) {\n return item.isShow === undefined || item.isShow === true\n })\n\n return tree.map(function (item) {\n var hasChildren = item.childrens && item.childrens.length\n hasChildren && (item.props.children = createTree(item.childrens))\n if (hasChildren) {\n return genComponentElement(item.type, item.props, item.props.content)\n } else {\n return Nerv.createElement(\n LingAtomScrollContext.Consumer,\n {},\n function (context) {\n return Nerv.createElement(\n LazyLoadComponent,\n {\n item: item,\n __context: context\n }\n )\n }\n )\n }\n })\n }\n\n var App = NervCreateClass({\n getInitialState: function () {\n return {\n scrollTop: 0,\n windowHeight: window.innerHeight,\n bodyHeight: document.body.clientHeight\n }\n },\n componentDidMount: function () {\n var that = this\n window.onscroll = throttle(function () {\n var bodyScrollHeight = document.documentElement.scrollTop || document.body.scrollTop\n that.setState({\n scrollTop: bodyScrollHeight\n })\n }, 200)\n window.onresize = function () {\n var windowInnerHeight = window.innerHeight\n if (windowInnerHeight === that.state.windowHeight) return\n that.setState({\n windowHeight: windowInnerHeight\n })\n }\n function onElementHeightChange (elm, callback) {\n var lastHeight = elm.clientHeight\n var newHeight\n (function run () {\n newHeight = elm.clientHeight\n if (lastHeight !== newHeight) {\n callback(newHeight)\n }\n lastHeight = newHeight\n if (elm.onElementHeightChangeTimer) {\n clearTimeout(elm.onElementHeightChangeTimer)\n }\n elm.onElementHeightChangeTimer = setTimeout(run, 200)\n })()\n }\n onElementHeightChange(document.body, function (h) {\n that.setState({ bodyHeight: h })\n })\n },\n render: function () {\n return Nerv.createElement(\n LingAtomScrollContext.Provider,\n {\n value: this.state\n },\n createTree(window.o2PageConfig.data)\n )\n }\n })\n\n Nerv.render(\n Nerv.createElement(App),\n document.querySelector('#app')\n )\n }()\n \n \n\n\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: /html/body \n"}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环点击每个元素","sequence":[3,4],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div/a","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":""}},{"id":3,"index":3,"parentId":2,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":"不滚动","scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":""}},{"id":4,"index":4,"parentId":2,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":1,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":0,"relative":false,"name":"参数1_文本","desc":"","extractType":0,"relativeXPath":"/html/body","allXPaths":["/html/body","//body[contains(., '')]","/html/body"],"exampleValues":[{"num":0,"value":"\n \n \n \n \n \n 京东首页\n \t\t\t\t\t\t\t\t\t\t\t海外 \t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t北京上海天津重庆河北山西河南辽宁吉林黑龙江内蒙古江苏山东安徽浙江福建湖北湖南广东广西江西四川海南贵州云南西藏陕西甘肃青海宁夏新疆港澳台湾钓鱼岛海外 \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t 地区专享版本 \t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t中國港澳 \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t中國台灣 \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t京东全球 \t\t\t\t\t \t\t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t Available Sites \t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tGlobal Site \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tСайт России \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tSitus Indonesia \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tSitio de España \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t เว็บไซต์ประเทศไทย \t\t\t\t\t\t \t\t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t\t\n \n \n 你好,请登录 免费注册\n \n \n \n 我的订单\n \n \n \n \n \n 我的京东\n \n \n \n \n \n \n 京东会员\n \n \n \n \n \n 企业采购\n \n \n \n \n \n 客户服务\n \n \n \n \n \n \n 网站导航\n \n \n \n \n \n \n 手机京东\n \n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n 网站无障碍\n \n \n \n \n \n \n\n \n \n \n (function (window) {\n window.data = window.data || {}\n window.data['cms_header'] = {\n setting: [{\"NAME\":\"手机\",\"URL\":\"//\",\"ANCHOR\":\"\",\"property\":\"\",\"CUSTOM1\":\"#050505\",\"CUSTOM2\":\"\",\"CUSTOM3\":\"\"}]\n }\n })(window)\n \n \n #search-2014 .text {border-color: #050505;}#search-2014 .button {background: #050505;} 京东 手机 全部分类◇ 搜索 >0 我的购物车 \n \n\n \n\n \n \n 顶通组件占位手机分类热门推荐苹果华为荣耀小米vivoOPPO运营商手机卡营业厅充话费配件充电器数据线手机壳贴膜移动电源创意配件热门分类全部手机5G手机苹果 iPhone 11iPhone XS Max华为Mate40 Pro 4Gnova 8 Pro 无充Nova8SE 乐活版Mate 40 RSNova 9P50 Pro 4G华为智选手机荣耀荣耀V30 PRO荣耀30 Pro荣耀X10 Max荣耀Play4 Pro小米小米10Redmi K30vivoS10 ProX60Y70t iQOO 8 iQOO Neo5 iQOO Z3OPPOReno 6OPPO K9 Find X3品牌中国移动中国联通中国电信精选店铺京东通信北京移动广东移动宽带专区50M300M优选品牌Anker罗马仕品胜倍思绿联亿色毕亚兹斯泰克热卖爆款移动电源原装充电器散热背夹扩展坞苹果数据线氮化镓Type C信号放大器手游周边王者荣耀手机散热器吃鸡神器弯头线游戏手柄王座同屏器新奇好物氮化镓PD快充双向快充创意配件配件频道海量配件低至9.包邮机身存储16GB8GB4GB分辨率全高清FHD+高清HD+屏幕尺寸5.0英寸及以下5.0~5.49英寸5.5~5.99英寸6.0~6.24英寸有新机游戏手机手机营业厅手机好店以旧换新企业购热卖推荐人气新品限时特惠配件专区摩斯维 适用华为mate40pro手机壳Mate40 Pro保护套真素皮超薄epro全包防摔马特男女 【买家推荐!石墨黑】真皮质感丨贈全屏膜¥59.000度 联想拯救者Y90钢化膜手机膜全屏防蓝光电竞磨砂防反光游戏保护膜防汗防指纹疏油玻璃贴膜 拯救者Y90(AG悦享版)¥99.00漫步者(EDIFIER)W820NB经典版 头戴蓝牙主动降噪耳机 金标认证 蓝牙5.2 手机电脑笔记本耳机 云岩白¥279.00闪魔 苹果13钢化膜 iphone13Promax手机膜mini全屏无边高清抗指纹保护贴膜 苹果13/13Pro【加强版】2片+神器¥19.80声阔Soundcore超能小彩蛋 LifeP3主动降噪真无线TWS入耳式蓝牙耳机适用苹果/华为/小米手机蓝30H续航版¥349.00\n \n \n\n \n \n \n\n \n\n \n \n window.pageConfig = window.pageConfig || {}\n window.pageConfig.o2JSConfig = {\n useTplInJs: true,\n pathRule: function (path) {\n return '//static.360buyimg.com/mtd/pc/cms' + '/floors/' + path + '.min.js'\n }\n }\n \n seajs.use(['//static.360buyimg.com/mtd/pc/base/1.0.1/channel.js'])\n \n seajs.use(['//wl.jd.com/wl.js'])\n \n \n \n !(function () {\n var testObject = {}\n if (!(Object.setPrototypeOf || testObject.__proto__)) {\n var nativeGetPrototypeOf = Object.getPrototypeOf\n Object.getPrototypeOf = function (object) {\n return object.__proto__ || nativeGetPrototypeOf.call(Object, object)\n }\n }\n })()\n \n \n \n \n \n \n // nerv-create-class 用 'nervjs'\n window.nervjs = Nerv\n // nerv-create-class\n !(function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(require(\"nervjs\")):\"function\"==typeof define&&define.amd?define([\"nervjs\"],e):t.NervCreateClass=e(t.nervjs)})(this,(function(t){\"use strict\";function e(t){return t===undefined||null===t}function n(){}function r(t){return\"function\"==typeof t}function o(t){return t===undefined}function i(t,n){for(var r in n)e(n[r])||(t[r]=n[r]);return t}function a(t){for(var e in t){var n=t[e];\"function\"!=typeof n||n.__bound||1===g[e]||((t[e]=n.bind(t)).__bound=!0)}}function c(t,e){void 0===e&&(e={});for(var n=0,r=t.length;n wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n } else if (!timeout) {\n timeout = setTimeout(later, remaining);\n }\n };\n return throttled;\n }\n // Context\n var LingAtomScrollContext = Nerv.createContext({\n scrollTop: 0,\n windowHeight: 0,\n bodyHeight: 0\n })\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n function genComponentElement (type, props, children) {\n \n return Nerv.createElement(\n Lc[type] ? Lc[type].component : 'div',\n props,\n children\n )\n \n }\n \n \n window.Lc = window.Lc || {}\n Lc['Page'] = { component: 'div' }\n \n \n function EventEmitter () {\n var eventEmitterPool = {}\n var eventEmitter = {\n on: function (eventName, handler) {\n eventEmitterPool[eventName] = eventEmitterPool[eventName] || []\n eventEmitterPool[eventName].push(handler)\n },\n trigger: function (eventName) {\n var handlers = eventEmitterPool[eventName] || []\n var args = Array.prototype.slice.call(arguments, 1)\n for (var i = 0; i < handlers.length; i++) {\n handlers[i].apply(this, args)\n }\n },\n off: function (eventName, handler) {\n if (!eventEmitterPool[eventName]) return\n if (!handler) {\n eventEmitterPool[eventName] = []\n return\n }\n var handlers = eventEmitterPool[eventName] || []\n for (var i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n eventEmitterPool[eventName].splice(i, 1)\n break\n }\n }\n }\n }\n return eventEmitter\n }\n var eventEmitter = EventEmitter()\n\n !function () {\n var downloadedBundles = [\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a6__5ee34e5afc685b3ecdd0f087.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a7__5ee34e58fc685b3ecdd0f078.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a8__5ee34e5afc685b3ecdd0f08a.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a9__5fa90cbc7e292cb70199df98.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd594__5ee34e59fc685b3ecdd0f07e.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5aa__5ee34e5bfc685b3ecdd0f094.js\"]\n var body = document.body || document.documentElement\n var Wrap = function (props) {\n return props.children\n }\n // Lazyload Component\n var LazyLoadComponent = NervCreateClass({\n // loading loaded\n status: '',\n getInitialState: function () {\n return {\n status: 'initial'\n }\n },\n updateOffsetTop: function () {\n if (this.state.status !== 'initial') return\n var node = Nerv.findDOMNode(this)\n var rect = node.getBoundingClientRect()\n var winHeight = this.props.__context.windowHeight\n var canLoad = rect.top < winHeight * 1.5 && rect.top + rect.height > -winHeight * 0.5\n if (canLoad) {\n this.downloadScript()\n }\n },\n delayLoaded: function () {\n var that = this\n setTimeout(function () {\n that.setState({ status: 'loaded' })\n }, 500)\n },\n downloadScript: function () {\n var that = this\n var myItem = this.props.item\n if (!myItem.reactBundle || downloadedBundles.indexOf(myItem.reactBundle) !== -1) {\n if (Lc[myItem.type]) {\n this.setState({ status: 'loading' })\n this.delayLoaded()\n } else {\n eventEmitter.on(myItem.type, function () {\n that.setState({ status: 'loading' })\n that.delayLoaded()\n })\n }\n return\n }\n myItem.reactBundle = myItem.reactBundle && myItem.reactBundle.replace('storage.jd.com', 'storage.360buyimg.com')\n downloadedBundles.push(myItem.reactBundle)\n var element = document.createElement('script')\n element.src = myItem.reactBundle\n element.charset = 'UTF-8'\n body.appendChild(element)\n element.onload = function () {\n that.setState({ status: 'loading' })\n that.delayLoaded()\n eventEmitter.trigger(myItem.type)\n }\n },\n componentDidMount: function () {\n this.updateOffsetTop()\n },\n componentWillReceiveProps: function (nextProps) {\n this.updateOffsetTop()\n },\n shouldComponentUpdate: function (nextProps, nextState) {\n return this.state.status !== nextState.status\n },\n componentDidCatch: function (error, info) {\n // console.log(error)\n // 上报组件渲染错误\n // @see //talos30011-prelb.o2athena.svc.n.jd.local/api-docs#null%2Fpaths%2F~1report%2Fpost\n var xhr = new XMLHttpRequest()\n xhr.open('POST', 'https://atom-log.3.cn/report', true)\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')\n xhr.send('platform=h5&url=' + location.href + '&cname=' + this.props.item.type + '&project=' + globalData.projectId)\n },\n getWrappedElement: function (extraProps) {\n if (this.WrappedElement) {\n return this.WrappedElement\n }\n var item = this.props.item\n var children = item.props.content || this.props.children || null\n var WrappedElement = genComponentElement(item.type, Object.assign({}, item.props, extraProps), children)\n this.WrappedElement = WrappedElement\n return WrappedElement\n },\n render: function () {\n var that = this\n var status = this.state.status\n // if (status === 'initial' || status === 'loading') {\n if (status === 'initial') {\n return Nerv.createElement(\n 'div',\n {\n style: {\n padding: '10px',\n backgroundClip: 'content-box',\n minHeight: '256px',\n height: '100%',\n backgroundColor: '#e3e4e5'\n }\n }\n // status === 'loading' ?\n // Nerv.createElement(\n // 'div',\n // {\n // style: {\n // width: 0,\n // height: 0,\n // overflow: 'hidden'\n // }\n // },\n // that.getWrappedElement()\n // ) : null\n )\n } else {\n // return that.getWrappedElement()\n // 缺点是多了一层 div\n this.cc = this.cc || that.getWrappedElement()\n return Nerv.createElement(\n 'div',\n status === 'loading' ? {\n style: {\n padding: '10px',\n backgroundClip: 'content-box',\n minHeight: '256px',\n height: '100%',\n backgroundColor: '#e3e4e5'\n }\n } : {},\n this.cc\n )\n }\n }\n })\n\n function createTree (tree) {\n tree = tree.filter(function (item) {\n return item.isShow === undefined || item.isShow === true\n })\n\n return tree.map(function (item) {\n var hasChildren = item.childrens && item.childrens.length\n hasChildren && (item.props.children = createTree(item.childrens))\n if (hasChildren) {\n return genComponentElement(item.type, item.props, item.props.content)\n } else {\n return Nerv.createElement(\n LingAtomScrollContext.Consumer,\n {},\n function (context) {\n return Nerv.createElement(\n LazyLoadComponent,\n {\n item: item,\n __context: context\n }\n )\n }\n )\n }\n })\n }\n\n var App = NervCreateClass({\n getInitialState: function () {\n return {\n scrollTop: 0,\n windowHeight: window.innerHeight,\n bodyHeight: document.body.clientHeight\n }\n },\n componentDidMount: function () {\n var that = this\n window.onscroll = throttle(function () {\n var bodyScrollHeight = document.documentElement.scrollTop || document.body.scrollTop\n that.setState({\n scrollTop: bodyScrollHeight\n })\n }, 200)\n window.onresize = function () {\n var windowInnerHeight = window.innerHeight\n if (windowInnerHeight === that.state.windowHeight) return\n that.setState({\n windowHeight: windowInnerHeight\n })\n }\n function onElementHeightChange (elm, callback) {\n var lastHeight = elm.clientHeight\n var newHeight\n (function run () {\n newHeight = elm.clientHeight\n if (lastHeight !== newHeight) {\n callback(newHeight)\n }\n lastHeight = newHeight\n if (elm.onElementHeightChangeTimer) {\n clearTimeout(elm.onElementHeightChangeTimer)\n }\n elm.onElementHeightChangeTimer = setTimeout(run, 200)\n })()\n }\n onElementHeightChange(document.body, function (h) {\n that.setState({ bodyHeight: h })\n })\n },\n render: function () {\n return Nerv.createElement(\n LingAtomScrollContext.Provider,\n {\n value: this.state\n },\n createTree(window.o2PageConfig.data)\n )\n }\n })\n\n Nerv.render(\n Nerv.createElement(App),\n document.querySelector('#app')\n )\n }()\n \n \n\n\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: /html/body \n"}],"unique_index":"dm351g9ekwlq2nym1s","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/269.json b/ElectronJS/tasks/269.json
new file mode 100644
index 0000000..3f73d23
--- /dev/null
+++ b/ElectronJS/tasks/269.json
@@ -0,0 +1 @@
+{"id":269,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"12/13/2023, 3:19:13 AM","update_time":"12/13/2023, 3:27:32 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,7],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":-1,"index":2,"parentId":0,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"newTab":1,"maxWaitTime":10,"paras":[],"alertHandleType":0}},{"id":-1,"index":3,"parentId":0,"type":1,"option":8,"title":"循环点击单个元素","sequence":[4],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"LeftSide_menu_list__qXCeM\")]/div[1]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":0,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]","//div[contains(., '/手机/数码')]","//DIV[@class='LeftSide_menu_item__SBMWC LeftSide_text_space__2UhbG ']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]"]}},{"id":-1,"index":4,"parentId":3,"type":0,"option":2,"title":"点击手机/数码","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"newTab":1,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]","//div[contains(., '/手机/数码')]","//DIV[@class='LeftSide_menu_item__SBMWC LeftSide_text_space__2UhbG ']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]"]}},{"id":-1,"index":5,"parentId":0,"type":0,"option":2,"title":"点击手机/数码","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[contains(@class, \"LeftSide_menu_list__qXCeM\")]/div[1]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":"不滚动","scrollCount":1,"scrollWaitTime":1,"clickWay":0,"newTab":1,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]","//div[contains(., '/手机/数码')]","//DIV[@class='LeftSide_menu_item__SBMWC LeftSide_text_space__2UhbG ']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]"]}},{"id":-1,"index":6,"parentId":0,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"newTab":1,"maxWaitTime":10,"paras":[],"alertHandleType":0}},{"id":2,"index":7,"parentId":0,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":"不滚动","scrollCount":1,"scrollWaitTime":1,"clickWay":1,"newTab":"0","maxWaitTime":10,"paras":[],"alertHandleType":0}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/270.json b/ElectronJS/tasks/270.json
new file mode 100644
index 0000000..a67ee96
--- /dev/null
+++ b/ElectronJS/tasks/270.json
@@ -0,0 +1 @@
+{"id":270,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"12/13/2023, 3:41:58 AM","update_time":"12/13/2023, 3:43:29 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"\n \n \n \n \n \n 京东首页\n \t\t\t\t\t\t\t\t\t\t\t海外 \t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t北京上海天津重庆河北山西河南辽宁吉林黑龙江内蒙古江苏山东安徽浙江福建湖北湖南广东广西江西四川海南贵州云南西藏陕西甘肃青海宁夏新疆港澳台湾钓鱼岛海外 \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t 地区专享版本 \t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t中國港澳 \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t中國台灣 \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t京东全球 \t\t\t\t\t \t\t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t Available Sites \t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tGlobal Site \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tСайт России \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tSitus Indonesia \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tSitio de España \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t เว็บไซต์ประเทศไทย \t\t\t\t\t\t \t\t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t\t\n \n \n 你好,请登录 免费注册\n \n \n \n 我的订单\n \n \n \n \n \n 我的京东\n \n \n \n \n \n \n 京东会员\n \n \n \n \n \n 企业采购\n \n \n \n \n \n 客户服务\n \n \n \n \n \n \n 网站导航\n \n \n \n \n \n \n 手机京东\n \n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n 网站无障碍\n \n \n \n \n \n \n\n \n \n \n (function (window) {\n window.data = window.data || {}\n window.data['cms_header'] = {\n setting: [{\"NAME\":\"手机\",\"URL\":\"//\",\"ANCHOR\":\"\",\"property\":\"\",\"CUSTOM1\":\"#050505\",\"CUSTOM2\":\"\",\"CUSTOM3\":\"\"}]\n }\n })(window)\n \n \n #search-2014 .text {border-color: #050505;}#search-2014 .button {background: #050505;} 京东 手机 全部分类◇ 搜索 >0 我的购物车 \n \n\n \n\n \n \n 顶通组件占位手机分类热门推荐苹果华为荣耀小米vivoOPPO运营商手机卡营业厅充话费配件充电器数据线手机壳贴膜移动电源创意配件热门分类全部手机5G手机苹果 iPhone 11iPhone XS Max华为Mate40 Pro 4Gnova 8 Pro 无充Nova8SE 乐活版Mate 40 RSNova 9P50 Pro 4G华为智选手机荣耀荣耀V30 PRO荣耀30 Pro荣耀X10 Max荣耀Play4 Pro小米小米10Redmi K30vivoS10 ProX60Y70t iQOO 8 iQOO Neo5 iQOO Z3OPPOReno 6OPPO K9 Find X3品牌中国移动中国联通中国电信精选店铺京东通信北京移动广东移动宽带专区50M300M优选品牌Anker罗马仕品胜倍思绿联亿色毕亚兹斯泰克热卖爆款移动电源原装充电器散热背夹扩展坞苹果数据线氮化镓Type C信号放大器手游周边王者荣耀手机散热器吃鸡神器弯头线游戏手柄王座同屏器新奇好物氮化镓PD快充双向快充创意配件配件频道海量配件低至9.包邮机身存储16GB8GB4GB分辨率全高清FHD+高清HD+屏幕尺寸5.0英寸及以下5.0~5.49英寸5.5~5.99英寸6.0~6.24英寸有新机游戏手机手机营业厅手机好店以旧换新企业购热卖推荐人气新品限时特惠配件专区摩斯维 适用华为mate40pro手机壳Mate40 Pro保护套真素皮超薄epro全包防摔马特男女 【买家推荐!石墨黑】真皮质感丨贈全屏膜¥59.000度 联想拯救者Y90钢化膜手机膜全屏防蓝光电竞磨砂防反光游戏保护膜防汗防指纹疏油玻璃贴膜 拯救者Y90(AG悦享版)¥99.00漫步者(EDIFIER)W820NB经典版 头戴蓝牙主动降噪耳机 金标认证 蓝牙5.2 手机电脑笔记本耳机 云岩白¥279.00闪魔 苹果13钢化膜 iphone13Promax手机膜mini全屏无边高清抗指纹保护贴膜 苹果13/13Pro【加强版】2片+神器¥19.80声阔Soundcore超能小彩蛋 LifeP3主动降噪真无线TWS入耳式蓝牙耳机适用苹果/华为/小米手机蓝30H续航版¥349.00\n \n \n\n \n \n \n\n \n\n \n \n window.pageConfig = window.pageConfig || {}\n window.pageConfig.o2JSConfig = {\n useTplInJs: true,\n pathRule: function (path) {\n return '//static.360buyimg.com/mtd/pc/cms' + '/floors/' + path + '.min.js'\n }\n }\n \n seajs.use(['//static.360buyimg.com/mtd/pc/base/1.0.1/channel.js'])\n \n seajs.use(['//wl.jd.com/wl.js'])\n \n \n \n !(function () {\n var testObject = {}\n if (!(Object.setPrototypeOf || testObject.__proto__)) {\n var nativeGetPrototypeOf = Object.getPrototypeOf\n Object.getPrototypeOf = function (object) {\n return object.__proto__ || nativeGetPrototypeOf.call(Object, object)\n }\n }\n })()\n \n \n \n \n \n \n // nerv-create-class 用 'nervjs'\n window.nervjs = Nerv\n // nerv-create-class\n !(function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(require(\"nervjs\")):\"function\"==typeof define&&define.amd?define([\"nervjs\"],e):t.NervCreateClass=e(t.nervjs)})(this,(function(t){\"use strict\";function e(t){return t===undefined||null===t}function n(){}function r(t){return\"function\"==typeof t}function o(t){return t===undefined}function i(t,n){for(var r in n)e(n[r])||(t[r]=n[r]);return t}function a(t){for(var e in t){var n=t[e];\"function\"!=typeof n||n.__bound||1===g[e]||((t[e]=n.bind(t)).__bound=!0)}}function c(t,e){void 0===e&&(e={});for(var n=0,r=t.length;n wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n } else if (!timeout) {\n timeout = setTimeout(later, remaining);\n }\n };\n return throttled;\n }\n // Context\n var LingAtomScrollContext = Nerv.createContext({\n scrollTop: 0,\n windowHeight: 0,\n bodyHeight: 0\n })\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n function genComponentElement (type, props, children) {\n \n return Nerv.createElement(\n Lc[type] ? Lc[type].component : 'div',\n props,\n children\n )\n \n }\n \n \n window.Lc = window.Lc || {}\n Lc['Page'] = { component: 'div' }\n \n \n function EventEmitter () {\n var eventEmitterPool = {}\n var eventEmitter = {\n on: function (eventName, handler) {\n eventEmitterPool[eventName] = eventEmitterPool[eventName] || []\n eventEmitterPool[eventName].push(handler)\n },\n trigger: function (eventName) {\n var handlers = eventEmitterPool[eventName] || []\n var args = Array.prototype.slice.call(arguments, 1)\n for (var i = 0; i < handlers.length; i++) {\n handlers[i].apply(this, args)\n }\n },\n off: function (eventName, handler) {\n if (!eventEmitterPool[eventName]) return\n if (!handler) {\n eventEmitterPool[eventName] = []\n return\n }\n var handlers = eventEmitterPool[eventName] || []\n for (var i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n eventEmitterPool[eventName].splice(i, 1)\n break\n }\n }\n }\n }\n return eventEmitter\n }\n var eventEmitter = EventEmitter()\n\n !function () {\n var downloadedBundles = [\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a6__5ee34e5afc685b3ecdd0f087.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a7__5ee34e58fc685b3ecdd0f078.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a8__5ee34e5afc685b3ecdd0f08a.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a9__5fa90cbc7e292cb70199df98.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd594__5ee34e59fc685b3ecdd0f07e.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5aa__5ee34e5bfc685b3ecdd0f094.js\"]\n var body = document.body || document.documentElement\n var Wrap = function (props) {\n return props.children\n }\n // Lazyload Component\n var LazyLoadComponent = NervCreateClass({\n // loading loaded\n status: '',\n getInitialState: function () {\n return {\n status: 'initial'\n }\n },\n updateOffsetTop: function () {\n if (this.state.status !== 'initial') return\n var node = Nerv.findDOMNode(this)\n var rect = node.getBoundingClientRect()\n var winHeight = this.props.__context.windowHeight\n var canLoad = rect.top < winHeight * 1.5 && rect.top + rect.height > -winHeight * 0.5\n if (canLoad) {\n this.downloadScript()\n }\n },\n delayLoaded: function () {\n var that = this\n setTimeout(function () {\n that.setState({ status: 'loaded' })\n }, 500)\n },\n downloadScript: function () {\n var that = this\n var myItem = this.props.item\n if (!myItem.reactBundle || downloadedBundles.indexOf(myItem.reactBundle) !== -1) {\n if (Lc[myItem.type]) {\n this.setState({ status: 'loading' })\n this.delayLoaded()\n } else {\n eventEmitter.on(myItem.type, function () {\n that.setState({ status: 'loading' })\n that.delayLoaded()\n })\n }\n return\n }\n myItem.reactBundle = myItem.reactBundle && myItem.reactBundle.replace('storage.jd.com', 'storage.360buyimg.com')\n downloadedBundles.push(myItem.reactBundle)\n var element = document.createElement('script')\n element.src = myItem.reactBundle\n element.charset = 'UTF-8'\n body.appendChild(element)\n element.onload = function () {\n that.setState({ status: 'loading' })\n that.delayLoaded()\n eventEmitter.trigger(myItem.type)\n }\n },\n componentDidMount: function () {\n this.updateOffsetTop()\n },\n componentWillReceiveProps: function (nextProps) {\n this.updateOffsetTop()\n },\n shouldComponentUpdate: function (nextProps, nextState) {\n return this.state.status !== nextState.status\n },\n componentDidCatch: function (error, info) {\n // console.log(error)\n // 上报组件渲染错误\n // @see //talos30011-prelb.o2athena.svc.n.jd.local/api-docs#null%2Fpaths%2F~1report%2Fpost\n var xhr = new XMLHttpRequest()\n xhr.open('POST', 'https://atom-log.3.cn/report', true)\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')\n xhr.send('platform=h5&url=' + location.href + '&cname=' + this.props.item.type + '&project=' + globalData.projectId)\n },\n getWrappedElement: function (extraProps) {\n if (this.WrappedElement) {\n return this.WrappedElement\n }\n var item = this.props.item\n var children = item.props.content || this.props.children || null\n var WrappedElement = genComponentElement(item.type, Object.assign({}, item.props, extraProps), children)\n this.WrappedElement = WrappedElement\n return WrappedElement\n },\n render: function () {\n var that = this\n var status = this.state.status\n // if (status === 'initial' || status === 'loading') {\n if (status === 'initial') {\n return Nerv.createElement(\n 'div',\n {\n style: {\n padding: '10px',\n backgroundClip: 'content-box',\n minHeight: '256px',\n height: '100%',\n backgroundColor: '#e3e4e5'\n }\n }\n // status === 'loading' ?\n // Nerv.createElement(\n // 'div',\n // {\n // style: {\n // width: 0,\n // height: 0,\n // overflow: 'hidden'\n // }\n // },\n // that.getWrappedElement()\n // ) : null\n )\n } else {\n // return that.getWrappedElement()\n // 缺点是多了一层 div\n this.cc = this.cc || that.getWrappedElement()\n return Nerv.createElement(\n 'div',\n status === 'loading' ? {\n style: {\n padding: '10px',\n backgroundClip: 'content-box',\n minHeight: '256px',\n height: '100%',\n backgroundColor: '#e3e4e5'\n }\n } : {},\n this.cc\n )\n }\n }\n })\n\n function createTree (tree) {\n tree = tree.filter(function (item) {\n return item.isShow === undefined || item.isShow === true\n })\n\n return tree.map(function (item) {\n var hasChildren = item.childrens && item.childrens.length\n hasChildren && (item.props.children = createTree(item.childrens))\n if (hasChildren) {\n return genComponentElement(item.type, item.props, item.props.content)\n } else {\n return Nerv.createElement(\n LingAtomScrollContext.Consumer,\n {},\n function (context) {\n return Nerv.createElement(\n LazyLoadComponent,\n {\n item: item,\n __context: context\n }\n )\n }\n )\n }\n })\n }\n\n var App = NervCreateClass({\n getInitialState: function () {\n return {\n scrollTop: 0,\n windowHeight: window.innerHeight,\n bodyHeight: document.body.clientHeight\n }\n },\n componentDidMount: function () {\n var that = this\n window.onscroll = throttle(function () {\n var bodyScrollHeight = document.documentElement.scrollTop || document.body.scrollTop\n that.setState({\n scrollTop: bodyScrollHeight\n })\n }, 200)\n window.onresize = function () {\n var windowInnerHeight = window.innerHeight\n if (windowInnerHeight === that.state.windowHeight) return\n that.setState({\n windowHeight: windowInnerHeight\n })\n }\n function onElementHeightChange (elm, callback) {\n var lastHeight = elm.clientHeight\n var newHeight\n (function run () {\n newHeight = elm.clientHeight\n if (lastHeight !== newHeight) {\n callback(newHeight)\n }\n lastHeight = newHeight\n if (elm.onElementHeightChangeTimer) {\n clearTimeout(elm.onElementHeightChangeTimer)\n }\n elm.onElementHeightChangeTimer = setTimeout(run, 200)\n })()\n }\n onElementHeightChange(document.body, function (h) {\n that.setState({ bodyHeight: h })\n })\n },\n render: function () {\n return Nerv.createElement(\n LingAtomScrollContext.Provider,\n {\n value: this.state\n },\n createTree(window.o2PageConfig.data)\n )\n }\n })\n\n Nerv.render(\n Nerv.createElement(App),\n document.querySelector('#app')\n )\n }()\n \n \n\n\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: /html/body \n"}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环点击每个元素","sequence":[3,4],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div/a","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","textList":"","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":""}},{"id":3,"index":3,"parentId":2,"type":0,"option":2,"title":"点击元素","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"newTab":0,"maxWaitTime":10,"paras":[],"alertHandleType":0,"allXPaths":""}},{"id":4,"index":4,"parentId":2,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":1,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":0,"relative":false,"name":"参数1_文本","desc":"","extractType":0,"relativeXPath":"/html/body","allXPaths":["/html/body","//body[contains(., '')]","/html/body"],"exampleValues":[{"num":0,"value":"\n \n \n \n \n \n 京东首页\n \t\t\t\t\t\t\t\t\t\t\t海外 \t\t\t\t\t\t\t\t\t\t\t\t\t\t \t\t\t\t\t北京上海天津重庆河北山西河南辽宁吉林黑龙江内蒙古江苏山东安徽浙江福建湖北湖南广东广西江西四川海南贵州云南西藏陕西甘肃青海宁夏新疆港澳台湾钓鱼岛海外 \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t 地区专享版本 \t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t中國港澳 \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t中國台灣 \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t京东全球 \t\t\t\t\t \t\t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t Available Sites \t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tGlobal Site \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tСайт России \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tSitus Indonesia \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\tSitio de España \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t \t\t\t\t\t\t เว็บไซต์ประเทศไทย \t\t\t\t\t\t \t\t\t\t\t \t\t\t\t \t\t\t\t \t\t\t\t\t\n \n \n 你好,请登录 免费注册\n \n \n \n 我的订单\n \n \n \n \n \n 我的京东\n \n \n \n \n \n \n 京东会员\n \n \n \n \n \n 企业采购\n \n \n \n \n \n 客户服务\n \n \n \n \n \n \n 网站导航\n \n \n \n \n \n \n 手机京东\n \n \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\n 网站无障碍\n \n \n \n \n \n \n\n \n \n \n (function (window) {\n window.data = window.data || {}\n window.data['cms_header'] = {\n setting: [{\"NAME\":\"手机\",\"URL\":\"//\",\"ANCHOR\":\"\",\"property\":\"\",\"CUSTOM1\":\"#050505\",\"CUSTOM2\":\"\",\"CUSTOM3\":\"\"}]\n }\n })(window)\n \n \n #search-2014 .text {border-color: #050505;}#search-2014 .button {background: #050505;} 京东 手机 全部分类◇ 搜索 >0 我的购物车 \n \n\n \n\n \n \n 顶通组件占位手机分类热门推荐苹果华为荣耀小米vivoOPPO运营商手机卡营业厅充话费配件充电器数据线手机壳贴膜移动电源创意配件热门分类全部手机5G手机苹果 iPhone 11iPhone XS Max华为Mate40 Pro 4Gnova 8 Pro 无充Nova8SE 乐活版Mate 40 RSNova 9P50 Pro 4G华为智选手机荣耀荣耀V30 PRO荣耀30 Pro荣耀X10 Max荣耀Play4 Pro小米小米10Redmi K30vivoS10 ProX60Y70t iQOO 8 iQOO Neo5 iQOO Z3OPPOReno 6OPPO K9 Find X3品牌中国移动中国联通中国电信精选店铺京东通信北京移动广东移动宽带专区50M300M优选品牌Anker罗马仕品胜倍思绿联亿色毕亚兹斯泰克热卖爆款移动电源原装充电器散热背夹扩展坞苹果数据线氮化镓Type C信号放大器手游周边王者荣耀手机散热器吃鸡神器弯头线游戏手柄王座同屏器新奇好物氮化镓PD快充双向快充创意配件配件频道海量配件低至9.包邮机身存储16GB8GB4GB分辨率全高清FHD+高清HD+屏幕尺寸5.0英寸及以下5.0~5.49英寸5.5~5.99英寸6.0~6.24英寸有新机游戏手机手机营业厅手机好店以旧换新企业购热卖推荐人气新品限时特惠配件专区摩斯维 适用华为mate40pro手机壳Mate40 Pro保护套真素皮超薄epro全包防摔马特男女 【买家推荐!石墨黑】真皮质感丨贈全屏膜¥59.000度 联想拯救者Y90钢化膜手机膜全屏防蓝光电竞磨砂防反光游戏保护膜防汗防指纹疏油玻璃贴膜 拯救者Y90(AG悦享版)¥99.00漫步者(EDIFIER)W820NB经典版 头戴蓝牙主动降噪耳机 金标认证 蓝牙5.2 手机电脑笔记本耳机 云岩白¥279.00闪魔 苹果13钢化膜 iphone13Promax手机膜mini全屏无边高清抗指纹保护贴膜 苹果13/13Pro【加强版】2片+神器¥19.80声阔Soundcore超能小彩蛋 LifeP3主动降噪真无线TWS入耳式蓝牙耳机适用苹果/华为/小米手机蓝30H续航版¥349.00\n \n \n\n \n \n \n\n \n\n \n \n window.pageConfig = window.pageConfig || {}\n window.pageConfig.o2JSConfig = {\n useTplInJs: true,\n pathRule: function (path) {\n return '//static.360buyimg.com/mtd/pc/cms' + '/floors/' + path + '.min.js'\n }\n }\n \n seajs.use(['//static.360buyimg.com/mtd/pc/base/1.0.1/channel.js'])\n \n seajs.use(['//wl.jd.com/wl.js'])\n \n \n \n !(function () {\n var testObject = {}\n if (!(Object.setPrototypeOf || testObject.__proto__)) {\n var nativeGetPrototypeOf = Object.getPrototypeOf\n Object.getPrototypeOf = function (object) {\n return object.__proto__ || nativeGetPrototypeOf.call(Object, object)\n }\n }\n })()\n \n \n \n \n \n \n // nerv-create-class 用 'nervjs'\n window.nervjs = Nerv\n // nerv-create-class\n !(function(t,e){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=e(require(\"nervjs\")):\"function\"==typeof define&&define.amd?define([\"nervjs\"],e):t.NervCreateClass=e(t.nervjs)})(this,(function(t){\"use strict\";function e(t){return t===undefined||null===t}function n(){}function r(t){return\"function\"==typeof t}function o(t){return t===undefined}function i(t,n){for(var r in n)e(n[r])||(t[r]=n[r]);return t}function a(t){for(var e in t){var n=t[e];\"function\"!=typeof n||n.__bound||1===g[e]||((t[e]=n.bind(t)).__bound=!0)}}function c(t,e){void 0===e&&(e={});for(var n=0,r=t.length;n wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n } else if (!timeout) {\n timeout = setTimeout(later, remaining);\n }\n };\n return throttled;\n }\n // Context\n var LingAtomScrollContext = Nerv.createContext({\n scrollTop: 0,\n windowHeight: 0,\n bodyHeight: 0\n })\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n function genComponentElement (type, props, children) {\n \n return Nerv.createElement(\n Lc[type] ? Lc[type].component : 'div',\n props,\n children\n )\n \n }\n \n \n window.Lc = window.Lc || {}\n Lc['Page'] = { component: 'div' }\n \n \n function EventEmitter () {\n var eventEmitterPool = {}\n var eventEmitter = {\n on: function (eventName, handler) {\n eventEmitterPool[eventName] = eventEmitterPool[eventName] || []\n eventEmitterPool[eventName].push(handler)\n },\n trigger: function (eventName) {\n var handlers = eventEmitterPool[eventName] || []\n var args = Array.prototype.slice.call(arguments, 1)\n for (var i = 0; i < handlers.length; i++) {\n handlers[i].apply(this, args)\n }\n },\n off: function (eventName, handler) {\n if (!eventEmitterPool[eventName]) return\n if (!handler) {\n eventEmitterPool[eventName] = []\n return\n }\n var handlers = eventEmitterPool[eventName] || []\n for (var i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n eventEmitterPool[eventName].splice(i, 1)\n break\n }\n }\n }\n }\n return eventEmitter\n }\n var eventEmitter = EventEmitter()\n\n !function () {\n var downloadedBundles = [\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a6__5ee34e5afc685b3ecdd0f087.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a7__5ee34e58fc685b3ecdd0f078.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a8__5ee34e5afc685b3ecdd0f08a.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5a9__5fa90cbc7e292cb70199df98.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd594__5ee34e59fc685b3ecdd0f07e.js\",\"//storage.360buyimg.com/quark-platform/component/standard/5cd436279a6ea5003becd5aa__5ee34e5bfc685b3ecdd0f094.js\"]\n var body = document.body || document.documentElement\n var Wrap = function (props) {\n return props.children\n }\n // Lazyload Component\n var LazyLoadComponent = NervCreateClass({\n // loading loaded\n status: '',\n getInitialState: function () {\n return {\n status: 'initial'\n }\n },\n updateOffsetTop: function () {\n if (this.state.status !== 'initial') return\n var node = Nerv.findDOMNode(this)\n var rect = node.getBoundingClientRect()\n var winHeight = this.props.__context.windowHeight\n var canLoad = rect.top < winHeight * 1.5 && rect.top + rect.height > -winHeight * 0.5\n if (canLoad) {\n this.downloadScript()\n }\n },\n delayLoaded: function () {\n var that = this\n setTimeout(function () {\n that.setState({ status: 'loaded' })\n }, 500)\n },\n downloadScript: function () {\n var that = this\n var myItem = this.props.item\n if (!myItem.reactBundle || downloadedBundles.indexOf(myItem.reactBundle) !== -1) {\n if (Lc[myItem.type]) {\n this.setState({ status: 'loading' })\n this.delayLoaded()\n } else {\n eventEmitter.on(myItem.type, function () {\n that.setState({ status: 'loading' })\n that.delayLoaded()\n })\n }\n return\n }\n myItem.reactBundle = myItem.reactBundle && myItem.reactBundle.replace('storage.jd.com', 'storage.360buyimg.com')\n downloadedBundles.push(myItem.reactBundle)\n var element = document.createElement('script')\n element.src = myItem.reactBundle\n element.charset = 'UTF-8'\n body.appendChild(element)\n element.onload = function () {\n that.setState({ status: 'loading' })\n that.delayLoaded()\n eventEmitter.trigger(myItem.type)\n }\n },\n componentDidMount: function () {\n this.updateOffsetTop()\n },\n componentWillReceiveProps: function (nextProps) {\n this.updateOffsetTop()\n },\n shouldComponentUpdate: function (nextProps, nextState) {\n return this.state.status !== nextState.status\n },\n componentDidCatch: function (error, info) {\n // console.log(error)\n // 上报组件渲染错误\n // @see //talos30011-prelb.o2athena.svc.n.jd.local/api-docs#null%2Fpaths%2F~1report%2Fpost\n var xhr = new XMLHttpRequest()\n xhr.open('POST', 'https://atom-log.3.cn/report', true)\n xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')\n xhr.send('platform=h5&url=' + location.href + '&cname=' + this.props.item.type + '&project=' + globalData.projectId)\n },\n getWrappedElement: function (extraProps) {\n if (this.WrappedElement) {\n return this.WrappedElement\n }\n var item = this.props.item\n var children = item.props.content || this.props.children || null\n var WrappedElement = genComponentElement(item.type, Object.assign({}, item.props, extraProps), children)\n this.WrappedElement = WrappedElement\n return WrappedElement\n },\n render: function () {\n var that = this\n var status = this.state.status\n // if (status === 'initial' || status === 'loading') {\n if (status === 'initial') {\n return Nerv.createElement(\n 'div',\n {\n style: {\n padding: '10px',\n backgroundClip: 'content-box',\n minHeight: '256px',\n height: '100%',\n backgroundColor: '#e3e4e5'\n }\n }\n // status === 'loading' ?\n // Nerv.createElement(\n // 'div',\n // {\n // style: {\n // width: 0,\n // height: 0,\n // overflow: 'hidden'\n // }\n // },\n // that.getWrappedElement()\n // ) : null\n )\n } else {\n // return that.getWrappedElement()\n // 缺点是多了一层 div\n this.cc = this.cc || that.getWrappedElement()\n return Nerv.createElement(\n 'div',\n status === 'loading' ? {\n style: {\n padding: '10px',\n backgroundClip: 'content-box',\n minHeight: '256px',\n height: '100%',\n backgroundColor: '#e3e4e5'\n }\n } : {},\n this.cc\n )\n }\n }\n })\n\n function createTree (tree) {\n tree = tree.filter(function (item) {\n return item.isShow === undefined || item.isShow === true\n })\n\n return tree.map(function (item) {\n var hasChildren = item.childrens && item.childrens.length\n hasChildren && (item.props.children = createTree(item.childrens))\n if (hasChildren) {\n return genComponentElement(item.type, item.props, item.props.content)\n } else {\n return Nerv.createElement(\n LingAtomScrollContext.Consumer,\n {},\n function (context) {\n return Nerv.createElement(\n LazyLoadComponent,\n {\n item: item,\n __context: context\n }\n )\n }\n )\n }\n })\n }\n\n var App = NervCreateClass({\n getInitialState: function () {\n return {\n scrollTop: 0,\n windowHeight: window.innerHeight,\n bodyHeight: document.body.clientHeight\n }\n },\n componentDidMount: function () {\n var that = this\n window.onscroll = throttle(function () {\n var bodyScrollHeight = document.documentElement.scrollTop || document.body.scrollTop\n that.setState({\n scrollTop: bodyScrollHeight\n })\n }, 200)\n window.onresize = function () {\n var windowInnerHeight = window.innerHeight\n if (windowInnerHeight === that.state.windowHeight) return\n that.setState({\n windowHeight: windowInnerHeight\n })\n }\n function onElementHeightChange (elm, callback) {\n var lastHeight = elm.clientHeight\n var newHeight\n (function run () {\n newHeight = elm.clientHeight\n if (lastHeight !== newHeight) {\n callback(newHeight)\n }\n lastHeight = newHeight\n if (elm.onElementHeightChangeTimer) {\n clearTimeout(elm.onElementHeightChangeTimer)\n }\n elm.onElementHeightChangeTimer = setTimeout(run, 200)\n })()\n }\n onElementHeightChange(document.body, function (h) {\n that.setState({ bodyHeight: h })\n })\n },\n render: function () {\n return Nerv.createElement(\n LingAtomScrollContext.Provider,\n {\n value: this.state\n },\n createTree(window.o2PageConfig.data)\n )\n }\n })\n\n Nerv.render(\n Nerv.createElement(App),\n document.querySelector('#app')\n )\n }()\n \n \n\n\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: /html/body \n"}],"unique_index":"xqma7qqbzfrlq2r0zcc","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/271.json b/ElectronJS/tasks/271.json
new file mode 100644
index 0000000..0edb69f
--- /dev/null
+++ b/ElectronJS/tasks/271.json
@@ -0,0 +1 @@
+{"id":271,"name":"弹窗示例","url":"https://easyspider.cn/test_pages/alert_test.html","links":"https://easyspider.cn/test_pages/alert_test.html","create_time":"12/13/2023, 3:51:03 AM","update_time":"12/13/2023, 3:53:47 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://easyspider.cn/test_pages/alert_test.html","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://easyspider.cn/test_pages/alert_test.html","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://easyspider.cn/test_pages/alert_test.html"}],"outputParameters":[],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,6],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://easyspider.cn/test_pages/alert_test.html","links":"https://easyspider.cn/test_pages/alert_test.html","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":-1,"index":2,"parentId":0,"type":0,"option":2,"title":"点击点击我","sequence":[],"isInLoop":false,"position":3,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/button[1]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"maxWaitTime":10,"paras":[],"alertHandleType":2,"allXPaths":["/html/body/button[1]","//button[contains(., '点击我')]","/html/body/button"]}},{"id":-1,"index":3,"parentId":0,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":0,"relative":false,"name":"参数1_文本","desc":"","extractType":0,"relativeXPath":"/html/body[1]/p[eval(\"self.a+1\")]","allXPaths":["//html[1]","//html[contains(., '弹窗示例')]","/html"],"exampleValues":[{"num":0,"value":"\n 弹窗示例\n \n \n function showAlert() {\n alert('你已经点击了按钮!');\n }\n \n\n\n\n#wrapperToolkitIframe{\n position: absolute;\n top:0;\n}\n.toolcannotdrag{\n background-color: navy;\n width: 100%;\n text-align: center;\n font-size: 13px;\n height: 26px !important;\n padding-top: 8px !important;\n color: white;\n}\n\n\n点击我\n\n\n ✖ ✍操作台(点此拖动,左上角调整大小) \n ● 已选中1个元素,您可以:\n 确认采集 取消选择 Path: //html \n"}],"unique_index":"d8of3rzoypelpr7n0qm","iframe":false,"default":"12345","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"alert(eval(\"self.a+2+int('1')\"))","afterJSWaitTime":0,"downloadPic":0}]}},{"id":-1,"index":4,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":"5","code":"self.a = 1\nself.b = \"45\"","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":-1,"index":5,"parentId":0,"type":0,"option":5,"title":"自定义操作","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"codeMode":0,"code":"console.log(\"Field[\"参数1_文本\"]Field[\"参数1_文本\"]\")","waitTime":0,"recordASField":0,"paraType":"text"}},{"id":2,"index":6,"parentId":0,"type":0,"option":2,"title":"点击点击我","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":3,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/button[1]","iframe":false,"wait":2,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"clickWay":0,"newTab":1,"maxWaitTime":10,"paras":[],"alertHandleType":2,"allXPaths":["/html/body/button[1]","//button[contains(., '点击我')]","/html/body/button"]}}]}
\ No newline at end of file
diff --git a/ElectronJS/tasks/272.json b/ElectronJS/tasks/272.json
new file mode 100644
index 0000000..da3b7e0
--- /dev/null
+++ b/ElectronJS/tasks/272.json
@@ -0,0 +1 @@
+{"id":272,"name":"京东全球版-专业的综合网上购物商城","url":"https://www.jd.com","links":"https://www.jd.com","create_time":"12/13/2023, 4:39:20 AM","update_time":"12/13/2023, 4:39:20 AM","version":"0.6.0","saveThreshold":10,"quitWaitTime":60,"environment":0,"maximizeWindow":0,"maxViewLength":15,"recordLog":1,"outputFormat":"xlsx","saveName":"current_time","inputExcel":"","startFromExit":0,"pauseKey":"p","containJudge":false,"desc":"https://www.jd.com","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.jd.com","desc":"要采集的网址列表,多行以\\n分开","type":"text","exampleValue":"https://www.jd.com"},{"id":1,"name":"inputText_1","nodeName":"输入文字","nodeId":2,"desc":"要输入的文本,如京东搜索框输入:电脑","type":"text","exampleValue":"123","value":"123"},{"id":2,"name":"loopText_2","nodeId":3,"nodeName":"循环","desc":"要输入的文本/网址,多行以\\n分开","type":"text","exampleValue":"123124\nt\na\nb\nc","value":"123124\nt\na\nb\nc"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"text","recordASField":1,"exampleValue":"/手机/数码"},{"id":1,"name":"参数2_文本","desc":"","type":"text","recordASField":1,"exampleValue":"/"},{"id":2,"name":"参数3_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"手机"},{"id":3,"name":"参数4_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://shouji.jd.com/"},{"id":4,"name":"参数5_文本","desc":"","type":"text","recordASField":1,"exampleValue":"/"},{"id":5,"name":"参数6_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"数码"},{"id":6,"name":"参数7_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://shuma.jd.com/"},{"id":7,"name":"参数8_文本","desc":"","type":"text","recordASField":1,"exampleValue":"/"},{"id":8,"name":"参数9_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"厨具"},{"id":9,"name":"参数10_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://channel.jd.com/kitchenware.html"},{"id":10,"name":"参数11_文本","desc":"","type":"text","recordASField":1,"exampleValue":"/"},{"id":11,"name":"参数12_链接文本","desc":"","type":"text","recordASField":1,"exampleValue":"工业品"},{"id":12,"name":"参数13_链接地址","desc":"","type":"text","recordASField":1,"exampleValue":"https://pro.jd.com/mall/active/2u2DR1dUiK34csAE3DqmcG8aXvUK/index.html"}],"graph":[{"index":0,"id":0,"parentId":0,"type":-1,"option":0,"title":"root","sequence":[1,2,3],"parameters":{"history":1,"tabIndex":0,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0},"isInLoop":false},{"id":1,"index":1,"parentId":0,"type":0,"option":1,"title":"打开网页","sequence":[],"isInLoop":false,"position":0,"parameters":{"useLoop":false,"xpath":"","wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"url":"https://www.jd.com","links":"https://www.jd.com","maxWaitTime":10,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"cookies":""}},{"id":2,"index":2,"parentId":0,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":false,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"key\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"123","index":0,"allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/input[1]","//input[contains(., '')]","id(\"key\")","//INPUT[@class='text']","/html/body/div[last()-6]/div/div[last()-2]/div/input"]}},{"id":3,"index":3,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[4,5,7],"isInLoop":false,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"//*[@id=\"key\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":3,"pathList":"","textList":"123124\nt\na\nb\nc","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/input[1]","//input[contains(., '')]","id(\"key\")","//INPUT[@class='text']","/html/body/div[last()-6]/div/div[last()-2]/div/input"]}},{"id":4,"index":4,"parentId":3,"type":0,"option":4,"title":"输入文字","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":true,"xpath":"//*[@id=\"key\"]","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"value":"123124","index":0,"allXPaths":["/html/body/div[4]/div[1]/div[2]/div[1]/input[1]","//input[contains(., '')]","id(\"key\")","//INPUT[@class='text']","/html/body/div[last()-6]/div/div[last()-2]/div/input"]}},{"id":5,"index":5,"parentId":3,"type":1,"option":8,"title":"循环采集数据","sequence":[6],"isInLoop":true,"position":1,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]","//div[contains(., '/手机/数码')]","//DIV[@class='LeftSide_menu_item__SBMWC LeftSide_text_space__2UhbG ']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]"]}},{"id":7,"index":6,"parentId":5,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":0,"relative":true,"name":"参数1_文本","desc":"","extractType":0,"relativeXPath":"","allXPaths":"","exampleValues":[{"num":0,"value":"/手机/数码"}],"unique_index":"latwwzlw98elq2t2bcm","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}},{"id":6,"index":7,"parentId":3,"type":1,"option":8,"title":"循环采集数据","sequence":[8],"isInLoop":true,"position":2,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"scrollType":0,"scrollCount":1,"scrollWaitTime":1,"loopType":1,"pathList":"","code":"","waitTime":0,"exitCount":0,"exitElement":"//body","historyWait":2,"breakMode":0,"breakCode":"","breakCodeWaitTime":0,"allXPaths":["/html/body/div[5]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[1]","//div[contains(., '/手机/数码')]","//DIV[@class='LeftSide_menu_item__SBMWC LeftSide_text_space__2UhbG ']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]"]}},{"id":8,"index":8,"parentId":6,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":4,"tabIndex":-1,"useLoop":false,"xpath":"","iframe":false,"wait":0,"waitType":0,"beforeJS":"","beforeJSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"waitElement":"","waitElementTime":10,"waitElementIframeIndex":0,"clear":0,"newLine":1,"paras":[{"nodeType":0,"contentType":1,"relative":true,"name":"参数2_文本","desc":"","relativeXPath":"/span[1]","allXPaths":["/span[1]","//span[contains(., '/')]","//SPAN[@class='LeftSide_cate_menu_line__vzQu9 LeftSide_fore0__r2Yrl']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/span[last()-1]"],"exampleValues":[{"num":0,"value":"/"}],"unique_index":"/span[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数3_链接文本","desc":"","relativeXPath":"/a[1]","allXPaths":["/a[1]","//a[contains(., '手机')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/a[last()-1]"],"exampleValues":[{"num":0,"value":"手机"}],"unique_index":"/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数4_链接地址","desc":"","relativeXPath":"/a[1]","allXPaths":["/a[1]","//a[contains(., '手机')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/a[last()-1]"],"exampleValues":[{"num":0,"value":"https://shouji.jd.com/"}],"unique_index":"/a[1]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数5_文本","desc":"","relativeXPath":"/span[2]","allXPaths":["/span[2]","//span[contains(., '/')]","//SPAN[@class='LeftSide_cate_menu_line__vzQu9 undefined']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/span"],"exampleValues":[{"num":0,"value":"/"}],"unique_index":"/span[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数6_链接文本","desc":"","relativeXPath":"/a[2]","allXPaths":["/a[2]","//a[contains(., '数码')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/a"],"exampleValues":[{"num":0,"value":"数码"}],"unique_index":"/a[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数7_链接地址","desc":"","relativeXPath":"/a[2]","allXPaths":["/a[2]","//a[contains(., '数码')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-12]/a"],"exampleValues":[{"num":0,"value":"https://shuma.jd.com/"}],"unique_index":"/a[2]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数8_文本","desc":"","relativeXPath":"/span[3]","allXPaths":["/span[3]","//span[contains(., '/')]","//SPAN[@class='LeftSide_cate_menu_line__vzQu9 undefined']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-9]/span"],"exampleValues":[{"num":3,"value":"/"}],"unique_index":"/span[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数9_链接文本","desc":"","relativeXPath":"/a[3]","allXPaths":["/a[3]","//a[contains(., '厨具')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-9]/a"],"exampleValues":[{"num":3,"value":"厨具"}],"unique_index":"/a[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数10_链接地址","desc":"","relativeXPath":"/a[3]","allXPaths":["/a[3]","//a[contains(., '厨具')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-9]/a"],"exampleValues":[{"num":3,"value":"https://channel.jd.com/kitchenware.html"}],"unique_index":"/a[3]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":0,"contentType":1,"relative":true,"name":"参数11_文本","desc":"","relativeXPath":"/span[4]","allXPaths":["/span[4]","//span[contains(., '/')]","//SPAN[@class='LeftSide_cate_menu_line__vzQu9 undefined']","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-8]/span"],"exampleValues":[{"num":4,"value":"/"}],"unique_index":"/span[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":1,"contentType":0,"relative":true,"name":"参数12_链接文本","desc":"","relativeXPath":"/a[4]","allXPaths":["/a[4]","//a[contains(., '工业品')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-8]/a"],"exampleValues":[{"num":4,"value":"工业品"}],"unique_index":"/a[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0},{"nodeType":2,"contentType":0,"relative":true,"name":"参数13_链接地址","desc":"","relativeXPath":"/a[4]","allXPaths":["/a[4]","//a[contains(., '工业品')]","/html/body/div[last()-5]/div/div[last()-4]/div/div[last()-2]/div/div/div/div[last()-1]/div[last()-8]/a"],"exampleValues":[{"num":4,"value":"https://pro.jd.com/mall/active/2u2DR1dUiK34csAE3DqmcG8aXvUK/index.html"}],"unique_index":"/a[4]","iframe":false,"default":"","paraType":"text","recordASField":1,"beforeJS":"","beforeJSWaitTime":0,"JS":"","JSWaitTime":0,"afterJS":"","afterJSWaitTime":0,"downloadPic":0}]}}]}
\ No newline at end of file
diff --git a/ExecuteStage/.vscode/launch.json b/ExecuteStage/.vscode/launch.json
index deedd8e..39df455 100644
--- a/ExecuteStage/.vscode/launch.json
+++ b/ExecuteStage/.vscode/launch.json
@@ -12,7 +12,7 @@
"justMyCode": false,
// "args": ["--ids", "[7]", "--read_type", "remote", "--headless", "0"]
// "args": ["--ids", "[9]", "--read_type", "remote", "--headless", "0", "--saved_file_name", "YOUTUBE"]
- "args": ["--ids", "[20]", "--headless", "0", "--user_data", "0", "--keyboard", "0",
+ "args": ["--ids", "[38]", "--headless", "0", "--user_data", "0", "--keyboard", "0",
"--read_type", "remote"]
// "args": "--ids '[97]' --user_data 1 --server_address http://localhost:8074 --config_folder '/Users/naibo/Documents/EasySpider/ElectronJS/' --headless 0 --read_type remote --config_file_name config.json --saved_file_name"
}
diff --git a/ExecuteStage/easyspider_executestage.py b/ExecuteStage/easyspider_executestage.py
index 9d1fd1e..5e3e308 100644
--- a/ExecuteStage/easyspider_executestage.py
+++ b/ExecuteStage/easyspider_executestage.py
@@ -121,7 +121,7 @@ class BrowserThread(Thread):
"will start from the last step, before we already collected", self.startSteps, " items.")
else:
self.print_and_log("此模式下,任务ID", self.id,
- "将从头开始执行,如果需要从上次退出的步骤开始执行,请在保存任务时设置是否从上次保存位置开始执行为“是”。")
+ "将从头F开始执行,如果需要从上次退出的步骤开始执行,请在保存任务时设置是否从上次保存位置开始执行为“是”。")
self.print_and_log("In this mode, task ID", self.id,
"will start from the beginning, if you want to start from the last step, please set the option 'start from the last step' to 'yes' when saving the task.")
stealth_path = driver_path[:driver_path.find(
@@ -325,11 +325,17 @@ class BrowserThread(Thread):
# 如果(不)固定元素列表循环中只有一个提取数据操作,且提取数据操作的提取内容为元素截图,那么可以快速提取
if len(node["sequence"]) == 1 and self.procedure[node["sequence"][0]]["option"] == 3 and (int(node["parameters"]["loopType"]) == 1 or int(node["parameters"]["loopType"]) == 2):
paras = self.procedure[node["sequence"][0]]["parameters"]["paras"]
- waitElement = self.procedure[node["sequence"][0]]["parameters"]["waitElement"]
- node["parameters"]["quickExtractable"] = True # 先假设可以快速提取
+ try:
+ waitElement = self.procedure[node["sequence"][0]]["parameters"]["waitElement"]
+ except:
+ waitElement = ""
+ if node["parameters"]["iframe"]:
+ node["parameters"]["quickExtractable"] = False # 如果是iframe,那么不可以快速提取
+ else:
+ node["parameters"]["quickExtractable"] = True # 先假设可以快速提取
for para in paras:
optimizable = detect_optimizable(para, ignoreWaitElement=False, waitElement=waitElement)
- if para["iframe"]: # 如果是iframe,那么不可以快速提取
+ if para["iframe"] and not para["relative"]: # 如果是iframe,那么不可以快速提取
optimizable = False
if not optimizable: # 如果有一个不满足优化条件,那么就不能快速提取
node["parameters"]["quickExtractable"] = False
@@ -911,7 +917,6 @@ class BrowserThread(Thread):
self.event.wait() # 等待事件结束
# 对判断条件的处理
-
def judgeExecute(self, node, loopElement, clickPath="", index=0):
executeBranchId = 0 # 要执行的BranchId
for i in node["sequence"]:
@@ -1513,11 +1518,19 @@ class BrowserThread(Thread):
click_way = int(para["clickWay"])
except:
click_way = 0
+ try:
+ newTab = int(para["newTab"])
+ except:
+ newTab = 1
try:
if click_way == 0: # 用selenium的点击方法
try:
actions = ActionChains(self.browser) # 实例化一个action对象
- actions.click(element).perform()
+ if newTab == 1: # 在新标签页打开
+ # Ctrl + Click
+ actions.key_down(Keys.CONTROL).click(element).key_up(Keys.CONTROL).perform()
+ else:
+ actions.click(element).perform()
except Exception as e:
self.browser.execute_script("arguments[0].scrollIntoView();", element)
try:
diff --git a/Extension/manifest_v3/src/content-scripts/global.js b/Extension/manifest_v3/src/content-scripts/global.js
index 4bfe3e8..88cc3be 100644
--- a/Extension/manifest_v3/src/content-scripts/global.js
+++ b/Extension/manifest_v3/src/content-scripts/global.js
@@ -22,6 +22,8 @@ export var global = {
iframe: false,
};
+
+
export function isInIframe() {
try {
return window.self !== window.parent;
@@ -261,6 +263,13 @@ export function clearParameters(deal = true) //清空参数列表
global.app._data.selectStatus = false;
}
+export function LANG(zh, en) {
+ if (global.lang == "zh") {
+ return zh;
+ } else {
+ return en;
+ }
+}
function parameterName(value){
if (global.lang == 'zh'){
return value;
diff --git a/Extension/manifest_v3/src/content-scripts/messageInteraction.js b/Extension/manifest_v3/src/content-scripts/messageInteraction.js
index 679c585..ada912b 100644
--- a/Extension/manifest_v3/src/content-scripts/messageInteraction.js
+++ b/Extension/manifest_v3/src/content-scripts/messageInteraction.js
@@ -1,6 +1,7 @@
//实现与后台和流程图部分的交互
-import {getElementXPaths, global, readXPath, isInIframe, clearEl} from "./global.js";
+import {getElementXPaths, global, readXPath, isInIframe, clearEl, LANG} from "./global.js";
+import {trial, createNotification} from "./trail.js";
global.ws = new WebSocket("ws://localhost:8084");
global.ws.onopen = function () {
@@ -24,26 +25,30 @@ global.ws.onmessage = function (evt) {
createNotification(LANG(evt["msg_zh"], evt["msg_en"]), evt["level"]);
} else if (evt["type"] == "cancelSelection") { //试运行点击元素后取消选中元素
clearEl();
+ } else if (evt["type"] == "trial"){
+ trial(evt);
}
};
-function LANG(zh, en) {
- if (global.lang == "zh") {
- return zh;
- } else {
- return en;
- }
-}
-export function input(value) {
+
+export function input(value, batch=false) {
+ let type = "inputText";
+ let useLoop = false;
+ if (batch) {
+ type = "batchInputText";
+ useLoop = true;
+ }
let message = {
- "type": "inputText",
+ "type": type,
"history": history.length, //记录history的长度
"tabIndex": -1,
"xpath": readXPath(global.nodeList[0]["node"], 0),
"allXPaths": getElementXPaths(global.nodeList[0]["node"]),
"iframe": global.iframe,
"value": value,
+ "useLoop": useLoop, //是否使用循环内元素
+ "loopType": 3, //循环类型,3为文本列表
};
window.stop();
let message_action = {
@@ -171,63 +176,6 @@ export function collectSingle() {
// createNotification(LANG("采集成功", "Collect successfully"), "success");
}
-function createNotification(text, type="info") {
- // 创建通知元素
- let notification = document.createElement('div');
- notification.className = 'notification_of_easyspider'; // 使用 class 方便后续添加样式
- notification.setAttribute("data-timestamp", new Date().getTime()); // 用于清除通知
- // 设置通知文本
- notification.innerText = text;
-
- // 定义与添加样式
- let cssText = `
- position: fixed;
- bottom: 20px; /* 距底部20px */
- right: -320px; /* 初始位置在屏幕右侧,假设通知框宽度320px */
- min-width: 300px;
- padding: 10px 20px;
- color: white;
- z-index: 2147483641;
- border-radius: 4px;
- text-align: center;
- font-size: 15px;
- box-shadow: 0 2px 6px rgba(0,0,0,0.3);
- transition: right 0.5s ease-in-out; /* 动画效果 */
- `;
- notification.style.cssText = cssText;
-
- if (type === "success") {
- notification.style.backgroundColor = 'rgb(103, 194, 58)';
- } else if (type === "info") {
- notification.style.backgroundColor = '#00a8ff';
- } else if (type === "warning") {
- notification.style.backgroundColor = 'rgb(230, 162, 60)';
- } else if (type === "error") {
- notification.style.backgroundColor = '#ff6b6b';
- }
-
- // 将通知添加到页面中
- document.body.appendChild(notification);
-
- // 触发动画,通知从右向左滑入
- setTimeout(function () {
- notification.style.right = '20px'; // 调整距离左边的位置
- }, 100);
- // let removeXPathText = text.split("是否正确:")[0].split("is correct:")[0];
- // let timeoutInterval = 1500 * removeXPathText.length / 5;
- let timeoutInterval = 1500 * text.length / 5;
- // 设置退出动画,通知从右向左滑出
- setTimeout(function () {
- notification.style.right = '-320px'; // 向左退出
- // 确定动画结束后移除通知
- notification.addEventListener('transitionend', function () {
- if (notification.parentNode === document.body) {
- document.body.removeChild(notification); // 避免移除已经不存在的元素
- }
- });
- }, timeoutInterval + 500); // 通知停留时间加上动画时间
-}
-
setInterval(function () {
let notifications = document.getElementsByClassName("notification_of_easyspider");
for (let i = 0; i < notifications.length; i++) {
diff --git a/Extension/manifest_v3/src/content-scripts/toolkit.vue b/Extension/manifest_v3/src/content-scripts/toolkit.vue
index b7cfe57..b8ce327 100644
--- a/Extension/manifest_v3/src/content-scripts/toolkit.vue
+++ b/Extension/manifest_v3/src/content-scripts/toolkit.vue
@@ -36,7 +36,8 @@
v-on:mousedown="selectDescendents">选中子元素 ☺
-
+
+
@@ -170,10 +171,10 @@
-
● Mouse move to smiling face ☺ to see operation help.
-
● When your mouse moves to the element, please right-click your
+
● Mouse move to smiling face ☺ to see operation help.
+
● When your mouse moves to the element, please right-click your
mouse button or press F7 on the keyboard to select it.
-
● If this toolbox blocks the page element, you can click the × button in the
+
● If this toolbox blocks the page element, you can click the × button in the
lower right corner of this toolbox to close it.
● When clicked with the left mouse button, the page will also respond, but this click operation will not be recorded in the task flow. Similarly, if you want to input in a text box but do not want the action to be recorded , you can move the mouse to the text box and press F9 on the keyboard to input.
● If you accidentally left-click on an element and cause the page to jump, simply go back or switch back to the tab.
@@ -193,7 +194,8 @@
-
Input Text
+
Input Text
+
@@ -362,6 +364,7 @@ export default {
el: '#realcontent',
data: {
lang: global.lang,
+ batch: false, //是否为批量输入模式
option: 0,
list: {nl: global.nodeList, opp: global.outputParameters},
valTable: [], // 用来存储转换后的参数列表
@@ -578,7 +581,8 @@ export default {
// global.nodeList[0]["node"].click(); //点击元素
clearEl();
},
- setInput: function () { //输入文字
+ setInput: function (batch=false) { //输入文字
+ this.batch = batch;
this.page = 1;
this.$nextTick(function () { //下一时刻获得焦点
document.getElementById("WTextBox").focus();
@@ -591,7 +595,7 @@ export default {
// } else{
// global.nodeList[0]["node"].setAttribute("value", ""); // 先设置为空,再设置输入 box内容
// }
- input(this.text); // 设置输入
+ input(this.text, this.batch); // 设置输入
this.text = "";
clearEl();
},
diff --git a/Extension/manifest_v3/src/content-scripts/trail.js b/Extension/manifest_v3/src/content-scripts/trail.js
new file mode 100644
index 0000000..4d9f3da
--- /dev/null
+++ b/Extension/manifest_v3/src/content-scripts/trail.js
@@ -0,0 +1,150 @@
+import {LANG} from "./global.js";
+
+//试运行操作标记
+export function trial(evt) {
+ let node = JSON.parse(evt["message"]["message"]["node"]);
+ let parentNode = JSON.parse(evt["message"]["message"]["parentNode"]);
+ let parameters = node.parameters;
+ let type = evt["message"]["message"]["type"];
+ console.log("parameters", parameters);
+ if (type == 0) {
+ let option = node.option;
+ console.log("option", option);
+ if (option == 2 || option == 4 || option == 6 || option == 7) {
+ let xpath = parameters.xpath;
+ if (parameters.useLoop && option != 4 && option != 6) {
+ let parentXPath = parentNode.parameters.xpath;
+ xpath = parentXPath + xpath;
+ }
+ let element = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
+ // if (element != null) {
+ // //移动到元素位置
+ // element.scrollIntoView({block: "center", inline: "center"});
+ // }
+ } else if (option == 10) { //条件分支
+ let condition = parameters.class;
+ let result = 0;
+ let additionalInfo = "";
+ if (condition == 0) { //无条件
+ result = 1;
+ } else if (condition == 1) { //当前页面包含文本
+ let value = parameters.value;
+ let element = document.getElementsByTagName("body")[0];
+ let bodyText = element.innerText;
+ let outcome = bodyText.indexOf(value) >= 0;
+ if (outcome) {
+ result = 1;
+ }
+ } else if (condition == 2) { //当前页面包含元素,xpath
+ let xpath = parameters.value;
+ let element = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
+ if (element != null) {
+ result = 1;
+ }
+ } else if (condition == 3) { //当前循环项包含文本,xpath
+ let value = parameters.value;
+ let xpath = parentNode.parameters.xpath;
+ let element = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
+ if (element != null) {
+ let elementText = element.innerText;
+ let outcome = elementText.indexOf(value) >= 0;
+ if (outcome) {
+ result = 1;
+ }
+ }
+ if(result == 0){
+ additionalInfo = LANG(",注意只会检索第一个匹配到的循环项", ", note that only the first matching loop item will be retrieved");
+ }
+ } else if (condition == 4) { //当前循环项包含元素,xpath
+ let xpath = parentNode.parameters.xpath;
+ let value = parameters.value;
+ // full_path = "(" + parentPath + ")" + \
+ // "[" + str(index + 1) + "]" + \
+ // relativeXPath + content_type
+ xpath = "(" + xpath + ")" + "[" + "1" + "]" + value;
+ let element = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
+ if (element != null) {
+ result = 1;
+ }
+ if(result == 0){
+ additionalInfo = LANG(",注意只会检索第一个匹配到的循环项", ", note that only the first matching loop item will be retrieved");
+ }
+ } else if (condition == 5 || condition == 7) { //从主程序传入的结果
+ result = evt["message"]["message"]["result"];
+ if(condition == 7 && result == 0){
+ additionalInfo = LANG(",注意只会检索第一个匹配到的循环项", ", note that only the first matching loop item will be retrieved");
+ }
+ } else {
+ result = 2;
+ }
+
+ if (result == 0) {
+ createNotification(LANG("当前页面下,条件分支“" + node.title + "”的条件未满足" + additionalInfo, "The condition of the conditional branch: " + node.title + " is not met on the current page" + additionalInfo), "warning");
+ } else if (result == 1) {
+ createNotification(LANG("当前页面下,条件分支“" + node.title + "”的条件已满足" + additionalInfo, "The condition of the conditional branch: " + node.title + " is met on the current page" + additionalInfo), "success");
+ } else if (result == 2) {
+ createNotification(LANG("不支持此条件判断类型的动态调试,请在任务正式调用阶段测试是否有效。", "Dynamic debugging of this condition judgment type is not supported. Please test whether it is valid in the formal call stage."), "info");
+ }
+ }
+
+ }
+
+}
+
+export function createNotification(text, type = "info") {
+ // 创建通知元素
+ let notification = document.createElement('div');
+ notification.className = 'notification_of_easyspider'; // 使用 class 方便后续添加样式
+ notification.setAttribute("data-timestamp", new Date().getTime()); // 用于清除通知
+ // 设置通知文本
+ notification.innerText = text;
+
+ // 定义与添加样式
+ let cssText = `
+ position: fixed;
+ bottom: 20px; /* 距底部20px */
+ right: -320px; /* 初始位置在屏幕右侧,假设通知框宽度320px */
+ min-width: 300px;
+ padding: 10px 20px;
+ color: white;
+ z-index: 2147483641;
+ border-radius: 4px;
+ text-align: center;
+ font-size: 15px;
+ box-shadow: 0 2px 6px rgba(0,0,0,0.3);
+ transition: right 0.5s ease-in-out; /* 动画效果 */
+ `;
+ notification.style.cssText = cssText;
+
+ if (type === "success") {
+ notification.style.backgroundColor = 'rgb(103, 194, 58)';
+ } else if (type === "info") {
+ notification.style.backgroundColor = '#00a8ff';
+ } else if (type === "warning") {
+ notification.style.backgroundColor = 'rgb(230, 162, 60)';
+ } else if (type === "error") {
+ notification.style.backgroundColor = '#ff6b6b';
+ notification.style.bottom = '70px';
+ }
+
+ // 将通知添加到页面中
+ document.body.appendChild(notification);
+
+ // 触发动画,通知从右向左滑入
+ setTimeout(function () {
+ notification.style.right = '20px'; // 调整距离左边的位置
+ }, 100);
+ // let removeXPathText = text.split("是否正确:")[0].split("is correct:")[0];
+ // let timeoutInterval = 1500 * removeXPathText.length / 5;
+ let timeoutInterval = 1500 * text.length / 5;
+ // 设置退出动画,通知从右向左滑出
+ setTimeout(function () {
+ notification.style.right = '-320px'; // 向左退出
+ // 确定动画结束后移除通知
+ notification.addEventListener('transitionend', function () {
+ if (notification.parentNode === document.body) {
+ document.body.removeChild(notification); // 避免移除已经不存在的元素
+ }
+ });
+ }, timeoutInterval + 500); // 通知停留时间加上动画时间
+}
\ No newline at end of file
diff --git a/Extension/manifest_v3/src/style/toolkit.css b/Extension/manifest_v3/src/style/toolkit.css
index f731273..a0f91f3 100644
--- a/Extension/manifest_v3/src/style/toolkit.css
+++ b/Extension/manifest_v3/src/style/toolkit.css
@@ -164,7 +164,8 @@
position: sticky;
top: 0px;
margin-bottom: 0px;
- background-color: azure;
+ /*background-color: azure;*/
+ background-color: aliceblue;
z-index: 1000;
}