在给定e
句柄puppeteer
及其页面e
的情况下,此函数返回元素page
的XPath:
async function getXpathOfElement(page, e) {
return await page.evaluate(e => {
var xpath = "";
var pos, tmpitem2;
while (e !== document.documentElement) {
pos = 0;
tmpitem2 = e;
while (tmpitem2) {
// if is ELEMENT_NODE of the same name
if (tmpitem2.nodeType === 1 && tmpitem2.nodeName === e.nodeName) {
++pos;
}
tmpitem2 = tmpitem2.previousSibling;
}
xpath = e.nodeName + "[" + pos + ']' + '/' + xpath;
e = e.parentNode;
}
xpath = '/' + document.documentElement.nodeName + '/' + xpath;
xpath = xpath.replace(/\/$/, '');
return xpath;
}, e);
}
它按预期方式工作,但并非始终如此:对于page
和e
的一对特定对象,在while
完成一些循环之后,e.parentNode
变成{{1} },其中null
是有效的e
DOM节点,其父节点是<div>
,正如我从html所观察到的那样。
有趣的是,<li>
在发布之前完成了一些循环,因此部分遍历了DOM结构。