getElementXPath function from FirebugをCasperJSで動作させようとしていますが、動作させるために適切な場所を見つけることができないようです。ここで私がこれまでに持っていたのは、 "id"タグをすでに持っているオブジェクトに対してのみ機能しますが、IDの代わりにXPathを使用しているためほとんど役に立ちません(ほとんどのオブジェクトにはIDがありません)CasperJSで指定された要素のXPathを計算する
要素が既に「ID」タグを有する場合2のみ正しいパスを出力セット:
casper.then(function() {
var Element = this.evaluate(function(){
var elm = document.querySelector('[class="h4"]');
return getElementXPath(elm); //Set 1
//return elm; //Set 2
});
console.log('xpath: '+ Element); //Set 1
//console.log('xpath: '+ getElementXPath(Element)); //Set 2
});
セット1は常に「ヌルのXPath」を出力します。 "XPathの:// * [ID =" ボタン "]"
セット2は、そうでない場合は、出力の最後のタグすなわちだろう "のxpath:/ A" または "のxpath:/スパン"
はここからgetElementXPath機能ですJSファイルの先頭に貼り付けたFirebug。
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;
};
https://github.com/firebug/firebug/blob/master/extension/content/firebug/lib/xpath.js – projectgonewrong