Skip to content

Instantly share code, notes, and snippets.

@beatngu13
Last active April 8, 2023 22:12
Show Gist options
  • Save beatngu13/a3312b98de57610c5ecd27ea84a7fbeb to your computer and use it in GitHub Desktop.
Save beatngu13/a3312b98de57610c5ecd27ea84a7fbeb to your computer and use it in GitHub Desktop.
Get the absolute XPath for a given Selenium WebElement
// Taken from https://stackoverflow.com/a/47088726/3429133.
function getAbsoluteXPath(element) {
var comp, comps = [];
var parent = null;
var xpath = '';
var getPos = function(element) {
var position = 1,
curNode;
if (element.nodeType == Node.ATTRIBUTE_NODE) {
return null;
}
for (curNode = element.previousSibling; curNode; curNode = curNode.previousSibling) {
if (curNode.nodeName == element.nodeName) {
++position;
}
}
return position;
};
if (element instanceof Document) {
return '/';
}
for (; element && !(element instanceof Document); element = element.nodeType == Node.ATTRIBUTE_NODE ? element.ownerElement : element.parentNode) {
comp = comps[comps.length] = {};
switch (element.nodeType) {
case Node.TEXT_NODE:
comp.name = 'text()';
break;
case Node.ATTRIBUTE_NODE:
comp.name = '@' + element.nodeName;
break;
case Node.PROCESSING_INSTRUCTION_NODE:
comp.name = 'processing-instruction()';
break;
case Node.COMMENT_NODE:
comp.name = 'comment()';
break;
case Node.ELEMENT_NODE:
comp.name = element.nodeName;
break;
}
comp.position = getPos(element);
}
for (var i = comps.length - 1; i >= 0; i--) {
comp = comps[i];
xpath += '/' + comp.name.toLowerCase();
if (comp.position !== null) {
xpath += '[' + comp.position + ']';
}
}
return xpath;
}
return getAbsoluteXPath(arguments[0]);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment