in C#.Net/JDI ImageToWebElement/ImagePattnerSerach.cs [236:308]
private static string GetElementXPathJS(IWebElement element)
{
string result = "";
var jsResult = ((IJavaScriptExecutor)webDriver).ExecuteScript(@"
return getElementXPath(arguments[0]);
function getElementXPath(element)
{
if (element && element.id)
return //*[@id='' + element.id + '\'];
else
return getElementTreeXPath(element);
};
function getElementTreeXPath(element)
{
var paths = []; // Use nodeName (instead of localName)
// so namespace prefix is included (if any).
for (; element && element.nodeType == Node.ELEMENT_NODE;
element = element.parentNode)
{
var index = 0;
var hasFollowingSiblings = false;
for (var sibling = element.previousSibling; sibling;
sibling = sibling.previousSibling)
{
// Ignore document type declaration.
if (sibling.nodeType == Node.DOCUMENT_TYPE_NODE)
continue;
if (sibling.nodeName == element.nodeName)
++index;
}
for (var sibling = element.nextSibling;
sibling && !hasFollowingSiblings;
sibling = sibling.nextSibling)
{
if (sibling.nodeName == element.nodeName)
hasFollowingSiblings = true;
}
var tagName = (element.prefix ? element.prefix + ':' : '')
+ element.localName;
var pathIndex = (index || hasFollowingSiblings ? '['
+ (index + 1) + ']' : '');
paths.splice(0, 0, tagName + pathIndex);
}
return paths.length ? '/' + paths.join('/') : null;
};"
, element);
if (jsResult == null)
{
var jsResult2 = ((IJavaScriptExecutor)webDriver).ExecuteScript(@"
var xpath = '';
var element = arguments[0];
for ( ; element && element.nodeType == 1; element = element.parentNode )
{
var id = $(element.parentNode).children(element.tagName).index(element) + 1;
id > 1 ? (id = '[' + id + ']') : (id = '');
xpath = '/' + element.tagName.toLowerCase() + id + xpath;
}
return xpath;", element);
if (jsResult2 != null)
result = jsResult2.ToString();
}
else
result = jsResult.ToString();
return result;
}