1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
| javascript:(function () { const style = document.createElement('style'); style.textContent = ` .element-highlight-border { position: absolute; pointer-events: none; border-radius: 4px; z-index: 99999999; animation: highlight-pulse 1.5s infinite ease-in-out; box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.8), inset 0 0 0 2px rgba(74, 144, 226, 0.8); } @keyframes highlight-pulse { 0%, 100% { box-shadow: 0 0 0 2px rgba(74, 144, 226, 0.8), inset 0 0 0 2px rgba(74, 144, 226, 0.8), 0 0 20px 5px rgba(74, 144, 226, 0.4); } 50% { box-shadow: 0 0 0 3px rgba(74, 144, 226, 1), inset 0 0 0 3px rgba(74, 144, 226, 1), 0 0 30px 10px rgba(74, 144, 226, 0.6); } } .click-feedback { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%) translateY(100px); padding: 12px 24px; background: #4a90e2; color: white; border-radius: 24px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; font-weight: 500; opacity: 0; transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); z-index: 9999; box-shadow: 0 4px 15px rgba(0,0,0,0.2); } .click-feedback.show { transform: translateX(-50%) translateY(0); opacity: 1; } `; document.head.appendChild(style);
const border = document.createElement('div'); border.className = 'element-highlight-border'; document.body.appendChild(border);
const feedback = document.createElement('div'); feedback.className = 'click-feedback'; feedback.textContent = '✓ XPath已复制'; document.body.appendChild(feedback);
function getXPath(element) { if (!element || element.nodeType !== 1) return '';
const siblings = element.parentNode ? Array.from(element.parentNode.children) : []; const sameTagSiblings = siblings.filter(e => e.tagName === element.tagName);
if (sameTagSiblings.length === 1) { return `${getXPath(element.parentNode)}/${element.tagName.toLowerCase()}`; }
const index = sameTagSiblings.indexOf(element) + 1; return `${getXPath(element.parentNode)}/${element.tagName.toLowerCase()}[${index}]`; }
let currentElement = null;
function updateHighlight(element) { if (!element || element === document.documentElement) { border.style.display = 'none'; return; }
const rect = element.getBoundingClientRect(); border.style.display = 'block'; border.style.width = `${rect.width}px`; border.style.height = `${rect.height}px`; border.style.left = `${rect.left + window.scrollX}px`; border.style.top = `${rect.top + window.scrollY}px`; }
function showFeedback() { feedback.classList.add('show'); setTimeout(() => { feedback.classList.remove('show'); }, 2000); }
document.addEventListener('mousemove', (e) => { const element = document.elementFromPoint(e.clientX, e.clientY); if (element !== currentElement) { currentElement = element; updateHighlight(element); } });
document.addEventListener('click', (e) => { e.preventDefault(); e.stopPropagation();
if (currentElement) { const xpath = getXPath(currentElement); navigator.clipboard.writeText(xpath).then(() => { showFeedback(); }).catch(err => { feedback.textContent = '✗ 复制失败,请检查控制台'; console.log('XPath:', xpath); showFeedback(); }); } }, true);
document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { document.head.removeChild(style); document.body.removeChild(border); document.body.removeChild(feedback);
document.removeEventListener('mousemove', arguments.callee); document.removeEventListener('click', arguments.callee, true); document.removeEventListener('keydown', arguments.callee);
console.log('元素选择器已关闭'); } });
alert('元素选择器已激活!\n\n🖱️ 鼠标悬停选择元素\n📋 点击复制XPath\n⎋ 按ESC退出\n 退出时请刷新浏览器。'); })()
|