// ==UserScript== // @name 点云标注·精简完整版 // @namespace http://tampermonkey.net/ // @version 5.5 // @description 手动弹出【指定标签批注】弹窗,按F2;识别失败直接终止,不执行后续无效逻辑 // @author You // @match *://*/* // @grant none // ==/UserScript== (function () { 'use strict'; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); async function waitElement(selector, timeout = 5000) { const start = Date.now(); while (Date.now() - start < timeout) { const el = document.querySelector(selector); if (el) return el; await sleep(150); } return null; } function findElByText(text) { const all = document.querySelectorAll('*'); for (const el of all) { const txt = el.textContent?.trim(); if (txt === text) return el; } return null; } async function realClick(el) { const rect = el.getBoundingClientRect(); const opts = { clientX: rect.left + rect.width / 2, clientY: rect.top + rect.height / 2, bubbles: true, cancelable: true }; el.dispatchEvent(new MouseEvent('mouseover', opts)); await sleep(50); el.dispatchEvent(new MouseEvent('mousedown', opts)); await sleep(50); el.dispatchEvent(new MouseEvent('mouseup', opts)); await sleep(50); el.dispatchEvent(new MouseEvent('click', opts)); } function keyDownEv(el, key) { el.dispatchEvent(new KeyboardEvent('keydown', { key: key, bubbles: true })); } async function runTask() { console.log("\n========== F2任务开始 =========="); const dialog = await waitElement('div[role="dialog"]'); if (!dialog) { console.error("❌未识别弹窗,请手动打开弹窗后按F2"); return; } console.log("✅识别批注弹窗"); let selectWrap = null; const nodes = dialog.querySelectorAll('*'); for (const n of nodes) { if (n.textContent?.includes('请选择')) { selectWrap = n; break; } } if (!selectWrap) { console.error("❌未识别下拉容器,任务终止"); return; } console.log("✅定位下拉容器,展开"); await realClick(selectWrap); await sleep(900); keyDownEv(selectWrap, 'ArrowDown'); await sleep(1300); const opt = findElByText("属性错误"); if (!opt) { console.error("❌未识别属性错误选项,任务终止"); return; } console.log("✅点击属性错误"); await realClick(opt); await sleep(1000); const okBtn = findElByText("确定"); if (!okBtn) { console.error("❌未识别确定按钮,任务终止"); return; } await realClick(okBtn); console.log("✅执行完成"); } document.addEventListener('keydown', async e => { if (e.key === 'F2') { e.preventDefault(); await runTask(); } }); console.log("✅脚本就绪:手动打开弹窗,弹窗出现后按F2"); })();