是否可以根据光标在网页上的位置自动生成最具体的XPath表达式?XPath表达式将随着“onMouseMove事件”的变化而改变。
如果可能,您将如何实现?或者它已经在某些Javascript或Python库中实现了吗?我更喜欢使用Python与某些Web库的组合,但Javascript也是可以接受的。
是否可以根据光标在网页上的位置自动生成最具体的XPath表达式?XPath表达式将随着“onMouseMove事件”的变化而改变。
如果可能,您将如何实现?或者它已经在某些Javascript或Python库中实现了吗?我更喜欢使用Python与某些Web库的组合,但Javascript也是可以接受的。
我曾经回答过一个几乎相同的问题(使用jQuery),链接在 这里
如果你把click
事件改成mouseenter
,你就可以得到你所要求的。
$(document).delegate('*','mouseenter',function(){
var path = $(this).parents().andSelf();
var xpath='/';
for (var i = 0; i < path.length; i++)
{
var nd = path[i].nodeName.toLowerCase();
xpath += '/';
if (nd != 'html' && nd != 'body')
{
xpath += nd;
if (path[i].id != '')
{
xpath += '#' + path[i].id;
}
else
{
xpath += '['+ ($(path[i-1]).children().index(path[i])+1) +']';
}
if (path[i].className != '')
xpath += '.' + path[i].className;
}
else
{xpath += nd;}
}
$('#xpath').html(xpath); // show the xpath in an element with id xpath..
return false;
});
演示地址 http://jsfiddle.net/gaby/hsv97/25/
更新,无需使用jQuery(适用于现代浏览器)
function getXpath(event){
var hierarchy = [],
current = event.srcElement||event.originalTarget;
while (current.parentNode){
hierarchy.unshift(current);
current = current.parentNode;
}
var xPath = hierarchy.map(function(el,i){
return el.nodeName.toLowerCase() + ((el.id !== '') ? '#'+el.id : '') + ((el.className !== '') ? '.'+el.className.split(' ').join('.') : '');
}).join('/');
document.getElementById('xpath').innerHTML = xPath;
return xPath;
}
if (document.addEventListener){
document.addEventListener('mouseover', getXpath, false);
} else {
document.onmouseover = getXpath;
}
JQuery
还不在我的技能范围内,所以我不理解它。 - xralf在DZone Snippets中查找XPath,请参见获取XPath线程。要识别鼠标光标是否悬停在元素上,请参见此处的jQuery中如何检查鼠标是否悬停在元素上的问题。
JQuery
部分最好用 Javascript
,但我可以在另一个问题中询问如何检查鼠标位置。 - xralf使用原生JavaScript(带索引)http://jsfiddle.net/nycu2/1/
function nodeindex(element, array) {
var i,
found = -1,
element_name = element.nodeName.toLowerCase(),
matched
;
for (i = 0; i != array.length; ++i) {
matched = array[i];
if (matched.nodeName.toLowerCase() === element_name) {
++found;
if (matched === element) {
return found;
}
}
}
return -1;
}
function xpath(element, suffix) {
var parent, child_index, node_name;
parent = element.parentElement;
if (parent) {
node_name = element.nodeName.toLowerCase();
child_index = nodeindex(element, parent.children) + 1;
return xpath(parent, '/' + node_name + '[' + child_index + ']' + suffix);
} else {
return '//html[1]' + suffix;
}
}
function xpathstring(event) {
var
e = event.srcElement || event.originalTarget,
path = xpath(e, '');;
document.querySelector('.xpathresult').value = path;
highlight();
}
/*[1]/*[3]/*[5]/*[2]
这样的路径比/html/body/div[3]/em
更“具体”吗?你如何衡量“具体性”? - Has QUIT--Anony-MousseJQuery
是一个我现在没有时间学习的库,所以我更喜欢使用Javascript
或Python
,这会有所不同,因为我需要学习JQuery
的语法特点。 - xralf最具体
指的是每个标识最嵌套元素(没有其他子元素)且无歧义的语句(=无法使用此XPath表达式标识两个元素)。 - xralf