mirror of
https://github.com/NaiboWang/EasySpider.git
synced 2025-04-20 22:15:08 +08:00
Input Function Update and extension bug fix
This commit is contained in:
parent
bbccc26ce7
commit
8a404eecf4
Binary file not shown.
Binary file not shown.
@ -1 +1 @@
|
|||||||
{"webserver_address":"http://localhost","webserver_port":8074,"user_data_folder":"./user_data","absolute_user_data_folder":"C:\\Users\\Naibo\\Desktop\\EasySpider\\ElectronJS\\user_data"}
|
{"webserver_address":"http://localhost","webserver_port":8074,"user_data_folder":"./user_data","absolute_user_data_folder":"D:\\Documents\\Projects\\EasySpider\\ElectronJS\\user_data"}
|
@ -46,6 +46,9 @@ let language = "en";
|
|||||||
let driver = null;
|
let driver = null;
|
||||||
let mainWindow = null;
|
let mainWindow = null;
|
||||||
let flowchart_window = null;
|
let flowchart_window = null;
|
||||||
|
let current_handle = null;
|
||||||
|
let old_handles = [];
|
||||||
|
let handle_pairs = {};
|
||||||
|
|
||||||
// var ffi = require('ffi-napi');
|
// var ffi = require('ffi-napi');
|
||||||
// var libm = ffi.Library('libm', {
|
// var libm = ffi.Library('libm', {
|
||||||
@ -92,7 +95,7 @@ function createWindow() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function beginInvoke(msg) {
|
async function beginInvoke(msg) {
|
||||||
if (msg.type == 1) {
|
if (msg.type == 1) {
|
||||||
if (msg.message.id != -1) {
|
if (msg.message.id != -1) {
|
||||||
let url = "";
|
let url = "";
|
||||||
@ -124,7 +127,53 @@ function beginInvoke(msg) {
|
|||||||
//keyboard
|
//keyboard
|
||||||
// const robot = require("@jitsi/robotjs");
|
// const robot = require("@jitsi/robotjs");
|
||||||
let keyInfo = msg.message.keyboardStr;
|
let keyInfo = msg.message.keyboardStr;
|
||||||
driver.findElement(By.xpath(msg.message.xpath)).sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
|
let handles = await driver.getAllWindowHandles();
|
||||||
|
console.log("handles", handles);
|
||||||
|
let exit = false;
|
||||||
|
let content_handle = handle_pairs[msg.message.id];
|
||||||
|
console.log(msg.message.id, content_handle);
|
||||||
|
let order = [...handles.filter(handle => handle != current_handle && handle != content_handle), current_handle, content_handle]; //搜索顺序
|
||||||
|
let len = order.length;
|
||||||
|
while (true) {
|
||||||
|
// console.log("handles");
|
||||||
|
try{
|
||||||
|
let h = order[len - 1];
|
||||||
|
console.log("current_handle", current_handle);
|
||||||
|
if(h != null && handles.includes(h)){
|
||||||
|
await driver.switchTo().window(h);
|
||||||
|
current_handle = h;
|
||||||
|
console.log("switch to handle: ", h);
|
||||||
|
}
|
||||||
|
// await driver.executeScript("window.stop();");
|
||||||
|
// console.log("executeScript");
|
||||||
|
let element = await driver.findElement(By.xpath(msg.message.xpath));
|
||||||
|
console.log("Find Element at handle: ", current_handle);
|
||||||
|
await element.sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
|
||||||
|
console.log("send key");
|
||||||
|
break;
|
||||||
|
} catch (error) {
|
||||||
|
console.log("len", len);
|
||||||
|
len = len - 1;
|
||||||
|
if (len == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// .then(function (element) {
|
||||||
|
// console.log("element", element, handles);
|
||||||
|
// element.sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
|
||||||
|
// exit = true;
|
||||||
|
// }, function (error) {
|
||||||
|
// console.log("error", error);
|
||||||
|
// len = len - 1;
|
||||||
|
// if (len == 0) {
|
||||||
|
// exit = true;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
// let handles = driver.getAllWindowHandles();
|
||||||
|
// driver.switchTo().window(handles[handles.length - 1]);
|
||||||
|
// driver.findElement(By.xpath(msg.message.xpath)).sendKeys(Key.HOME, Key.chord(Key.SHIFT, Key.END), keyInfo);
|
||||||
// robot.keyTap("a", "control");
|
// robot.keyTap("a", "control");
|
||||||
// robot.keyTap("backspace");
|
// robot.keyTap("backspace");
|
||||||
// robot.typeString(keyInfo);
|
// robot.typeString(keyInfo);
|
||||||
@ -134,8 +183,18 @@ function beginInvoke(msg) {
|
|||||||
try {
|
try {
|
||||||
if (msg.from == 0) {
|
if (msg.from == 0) {
|
||||||
socket_flowchart.send(msg.message.pipe); //直接把消息转接
|
socket_flowchart.send(msg.message.pipe); //直接把消息转接
|
||||||
|
let message = JSON.parse(msg.message.pipe);
|
||||||
|
let type = message.type;
|
||||||
|
if(type.indexOf("Click")>=0){
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 2000)); //等两秒
|
||||||
|
let handles = await driver.getAllWindowHandles();
|
||||||
|
if(arrayDifference(handles, old_handles).length > 0){
|
||||||
|
old_handles = handles;
|
||||||
|
current_handle = handles[handles.length - 1];
|
||||||
|
console.log("New tab opened, change current_handle to: ", current_handle);
|
||||||
}
|
}
|
||||||
else {
|
}
|
||||||
|
} else {
|
||||||
socket_window.send(msg.message.pipe);
|
socket_window.send(msg.message.pipe);
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@ -172,26 +231,38 @@ const WebSocket = require('ws');
|
|||||||
let socket_window = null;
|
let socket_window = null;
|
||||||
let socket_start = null;
|
let socket_start = null;
|
||||||
let socket_flowchart = null;
|
let socket_flowchart = null;
|
||||||
var wss = new WebSocket.Server({ port: websocket_port });
|
let wss = new WebSocket.Server({port: websocket_port});
|
||||||
wss.on('connection', function (ws) {
|
wss.on('connection', function (ws) {
|
||||||
ws.on('message', function (message, isBinary) {
|
ws.on('message', async function (message, isBinary) {
|
||||||
let msg = JSON.parse(message.toString());
|
let msg = JSON.parse(message.toString());
|
||||||
// console.log(msg, msg.type, msg.message);
|
// console.log(msg, msg.type, msg.message);
|
||||||
if (msg.type == 0) {
|
if (msg.type == 0) {
|
||||||
if (msg.message.id == 0) {
|
if (msg.message.id == 0) {
|
||||||
socket_window = ws;
|
socket_window = ws;
|
||||||
console.log("set socket_window")
|
console.log("set socket_window")
|
||||||
}
|
} else if (msg.message.id == 1) {
|
||||||
else if (msg.message.id == 1) {
|
|
||||||
socket_start = ws;
|
socket_start = ws;
|
||||||
console.log("set socket_start")
|
console.log("set socket_start")
|
||||||
}
|
} else if (msg.message.id == 2) {
|
||||||
else if (msg.message.id == 2) {
|
|
||||||
socket_flowchart = ws;
|
socket_flowchart = ws;
|
||||||
console.log("set socket_flowchart");
|
console.log("set socket_flowchart");
|
||||||
}
|
|
||||||
} else{
|
} else{
|
||||||
beginInvoke(msg);
|
await new Promise(resolve => setTimeout(resolve, 2300));
|
||||||
|
handle_pairs[msg.message.id] = current_handle;
|
||||||
|
console.log("Set handle_pair for id: ", msg.message.id, " to ", current_handle);
|
||||||
|
// console.log("handle_pairs: ", handle_pairs);
|
||||||
|
}
|
||||||
|
} else if (msg.type == 10) {
|
||||||
|
let leave_handle = handle_pairs[msg.message.id];
|
||||||
|
if (leave_handle!=null && leave_handle!=undefined && leave_handle!="")
|
||||||
|
{
|
||||||
|
await driver.switchTo().window(leave_handle);
|
||||||
|
console.log("Switch to handle: ", leave_handle);
|
||||||
|
current_handle = leave_handle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
await beginInvoke(msg);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -201,6 +272,7 @@ console.log(process.platform);
|
|||||||
async function runBrowser(lang = "en", user_data_folder = '') {
|
async function runBrowser(lang = "en", user_data_folder = '') {
|
||||||
const serviceBuilder = new ServiceBuilder(driverPath);
|
const serviceBuilder = new ServiceBuilder(driverPath);
|
||||||
let options = new chrome.Options();
|
let options = new chrome.Options();
|
||||||
|
options.addArguments('--disable-blink-features=AutomationControlled');
|
||||||
language = lang;
|
language = lang;
|
||||||
if (lang == "en") {
|
if (lang == "en") {
|
||||||
options.addExtensions(path.join(__dirname, "EasySpider_en.crx"));
|
options.addExtensions(path.join(__dirname, "EasySpider_en.crx"));
|
||||||
@ -219,6 +291,8 @@ async function runBrowser(lang="en", user_data_folder='') {
|
|||||||
.setChromeOptions(options)
|
.setChromeOptions(options)
|
||||||
.setChromeService(serviceBuilder)
|
.setChromeService(serviceBuilder)
|
||||||
.build();
|
.build();
|
||||||
|
await driver.manage().setTimeouts({implicit: 10000, pageLoad: 10000, script: 10000});
|
||||||
|
await driver.executeScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
|
||||||
const cdpConnection = await driver.createCDPConnection("page");
|
const cdpConnection = await driver.createCDPConnection("page");
|
||||||
let stealth_path = path.join(__dirname, "stealth.min.js");
|
let stealth_path = path.join(__dirname, "stealth.min.js");
|
||||||
let stealth = fs.readFileSync(stealth_path, 'utf8');
|
let stealth = fs.readFileSync(stealth_path, 'utf8');
|
||||||
@ -227,6 +301,8 @@ async function runBrowser(lang="en", user_data_folder='') {
|
|||||||
});
|
});
|
||||||
try {
|
try {
|
||||||
await driver.get(server_address + "/taskGrid/taskList.html?wsport=" + websocket_port + "&backEndAddressServiceWrapper=" + server_address + "&lang=" + lang);
|
await driver.get(server_address + "/taskGrid/taskList.html?wsport=" + websocket_port + "&backEndAddressServiceWrapper=" + server_address + "&lang=" + lang);
|
||||||
|
old_handles = await driver.getAllWindowHandles();
|
||||||
|
current_handle = old_handles[old_handles.length - 1];
|
||||||
} finally {
|
} finally {
|
||||||
// await driver.quit(); // 退出浏览器
|
// await driver.quit(); // 退出浏览器
|
||||||
}
|
}
|
||||||
@ -308,3 +384,8 @@ app.on('window-all-closed', function () {
|
|||||||
|
|
||||||
// In this file you can include the rest of your app's specific main process
|
// In this file you can include the rest of your app's specific main process
|
||||||
// code. You can also put them in separate files and require them here.
|
// code. You can also put them in separate files and require them here.
|
||||||
|
|
||||||
|
|
||||||
|
function arrayDifference(arr1, arr2) {
|
||||||
|
return arr1.filter(item => !arr2.includes(item));
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
@ -25,9 +25,17 @@ chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
|
|||||||
} else if (request.type == 2) {
|
} else if (request.type == 2) {
|
||||||
let message = {
|
let message = {
|
||||||
type: 2, //消息类型,2代表键盘输入
|
type: 2, //消息类型,2代表键盘输入
|
||||||
message: { "keyboardStr": request.value, "xpath": request.xpath } // {}全选{BS}退格
|
message: { "keyboardStr": request.value, "xpath": request.xpath, "id": request.id } // {}全选{BS}退格
|
||||||
};
|
};
|
||||||
ws.send(JSON.stringify(message));
|
ws.send(JSON.stringify(message));
|
||||||
|
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
|
||||||
|
// 获取当前选项卡的 ID
|
||||||
|
const tabId = tabs[0].id;
|
||||||
|
const url = tabs[0].url;
|
||||||
|
|
||||||
|
// 停止当前页面的加载
|
||||||
|
chrome.tabs.executeScript(tabId, {code: 'window.stop();'});
|
||||||
|
});
|
||||||
} else if (request.type == 3) {
|
} else if (request.type == 3) {
|
||||||
let tmsg = request.msg;
|
let tmsg = request.msg;
|
||||||
tmsg.tabIndex = nowTabIndex; //赋值当前tab的id
|
tmsg.tabIndex = nowTabIndex; //赋值当前tab的id
|
||||||
|
@ -17,8 +17,22 @@ export var global = {
|
|||||||
defaultbgColor: 'rgba(221,221,255,0.8)',
|
defaultbgColor: 'rgba(221,221,255,0.8)',
|
||||||
boxShadowColor: "blue 0px 0px 5px",
|
boxShadowColor: "blue 0px 0px 5px",
|
||||||
lang: config.language,
|
lang: config.language,
|
||||||
|
id: "C" + Math.floor(Math.random() * (99999999)).toString(),
|
||||||
|
ws: null,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
global.ws = new WebSocket("ws://localhost:8084");
|
||||||
|
global.ws.onopen = function() {
|
||||||
|
// Web Socket 已连接上,使用 send() 方法发送数据
|
||||||
|
console.log("已连接");
|
||||||
|
let message = {
|
||||||
|
type: 0, //消息类型,0代表连接操作
|
||||||
|
message: {
|
||||||
|
id: global.id, //socket id
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this.send(JSON.stringify(message));
|
||||||
|
};
|
||||||
|
|
||||||
export function getOS () {
|
export function getOS () {
|
||||||
if (navigator.userAgent.indexOf('Window') > 0) {
|
if (navigator.userAgent.indexOf('Window') > 0) {
|
||||||
|
@ -114,6 +114,17 @@ document.addEventListener("mousemove", function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
window.addEventListener("beforeunload", function(event) {
|
||||||
|
event.preventDefault();
|
||||||
|
let message = {
|
||||||
|
type: 10,
|
||||||
|
message: {
|
||||||
|
id: global.id, //socket id
|
||||||
|
}
|
||||||
|
};
|
||||||
|
global.ws.send(JSON.stringify(message));
|
||||||
|
});
|
||||||
|
|
||||||
//点击没反应时候的替代方案
|
//点击没反应时候的替代方案
|
||||||
document.onkeydown = function(event) {
|
document.onkeydown = function(event) {
|
||||||
// console.log("keydown");
|
// console.log("keydown");
|
||||||
@ -153,19 +164,6 @@ function generateToolkit() {
|
|||||||
if (difference > 0) {
|
if (difference > 0) {
|
||||||
$(".tooldrag").css("cssText", "height:" + (26 + difference) + "px!important")
|
$(".tooldrag").css("cssText", "height:" + (26 + difference) + "px!important")
|
||||||
}
|
}
|
||||||
timer = setInterval(function() { //时刻监测相应元素是否存在(防止出现如百度一样元素消失重写body的情况),如果不存在,添加进来
|
|
||||||
if (document.body != null && document.getElementById("wrapperToolkit") == null) {
|
|
||||||
this.clearInterval(); //先取消原来的计时器,再设置新的计时器
|
|
||||||
document.body.append(global.div); //默认如果toolkit不存在则div和tdiv也不存在
|
|
||||||
document.body.append(global.tdiv);
|
|
||||||
document.body.append(toolkit);
|
|
||||||
generateToolkit();
|
|
||||||
}
|
|
||||||
}, 3000);
|
|
||||||
}
|
|
||||||
//Vue元素
|
|
||||||
generateToolkit();
|
|
||||||
|
|
||||||
//实现提示框拖拽功能
|
//实现提示框拖拽功能
|
||||||
$('.tooldrag').mousedown(function(e) {
|
$('.tooldrag').mousedown(function(e) {
|
||||||
// e.pageX
|
// e.pageX
|
||||||
@ -201,3 +199,16 @@ $('.tooldrag').mousedown(function(e) {
|
|||||||
$(document).off('mousemove');
|
$(document).off('mousemove');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
timer = setInterval(function() { //时刻监测相应元素是否存在(防止出现如百度一样元素消失重写body的情况),如果不存在,添加进来
|
||||||
|
if (document.body != null && document.getElementById("wrapperToolkit") == null) {
|
||||||
|
this.clearInterval(); //先取消原来的计时器,再设置新的计时器
|
||||||
|
document.body.append(global.div); //默认如果toolkit不存在则div和tdiv也不存在
|
||||||
|
document.body.append(global.tdiv);
|
||||||
|
document.body.append(toolkit);
|
||||||
|
generateToolkit();
|
||||||
|
}
|
||||||
|
}, 3000);
|
||||||
|
}
|
||||||
|
//Vue元素
|
||||||
|
generateToolkit();
|
||||||
|
|
||||||
|
@ -23,9 +23,10 @@ export function input(value) {
|
|||||||
"xpath": readXPath(global.nodeList[0]["node"], 0),
|
"xpath": readXPath(global.nodeList[0]["node"], 0),
|
||||||
"value": value,
|
"value": value,
|
||||||
};
|
};
|
||||||
let msg = { "type": 3, msg: message };
|
let msg = { type: 3, msg: message };
|
||||||
|
window.stop();
|
||||||
chrome.runtime.sendMessage(msg);
|
chrome.runtime.sendMessage(msg);
|
||||||
msg = { "type": 2, value: value, xpath: message.xpath };
|
msg = { type: 2, value: value, xpath: message.xpath, id: global.id};
|
||||||
chrome.runtime.sendMessage(msg);
|
chrome.runtime.sendMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,145 +571,5 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.tooltips {
|
|
||||||
width: 330px;
|
|
||||||
min-height: 300px;
|
|
||||||
background-color: white;
|
|
||||||
position: fixed;
|
|
||||||
z-index: 2147483647;
|
|
||||||
right: 30px;
|
|
||||||
bottom: 30px;
|
|
||||||
font-size: 13px !important;
|
|
||||||
font-weight: normal !important;
|
|
||||||
border: solid navy 2px;
|
|
||||||
-webkit-user-select: none;
|
|
||||||
/* 文字不可被选中 */
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooldrag {
|
|
||||||
background-color: navy;
|
|
||||||
width: 100%;
|
|
||||||
text-align: center;
|
|
||||||
font-size: 13px;
|
|
||||||
height: 26px !important;
|
|
||||||
padding-top: 8px !important;
|
|
||||||
color: white;
|
|
||||||
}
|
|
||||||
|
|
||||||
.realcontent {
|
|
||||||
text-align: left;
|
|
||||||
padding-top: 10px !important;
|
|
||||||
padding-bottom: 80px !important;
|
|
||||||
padding-left: 20px !important;
|
|
||||||
padding-right: 10px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.innercontent {
|
|
||||||
text-align: left;
|
|
||||||
padding-top: 5px !important;
|
|
||||||
padding-left: 12px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.innercontent a {
|
|
||||||
display: inline-block;
|
|
||||||
text-decoration: none;
|
|
||||||
margin-top: 2px !important;
|
|
||||||
font-size: 13px;
|
|
||||||
color: navy !important;
|
|
||||||
cursor: pointer;
|
|
||||||
text-decoration: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.innercontent a:hover {
|
|
||||||
color: blue !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.innercontent span {
|
|
||||||
font-size: 20px;
|
|
||||||
color: navy;
|
|
||||||
line-height: normal;
|
|
||||||
padding-left: 5px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltips button {
|
|
||||||
margin-top: 7px !important;
|
|
||||||
font-size: 13px;
|
|
||||||
border-radius: 5px;
|
|
||||||
border: solid 2px navy;
|
|
||||||
background-color: white;
|
|
||||||
color: navy;
|
|
||||||
width: 100px;
|
|
||||||
height: 30px;
|
|
||||||
cursor: pointer;
|
|
||||||
margin-left: 15px !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltips input[type=text] {
|
|
||||||
display: block;
|
|
||||||
margin-top: 7px !important;
|
|
||||||
padding-left: 5px !important;
|
|
||||||
margin-bottom: 7px !important;
|
|
||||||
font-size: 15px;
|
|
||||||
border-radius: 5px;
|
|
||||||
border: solid 2px navy;
|
|
||||||
width: 204px;
|
|
||||||
height: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tooltips button:hover {
|
|
||||||
color: blue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* 下面用来对冻结表格首行元素和固定表格宽度和高度设定样式 */
|
|
||||||
|
|
||||||
.toolkitcontain {
|
|
||||||
border: 1px solid #cdd !important;
|
|
||||||
/*width: 280px !important;*/
|
|
||||||
/* 上面的宽度设定很重要 */
|
|
||||||
height: 150px;
|
|
||||||
overflow: auto;
|
|
||||||
margin-top: 10px !important;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toolkitcontain table {
|
|
||||||
table-layout: fixed;
|
|
||||||
border-spacing: 0!important;
|
|
||||||
word-break: break-all;
|
|
||||||
word-wrap: break-word;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
overflow: hidden;
|
|
||||||
white-space: nowrap;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toolkitcontain th,
|
|
||||||
.toolkitcontain td,
|
|
||||||
.toolkitcontain tr {
|
|
||||||
border: 1px solid rgb(78, 78, 78) !important;
|
|
||||||
height: 25px !important;
|
|
||||||
width: 100px !important;
|
|
||||||
text-align: center !important;
|
|
||||||
font-weight: normal !important;
|
|
||||||
overflow: hidden !important;
|
|
||||||
font-size: 11px !important;
|
|
||||||
padding-left: 1px !important;
|
|
||||||
padding-right: 0px !important;
|
|
||||||
padding-top: 0px !important;
|
|
||||||
padding-bottom: 0px !important;
|
|
||||||
vertical-align: middle!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toolkitcontain .toolkittb2 {
|
|
||||||
position: sticky;
|
|
||||||
top: 0px;
|
|
||||||
margin-bottom: 0px;
|
|
||||||
background-color: azure;
|
|
||||||
z-index: 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
.toolkitcontain .toolkittb4 {
|
|
||||||
position: absolute;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
@ -27,6 +27,7 @@
|
|||||||
"http://*/*",
|
"http://*/*",
|
||||||
"https://*/*"
|
"https://*/*"
|
||||||
],
|
],
|
||||||
|
"css": ["style/toolkit.css"],
|
||||||
"js": ["content-scripts/main.js"],
|
"js": ["content-scripts/main.js"],
|
||||||
"run_at": "document_end",
|
"run_at": "document_end",
|
||||||
"all_frames": false
|
"all_frames": false
|
||||||
@ -42,6 +43,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"permissions": [
|
"permissions": [
|
||||||
"identity", "storage", "tabs"
|
"identity", "storage", "tabs","scripting"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
141
Extension/manifest_v3/src/style/toolkit.css
Normal file
141
Extension/manifest_v3/src/style/toolkit.css
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
.tooltips {
|
||||||
|
width: 330px;
|
||||||
|
min-height: 300px;
|
||||||
|
background-color: white;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 2147483647;
|
||||||
|
right: 30px;
|
||||||
|
bottom: 30px;
|
||||||
|
font-size: 13px !important;
|
||||||
|
font-weight: normal !important;
|
||||||
|
border: solid navy 2px;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
/* 文字不可被选中 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooldrag {
|
||||||
|
background-color: navy;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 13px;
|
||||||
|
height: 26px !important;
|
||||||
|
padding-top: 8px !important;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.realcontent {
|
||||||
|
text-align: left;
|
||||||
|
padding-top: 10px !important;
|
||||||
|
padding-bottom: 80px !important;
|
||||||
|
padding-left: 20px !important;
|
||||||
|
padding-right: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.innercontent {
|
||||||
|
text-align: left;
|
||||||
|
padding-top: 5px !important;
|
||||||
|
padding-left: 12px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.innercontent a {
|
||||||
|
display: inline-block;
|
||||||
|
text-decoration: none;
|
||||||
|
margin-top: 2px !important;
|
||||||
|
font-size: 13px;
|
||||||
|
color: navy !important;
|
||||||
|
cursor: pointer;
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.innercontent a:hover {
|
||||||
|
color: blue !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.innercontent span {
|
||||||
|
font-size: 20px;
|
||||||
|
color: navy;
|
||||||
|
line-height: normal;
|
||||||
|
padding-left: 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltips button {
|
||||||
|
margin-top: 7px !important;
|
||||||
|
font-size: 13px;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: solid 2px navy;
|
||||||
|
background-color: white;
|
||||||
|
color: navy;
|
||||||
|
width: 100px;
|
||||||
|
height: 30px;
|
||||||
|
cursor: pointer;
|
||||||
|
margin-left: 15px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltips input[type=text] {
|
||||||
|
display: block;
|
||||||
|
margin-top: 7px !important;
|
||||||
|
padding-left: 5px !important;
|
||||||
|
margin-bottom: 7px !important;
|
||||||
|
font-size: 15px;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: solid 2px navy;
|
||||||
|
width: 204px;
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tooltips button:hover {
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* 下面用来对冻结表格首行元素和固定表格宽度和高度设定样式 */
|
||||||
|
|
||||||
|
.toolkitcontain {
|
||||||
|
border: 1px solid #cdd !important;
|
||||||
|
/*width: 280px !important;*/
|
||||||
|
/* 上面的宽度设定很重要 */
|
||||||
|
height: 150px;
|
||||||
|
overflow: auto;
|
||||||
|
margin-top: 10px !important;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolkitcontain table {
|
||||||
|
table-layout: fixed;
|
||||||
|
border-spacing: 0!important;
|
||||||
|
word-break: break-all;
|
||||||
|
word-wrap: break-word;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolkitcontain th,
|
||||||
|
.toolkitcontain td,
|
||||||
|
.toolkitcontain tr {
|
||||||
|
border: 1px solid rgb(78, 78, 78) !important;
|
||||||
|
height: 25px !important;
|
||||||
|
width: 100px !important;
|
||||||
|
text-align: center !important;
|
||||||
|
font-weight: normal !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
font-size: 11px !important;
|
||||||
|
padding-left: 1px !important;
|
||||||
|
padding-right: 0px !important;
|
||||||
|
padding-top: 0px !important;
|
||||||
|
padding-bottom: 0px !important;
|
||||||
|
vertical-align: middle!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolkitcontain .toolkittb2 {
|
||||||
|
position: sticky;
|
||||||
|
top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
background-color: azure;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolkitcontain .toolkittb4 {
|
||||||
|
position: absolute;
|
||||||
|
}
|
11
Releases/EasySpider_windows_amd64/Data/task_0_11752920.csv
Normal file
11
Releases/EasySpider_windows_amd64/Data/task_0_11752920.csv
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
参数1_文本
|
||||||
|
吸毒的人最初是怎样沾上毒品的?
|
||||||
|
LSP是什么意思?
|
||||||
|
如何看待微软研究院发表的 GPT-4 测评文章,认为 GPT-4 可以被视作AGI的早期版本?
|
||||||
|
有哪些嵌套了好几层逻辑的经典故事?
|
||||||
|
百度还有希望崛起吗?
|
||||||
|
谁能告诉我你觉得最可悲的事是什么?
|
||||||
|
小张买了河豚鱼挂车把手上,转头鱼被王大妈偷了后,煮给孙子吃,孙子被毒死,民事责任与刑事责任怎么认定?
|
||||||
|
为何 Linus 一个人就能写出这么强的系统,中国却做不出来?
|
||||||
|
鸿门宴明明是一个失败的宴席,为什么却能进入中学课本?
|
||||||
|
男人最无声的炫富是什么?
|
|
@ -0,0 +1,16 @@
|
|||||||
|
openPage
|
||||||
|
Loading page: https://www.zhihu.com
|
||||||
|
loop
|
||||||
|
getData
|
||||||
|
getData
|
||||||
|
getData
|
||||||
|
pathNotFound: //*[contains(@class, "css-0")]/div[5]/div[1]/div[1]/div[1]/h2[1]/div[1]
|
||||||
|
getData
|
||||||
|
getData
|
||||||
|
pathNotFound: //*[contains(@class, "css-0")]/div[8]/div[1]/div[1]/div[1]/h2[1]/div[1]
|
||||||
|
getData
|
||||||
|
getData
|
||||||
|
getData
|
||||||
|
getData
|
||||||
|
getData
|
||||||
|
Done!
|
@ -0,0 +1 @@
|
|||||||
|
{"id":0,"name":"知乎_登录后采集","url":"https://www.zhihu.com","links":"https://www.zhihu.com","containJudge":false,"desc":"https://www.zhihu.com\n使用带用户配置的浏览器模式来先手工登录后保存信息,再接着执行。","inputParameters":[{"id":0,"name":"urlList_0","nodeId":1,"nodeName":"打开网页","value":"https://www.zhihu.com","desc":"要采集的网址列表,多行以\\n分开","type":"string","exampleValue":"https://www.zhihu.com"}],"outputParameters":[{"id":0,"name":"参数1_文本","desc":"","type":"string","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":"","wait":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,"url":"https://www.zhihu.com","links":"https://www.zhihu.com","scrollType":0,"scrollCount":0}},{"id":2,"index":2,"parentId":0,"type":1,"option":8,"title":"循环","sequence":[3],"isInLoop":false,"position":1,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","wait":0,"scrollType":0,"scrollCount":0,"loopType":2,"pathList":"//*[contains(@class, \"css-0\")]/div[2]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[3]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[4]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[5]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[6]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[7]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[8]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[9]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[10]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[11]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[12]/div[1]/div[1]/div[1]/h2[1]/div[1]\n//*[contains(@class, \"css-0\")]/div[13]/div[1]/div[1]/div[1]/h2[1]/div[1]","textList":"","exitCount":0,"historyWait":2}},{"id":3,"index":3,"parentId":2,"type":0,"option":3,"title":"提取数据","sequence":[],"isInLoop":true,"position":0,"parameters":{"history":5,"tabIndex":-1,"useLoop":false,"xpath":"","wait":0,"paras":[{"nodeType":0,"contentType":0,"relative":true,"name":"参数1_文本","desc":"","relativeXpath":"","exampleValues":[{"num":0,"value":"历史上有哪些通过“正当手段”干出不正当事的人物?"},{"num":1,"value":"新加坡有哪些不好的地方?"},{"num":2,"value":"孙悟空可以秒杀山村老尸那样的厉鬼吗?"},{"num":3,"value":"为什么渐渐厌倦玩《原神》了?"},{"num":4,"value":"历史上有哪些著名的考古乌龙事件?"},{"num":5,"value":"苹果公司为什么能把用户调教得这么好?"},{"num":6,"value":"哪个瞬间让你发现了世界的bug?"},{"num":7,"value":"假如中国的院士,想为亲属谋体制内的工作,难度大吗?为什么?"},{"num":8,"value":"你一直珍藏的视频是哪个?"},{"num":9,"value":"如何评价《原神》角色艾莉丝?"},{"num":10,"value":"索罗斯如何做空的英镑、泰铢?为什么做空香港失败了?"},{"num":11,"value":"如何在婚前认清并杜绝王力宏这种男人?"}],"default":""}],"loopType":2}}]}
|
Loading…
x
Reference in New Issue
Block a user