计算CasperJS中给定元素的XPath
Calculating an XPath of a given element in CasperJS
我正试图使用Firebug中的getElementXPath函数在CasperJS中工作,但我似乎找不到合适的地方来调用它。这是我目前所拥有的,它只适用于已经有"id"标记的对象,但这并没有多大帮助,因为我使用XPath代替id(大多数对象没有id)
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:null"
只有当元素已经有"id"标记时,集合2才会输出正确的路径。"xpath://*[id="button"]"
否则,集合2将输出最后一个标记,即"xpath://a"或"xpath:/cs"
这是Firebug的getElementXPath函数,我刚刚将它粘贴在JS文件的顶部。
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;
};
当您收听"page.error"
事件时,您会看到类似的内容
错误:ReferenceError:找不到变量:getElementXPath
这与您在页面中包含该代码的方式有关。以下完整的脚本适用于我:
var casper = require('casper').create();
// http://docs.casperjs.org/en/latest/events-filters.html#page-error
casper.on("page.error", function(msg, trace) {
this.echo("Error: " + msg);
// maybe make it a little fancier with the code from the PhantomJS equivalent
});
casper.start('http://example.com');
casper.then(function() {
this.evaluate(function(){
window.getElementXPath = function(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;
};
});
this.echo(this.evaluate(function(){
return getElementXPath(document.querySelector("a"));
}));
});
casper.run();
输出:
/html/body/div/p[2]/a
诀窍是使getElementXPath
在页面上下文的全局范围内可用。这可以通过在window.getElementXPath
上设置变量来轻松实现。
相关文章:
- 在 JavaScript 中查找包含 XPath 字符串的所有元素
- CasperJS可以't使用CSS选择器或xPath查找元素
- 使用 jQuery 获取 DOM 元素的 XPath
- 计算CasperJS中给定元素的XPath
- 如何使用xpath计算父元素的子元素的深度
- 如何使用XPath表达式在CasperJS中检索元素的属性
- 当我尝试两个 DOM 中的 get 元素时,HTML 和 Xpath 结果未定义
- 如何在 QTP 中通过 xpath 从 iframe 查找元素
- 在属性名称中搜索带有冒号的 xpath 表达式会引发异常(节点.js元素树模块)
- XPath 表达式,用于按源顺序选择 *所有* 元素、文本节点和注释节点
- 在 Internet Explorer 中使用 javascript 和 XPATH 获取元素
- XPath 元素/对象在使用 document.evaluate 时未定义
- 如何使用Greasemonkey来隐藏XPath元素
- XPath如何查找具有CSS类名的第二个元素
- 使用带有selenium的xpath选择元素的文本
- 如何使用XPath或CSS选择可见元素
- 从XPath打印元素会导致多个元素
- 获取所选元素的元素XPath
- 使用xpath脚本从html源代码中提取元素
- 如何使用firebug函数查找选定的元素xpath