gu.automation.0.0.3.source-code.querySelector.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of automation Show documentation
Show all versions of automation Show documentation
This project automates shadow-dom elements using java selenium
var querySelectorAllDeep = function querySelectorAllDeep(selector, root) {
if(root==undefined) {
return _querySelectorDeep(selector, true, document);
} else {
return _querySelectorDeep(selector, true, root);
}
};
var querySelectorDeep = function querySelectorDeep(selector, root) {
if(root==undefined) {
return _querySelectorDeep(selector, false, document);
} else {
return _querySelectorDeep(selector, false, root);
}
};
var getObject = function getObject(selector, root = document) {
const multiLevelSelectors = splitByCharacterUnlessQuoted(selector, '>');
if (multiLevelSelectors.length == 1) {
return querySelectorDeep(multiLevelSelectors[0], root);
} else if (multiLevelSelectors.length == 2) {
return querySelectorDeep(multiLevelSelectors[1], querySelectorDeep(multiLevelSelectors[0]).root);
} else if (multiLevelSelectors.length == 3) {
return querySelectorDeep(multiLevelSelectors[2], querySelectorDeep(multiLevelSelectors[1], querySelectorDeep(multiLevelSelectors[0]).root));
} else if (multiLevelSelectors.length == 4) {
return querySelectorDeep(multiLevelSelectors[3], querySelectorDeep(multiLevelSelectors[2], querySelectorDeep(multiLevelSelectors[1], querySelectorDeep(multiLevelSelectors[0]).root)));
}
};
var getAllObject = function getAllObject(selector, root = document) {
const multiLevelSelectors = splitByCharacterUnlessQuoted(selector, '>');
if (multiLevelSelectors.length == 1) {
return querySelectorAllDeep(multiLevelSelectors[0], root);
} else if (multiLevelSelectors.length == 2) {
return querySelectorAllDeep(multiLevelSelectors[1], querySelectorDeep(multiLevelSelectors[0]).root);
} else if (multiLevelSelectors.length == 3) {
return querySelectorAllDeep(multiLevelSelectors[2], querySelectorDeep(multiLevelSelectors[1], querySelectorDeep(multiLevelSelectors[0]).root));
} else if (multiLevelSelectors.length == 4) {
return querySelectorAllDeep(multiLevelSelectors[3], querySelectorDeep(multiLevelSelectors[2], querySelectorDeep(multiLevelSelectors[1], querySelectorDeep(multiLevelSelectors[0]).root)));
}
};
function _querySelectorDeep(selector, findMany, root) {
let lightElement = root.querySelector(selector);
if (document.head.createShadowRoot || document.head.attachShadow) {
if (!findMany && lightElement) {
return lightElement;
}
const selectionsToMake = splitByCharacterUnlessQuoted(selector, ',');
return selectionsToMake.reduce((acc, minimalSelector) => {
if (!findMany && acc) {
return acc;
}
const splitSelector = splitByCharacterUnlessQuoted(minimalSelector
.replace(/^\s+/g, '')
.replace(/\s*([>+~]+)\s*/g, '$1'), ' ')
.filter((entry) => !!entry);
const possibleElementsIndex = splitSelector.length - 1;
const possibleElements = collectAllElementsDeep(splitSelector[possibleElementsIndex], root);
const findElements = findMatchingElement(splitSelector, possibleElementsIndex, root);
if (findMany) {
acc = acc.concat(possibleElements.filter(findElements));
return acc;
} else {
acc = possibleElements.find(findElements);
return acc;
}
}, findMany ? [] : null);
} else {
if (!findMany) {
return lightElement;
} else {
return root.querySelectorAll(selector);
}
}
}
function findMatchingElement(splitSelector, possibleElementsIndex, root) {
return (element) => {
let position = possibleElementsIndex;
let parent = element;
let foundElement = false;
while (parent) {
const foundMatch = parent.matches(splitSelector[position]);
if (foundMatch && position === 0) {
foundElement = true;
break;
}
if (foundMatch) {
position--;
}
parent = findParentOrHost(parent, root);
}
return foundElement;
};
}
function splitByCharacterUnlessQuoted(selector, character) {
return selector.match(/\\?.|^$/g).reduce((p, c) => {
if (c === '"' && !p.sQuote) {
p.quote ^= 1;
p.a[p.a.length - 1] += c;
} else if (c === '\'' && !p.quote) {
p.sQuote ^= 1;
p.a[p.a.length - 1] += c;
} else if (!p.quote && !p.sQuote && c === character) {
p.a.push('');
} else {
p.a[p.a.length - 1] += c;
}
return p;
}, { a: [''] }).a;
}
function findParentOrHost(element, root) {
const parentNode = element.parentNode;
return (parentNode && parentNode.host && parentNode.nodeType === 11) ? parentNode.host : parentNode === root ? null : parentNode;
}
function collectAllElementsDeep(selector = null, root) {
const allElements = [];
const findAllElements = function(nodes) {
for (let i = 0, el; el = nodes[i]; ++i) {
allElements.push(el);
if (el.shadowRoot) {
findAllElements(el.shadowRoot.querySelectorAll('*'));
}
}
};
findAllElements(root.querySelectorAll('*'));
return selector ? allElements.filter(el => el.matches(selector)) : allElements;
}