// ==UserScript== // @name 点云标注|手动弹窗后F2执行完整版 // @namespace http://tampermonkey.net/ // @version 5.2 // @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; } // 根据文本查找DOM 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) { if (!el) return; const rect = el.getBoundingClientRect(); const x = rect.left + rect.width / 2; const y = rect.top + rect.height / 2; const opts = { clientX: x, clientY: y, bubbles: true, cancelable: true }; el.dispatchEvent(new MouseEvent('mouseover', opts)); await sleep(60); el.dispatchEvent(new MouseEvent('mousedown', opts)); await sleep(60); el.dispatchEvent(new MouseEvent('mouseup', opts)); await sleep(60); el.dispatchEvent(new MouseEvent('click', opts)); if (typeof el.click === "function") el.click(); } async function runTask() { console.log("\n==========F2任务开始=========="); // 检测弹窗是否已经打开 const dialog = await waitElement('div[role="dialog"]'); if (!dialog) { console.error("❌未检测到批注弹窗,请手动点开弹窗之后再按F2"); return; } console.log("✅识别到批注弹窗"); // 点击下拉容器展开选项 const combobox = dialog.querySelector('[role="combobox"]'); if (!combobox) { console.error("❌弹窗内找不到下拉组件 role=combobox"); return; } console.log("✅点击下拉框展开列表"); await realClick(combobox); await sleep(1600); // 全局查找属性错误选项 const optionNode = findElByText("属性错误"); if (!optionNode) { console.error("❌页面找不到【属性错误】选项"); return; } console.log("✅定位到属性错误,执行点击"); await realClick(optionNode); await sleep(1000); // 点击确定按钮提交 const confirmBtn = findElByText("确定"); if (!confirmBtn) { console.error("❌找不到确定按钮"); return; } await realClick(confirmBtn); console.log("✅全部操作执行完毕"); } // F2热键绑定 document.addEventListener('keydown', async function (e) { if (e.key === 'F2') { e.preventDefault(); await runTask(); } }); console.log("✅脚本加载完成!使用方式:手动点开批注弹窗 → 弹窗出现后按F2"); })();