feat: generate CSS selectors targeting a given HTML el based on its tag name, class names, attributes, & potential test IDs
This commit is contained in:
@@ -558,7 +558,75 @@ export const getSelectors = async (page: Page, coordinates: Coordinates) => {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const genSelectors = (element: HTMLElement | null) =>{
|
||||||
|
if (element == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const href = element.getAttribute('href');
|
||||||
|
|
||||||
|
let generalSelector = null;
|
||||||
|
try {
|
||||||
|
generalSelector = finder(element);
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
let attrSelector = null;
|
||||||
|
try {
|
||||||
|
attrSelector = finder(element, { attr: () => true });
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
const hrefSelector = genSelectorForAttributes(element, ['href']);
|
||||||
|
const formSelector = genSelectorForAttributes(element, [
|
||||||
|
'name',
|
||||||
|
'placeholder',
|
||||||
|
'for',
|
||||||
|
]);
|
||||||
|
const accessibilitySelector = genSelectorForAttributes(element, [
|
||||||
|
'aria-label',
|
||||||
|
'alt',
|
||||||
|
'title',
|
||||||
|
]);
|
||||||
|
|
||||||
|
const testIdSelector = genSelectorForAttributes(element, [
|
||||||
|
'data-testid',
|
||||||
|
'data-test-id',
|
||||||
|
'data-testing',
|
||||||
|
'data-test',
|
||||||
|
'data-qa',
|
||||||
|
'data-cy',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// We won't use an id selector if the id is invalid (starts with a number)
|
||||||
|
let idSelector = null;
|
||||||
|
try {
|
||||||
|
idSelector =
|
||||||
|
isAttributesDefined(element, ['id']) &&
|
||||||
|
!isCharacterNumber(element.id?.[0])
|
||||||
|
? // Certain apps don't have unique ids (ex. youtube)
|
||||||
|
finder(element, {
|
||||||
|
attr: (name) => name === 'id',
|
||||||
|
})
|
||||||
|
: null;
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: idSelector,
|
||||||
|
generalSelector,
|
||||||
|
attrSelector,
|
||||||
|
testIdSelector,
|
||||||
|
text: element.innerText,
|
||||||
|
href,
|
||||||
|
// Only try to pick an href selector if there is an href on the element
|
||||||
|
hrefSelector,
|
||||||
|
accessibilitySelector,
|
||||||
|
formSelector,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user