mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-06-08 14:34:13 +08:00
297 lines
7.8 KiB
JavaScript
297 lines
7.8 KiB
JavaScript
const { runCsharpFeature } = require("../../csharp");
|
|
|
|
const addressBarName = "地址和搜索栏";
|
|
const addressBarXpath =
|
|
"/Pane[3]/Pane/Pane[1]/Pane[2]/Pane[1]/ToolBar/Pane/Group/Edit";
|
|
|
|
const runBrowserAutomation = async (params) => {
|
|
const { value, browser = "msedge" } = params;
|
|
const baseArgs = ["-method", "process", "-window", browser];
|
|
|
|
if (value) {
|
|
baseArgs.push("-type", "setvalue", "-value", value, "-sendenter");
|
|
} else {
|
|
baseArgs.push("-type", "getvalue");
|
|
}
|
|
|
|
try {
|
|
return await runCsharpFeature("automation", [
|
|
...baseArgs,
|
|
"-name",
|
|
addressBarName,
|
|
]);
|
|
} catch (error) {
|
|
console.log(error);
|
|
try {
|
|
return await runCsharpFeature("automation", [
|
|
...baseArgs,
|
|
"-xpath",
|
|
addressBarXpath,
|
|
]);
|
|
} catch (error) {
|
|
console.log(error);
|
|
throw "获取浏览器地址栏失败";
|
|
}
|
|
}
|
|
};
|
|
|
|
const setUrl = async (browser = "msedge", url) => {
|
|
return await runBrowserAutomation({ value: url, browser });
|
|
};
|
|
|
|
const getUrl = async (browser = "msedge") => {
|
|
return await runBrowserAutomation({ browser });
|
|
};
|
|
|
|
const executeScript = async (browser = "msedge", script, args = {}) => {
|
|
// 构建参数列表
|
|
const argNames = Object.keys(args);
|
|
const argValues = Object.values(args).map((v) => JSON.stringify(v));
|
|
|
|
const wrapperScript = `
|
|
(function(${argNames.join(", ")}) {
|
|
${script}
|
|
})(${argValues.join(", ")})
|
|
`;
|
|
return await runBrowserAutomation({
|
|
value: `javascript:${encodeURIComponent(wrapperScript)}`,
|
|
browser,
|
|
});
|
|
};
|
|
|
|
// 点击元素
|
|
const clickElement = async (browser = "msedge", selector) => {
|
|
const script = `
|
|
const element = document.querySelector('${selector}');
|
|
if (element) {
|
|
element.click();
|
|
return '##execute_script_success##';
|
|
} else {
|
|
return '##execute_script_failed##';
|
|
}
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 输入文本
|
|
const inputText = async (browser = "msedge", selector, text) => {
|
|
const script = `
|
|
const element = document.querySelector('${selector}');
|
|
if (element) {
|
|
element.value = '${text}';
|
|
element.dispatchEvent(new Event('input'));
|
|
element.dispatchEvent(new Event('change'));
|
|
return '##execute_script_success##';
|
|
} else {
|
|
return '##execute_script_failed##';
|
|
}
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 获取文本
|
|
const getText = async (browser = "msedge", selector) => {
|
|
const script = `
|
|
const element = document.querySelector('${selector}');
|
|
return element ? element.textContent : '';
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 获取HTML
|
|
const getHtml = async (browser = "msedge", selector) => {
|
|
const script = `
|
|
const element = document.querySelector('${selector}');
|
|
return element ? element.innerHTML : '';
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 隐藏元素
|
|
const hideElement = async (browser = "msedge", selector) => {
|
|
const script = `
|
|
const element = document.querySelector('${selector}');
|
|
if (element) {
|
|
element.style.display = 'none';
|
|
return '##execute_script_success##';
|
|
} else {
|
|
return '##execute_script_failed##';
|
|
}
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 显示元素
|
|
const showElement = async (browser = "msedge", selector) => {
|
|
const script = `
|
|
const element = document.querySelector('${selector}');
|
|
if (element) {
|
|
element.style.display = '';
|
|
return '##execute_script_success##';
|
|
} else {
|
|
return '##execute_script_failed##';
|
|
}
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 注入CSS
|
|
const injectCSS = async (browser = "msedge", css) => {
|
|
const script = `
|
|
const style = document.createElement('style');
|
|
style.textContent = \`${css}\`;
|
|
document.head.appendChild(style);
|
|
return '##execute_script_success##';
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 设置Cookie
|
|
const setCookie = async (browser = "msedge", cookies, options = {}) => {
|
|
const cookieStatements = cookies
|
|
.map((cookie) => {
|
|
let cookieString = `${cookie.name}=${cookie.value}`;
|
|
if (options.expires) {
|
|
const expiresDate = new Date(
|
|
Date.now() + options.expires * 60 * 60 * 1000
|
|
);
|
|
cookieString += `;expires=${expiresDate.toUTCString()}`;
|
|
}
|
|
if (options.path) cookieString += `;path=${options.path}`;
|
|
if (options.domain) cookieString += `;domain=${options.domain}`;
|
|
if (options.secure) cookieString += ";secure";
|
|
return `document.cookie = ${JSON.stringify(cookieString)};`;
|
|
})
|
|
.join("\n");
|
|
|
|
const script = `
|
|
${cookieStatements}
|
|
return '##execute_script_success##';
|
|
`;
|
|
|
|
return await this.executeScript(browser, script);
|
|
};
|
|
|
|
// 获取Cookie
|
|
const getCookie = async (browser = "msedge", name) => {
|
|
const script = `
|
|
const value = document.cookie
|
|
.split('; ')
|
|
.find(row => row.startsWith('${name}='))
|
|
?.split('=')[1];
|
|
return value || '';
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 删除Cookie
|
|
const deleteCookie = async (
|
|
browser = "msedge",
|
|
name,
|
|
path = "/",
|
|
domain = ""
|
|
) => {
|
|
const script = `
|
|
document.cookie = '${name}=; expires=Thu, 01 Jan 1970 00:00:00 GMT' +
|
|
(${domain ? `'; domain=${domain}'` : "''"}) +
|
|
(${path ? `'; path=${path}'` : "''"});
|
|
return '##execute_script_success##';
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 滚动到指定位置
|
|
const scrollTo = async (browser = "msedge", x, y) => {
|
|
const script = `
|
|
window.scrollTo(${x}, ${y});
|
|
return '##execute_script_success##';
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 滚动到元素位置
|
|
const scrollToElement = async (browser = "msedge", selector) => {
|
|
const script = `
|
|
const element = document.querySelector('${selector}');
|
|
if (element) {
|
|
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
return '##execute_script_success##';
|
|
} else {
|
|
return '##execute_script_failed##';
|
|
}
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 获取滚动位置
|
|
const getScrollPosition = async (browser = "msedge") => {
|
|
const script = `
|
|
return JSON.stringify({
|
|
x: window.pageXOffset || document.documentElement.scrollLeft,
|
|
y: window.pageYOffset || document.documentElement.scrollTop
|
|
});
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 获取页面尺寸
|
|
const getPageSize = async (browser = "msedge") => {
|
|
const script = `
|
|
return JSON.stringify({
|
|
width: Math.max(
|
|
document.documentElement.scrollWidth,
|
|
document.documentElement.clientWidth
|
|
),
|
|
height: Math.max(
|
|
document.documentElement.scrollHeight,
|
|
document.documentElement.clientHeight
|
|
)
|
|
});
|
|
`;
|
|
return await executeScript(browser, script);
|
|
};
|
|
|
|
// 等待元素出现
|
|
const waitForElement = async (browser = "msedge", selector, timeout = 5000) => {
|
|
const startTime = Date.now();
|
|
|
|
// 检查元素是否存在的函数
|
|
const checkScript = `
|
|
const element = document.querySelector('${selector}');
|
|
return element ? '##execute_script_success##' : '##execute_script_failed##';
|
|
`;
|
|
|
|
// 轮询检查元素
|
|
while (Date.now() - startTime < timeout) {
|
|
const result = await executeScript(browser, checkScript);
|
|
if (result === true) {
|
|
return true;
|
|
}
|
|
// 等待100ms再次检查
|
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
module.exports = {
|
|
getUrl,
|
|
setUrl,
|
|
executeScript,
|
|
clickElement,
|
|
inputText,
|
|
getText,
|
|
getHtml,
|
|
hideElement,
|
|
showElement,
|
|
injectCSS,
|
|
setCookie,
|
|
getCookie,
|
|
deleteCookie,
|
|
scrollTo,
|
|
scrollToElement,
|
|
getScrollPosition,
|
|
getPageSize,
|
|
waitForElement,
|
|
};
|