class UniqueSelector { static getElementSelector(element) { if (element.id) { return `#${element.id}`; } if (element.tagName === 'BODY') { return 'body'; } let selector = element.tagName.toLowerCase(); if (element.className) { selector += `.${element.className.replace(/ /g, '.')}`; } let siblings = Array.from(element.parentNode.children); let index = siblings.indexOf(element) + 1; if (siblings.length > 1) { selector += `:nth-child(${index})`; } return selector; } static getUniqueSelector(element) { let selector = this.getElementSelector(element); let elements = document.querySelectorAll(selector); if (elements.length === 1) { return selector; } let bestSelector = selector; let bestCount = elements.length; // Try with parents' ids let parent = element.parentElement; while (parent) { if (parent.id) { let parentSelector = `#${parent.id} ${selector}`; elements = document.querySelectorAll(parentSelector); if (elements.length === 1) { return parentSelector; } if (elements.length < bestCount) { bestSelector = parentSelector; bestCount = elements.length; } } parent = parent.parentElement; } // Try with parents' classes let parentClasses = []; parent = element.parentElement; while (parent && parent.tagName !== 'BODY') { let classes = Array.from(parent.classList).filter(c => !parentClasses.includes(c)); for (let i = 0; i < classes.length; i++) { let parentSelector = `.${classes[i]} ${selector}`; elements = document.querySelectorAll(parentSelector); if (elements.length === 1) { return parentSelector; } if (elements.length < bestCount) { bestSelector = parentSelector; bestCount = elements.length; } parentClasses.push(classes[i]); } parent = parent.parentElement; } // Try with all parents parent = element.parentElement; let selectors = [selector]; while (parent && parent.tagName !== 'BODY') { let newSelectors = []; for (let i = 0; i < selectors.length; i++) { let newSelector = `${parent.tagName.toLowerCase()} ${selectors[i]}`; newSelectors.push(newSelector); elements = document.querySelectorAll(newSelector); if (elements.length === 1) { return newSelector; } if (elements.length < bestCount) { bestSelector = newSelector; bestCount = elements.length; } } selectors = newSelectors; parent = parent.parentElement; } // Show alert and return best selector alert('No se ha podido encontrar un selector Ășnico.'); return bestSelector; } }