feat: nth-child selector generation for child selectors
This commit is contained in:
@@ -1654,6 +1654,31 @@ export const getNonUniqueSelectors = async (page: Page, coordinates: Coordinates
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (element.parentElement) {
|
||||||
|
// Look for identical siblings
|
||||||
|
const siblings = Array.from(element.parentElement.children);
|
||||||
|
const identicalSiblings = siblings.filter(sibling => {
|
||||||
|
if (sibling === element) return false;
|
||||||
|
|
||||||
|
let siblingSelector = sibling.tagName.toLowerCase();
|
||||||
|
const siblingClassName = typeof sibling.className === 'string' ? sibling.className : '';
|
||||||
|
if (siblingClassName) {
|
||||||
|
const siblingClasses = siblingClassName.split(/\s+/).filter(Boolean);
|
||||||
|
const validSiblingClasses = siblingClasses.filter(cls => !cls.startsWith('!') && !cls.includes(':'));
|
||||||
|
if (validSiblingClasses.length > 0) {
|
||||||
|
siblingSelector += '.' + validSiblingClasses.map(cls => CSS.escape(cls)).join('.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return siblingSelector === selector;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (identicalSiblings.length > 0) {
|
||||||
|
const position = siblings.indexOf(element) + 1;
|
||||||
|
selector += `:nth-child(${position})`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return selector;
|
return selector;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1894,6 +1919,31 @@ export const getNonUniqueSelectors = async (page: Page, coordinates: Coordinates
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (element.parentElement) {
|
||||||
|
// Look for identical siblings
|
||||||
|
const siblings = Array.from(element.parentElement.children);
|
||||||
|
const identicalSiblings = siblings.filter(sibling => {
|
||||||
|
if (sibling === element) return false;
|
||||||
|
|
||||||
|
let siblingSelector = sibling.tagName.toLowerCase();
|
||||||
|
const siblingClassName = typeof sibling.className === 'string' ? sibling.className : '';
|
||||||
|
if (siblingClassName) {
|
||||||
|
const siblingClasses = siblingClassName.split(/\s+/).filter(Boolean);
|
||||||
|
const validSiblingClasses = siblingClasses.filter(cls => !cls.startsWith('!') && !cls.includes(':'));
|
||||||
|
if (validSiblingClasses.length > 0) {
|
||||||
|
siblingSelector += '.' + validSiblingClasses.map(cls => CSS.escape(cls)).join('.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return siblingSelector === selector;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (identicalSiblings.length > 0) {
|
||||||
|
const position = siblings.indexOf(element) + 1;
|
||||||
|
selector += `:nth-child(${position})`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return selector;
|
return selector;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2025,6 +2075,31 @@ export const getChildSelectors = async (page: Page, parentSelector: string): Pro
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (element.parentElement) {
|
||||||
|
// Look for identical siblings
|
||||||
|
const siblings = Array.from(element.parentElement.children);
|
||||||
|
const identicalSiblings = siblings.filter(sibling => {
|
||||||
|
if (sibling === element) return false;
|
||||||
|
|
||||||
|
let siblingSelector = sibling.tagName.toLowerCase();
|
||||||
|
const siblingClassName = typeof sibling.className === 'string' ? sibling.className : '';
|
||||||
|
if (siblingClassName) {
|
||||||
|
const siblingClasses = siblingClassName.split(/\s+/).filter(Boolean);
|
||||||
|
const validSiblingClasses = siblingClasses.filter(cls => !cls.startsWith('!') && !cls.includes(':'));
|
||||||
|
if (validSiblingClasses.length > 0) {
|
||||||
|
siblingSelector += '.' + validSiblingClasses.map(cls => CSS.escape(cls)).join('.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return siblingSelector === selector;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (identicalSiblings.length > 0) {
|
||||||
|
const position = siblings.indexOf(element) + 1;
|
||||||
|
selector += `:nth-child(${position})`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return selector;
|
return selector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user