为什么XPath exaluate为/html/body提供snapshotLength=1,为/html/body/div[3]/div[3]/div/div[6]/div[2]/div/div/div提供0?

为什么XPath exaluate为/html/body提供snapshotLength=1,为/html/body/div[3]/div[3]/div/div[6]/div[2]/div/div/div提供0?,xpath,greasemonkey,document.evaluate,Xpath,Greasemonkey,Document.evaluate,你能告诉我为什么XPath exaluate会给出 snapshotLength = 1 for /html/body 0表示 /html/body/div[3]/div[3]/div/div[6]/div[2]/div/div/div 较长的XPath是实数,由Firepath为此页面上的对象计算 我在Greasemonkey中运行以下脚本 /==UserScript== //@name xpath greasemonkey //@namespace-bbb //@descr

你能告诉我为什么XPath exaluate会给出

  snapshotLength = 1 for /html/body 
0表示

  /html/body/div[3]/div[3]/div/div[6]/div[2]/div/div/div
较长的XPath是实数,由Firepath为此页面上的对象计算

我在Greasemonkey中运行以下脚本

/==UserScript==
//@name xpath greasemonkey
//@namespace-bbb
//@description f
//@匹配http://srv1.yogh.io/#mine:height:0
//@version 1
//@grant none
//==/UserScript==
var allLinks,thisLink;
console.log(“dfsg”);
allLinks=document.evaluate(
“/html/body/div”,
文件,
无效的
XPathResult.UNORDERED\节点\快照\类型,
无效);
//对于(var i=0;idocument.body.appendChild(输入)您的XPath实际上是正常的,如果您直接在浏览器控制台中输入它,它应该可以工作。问题在于区块链网页的内容是由脚本动态生成的,因此在执行用户脚本时,您正在查找的节点不存在

您需要延迟代码的运行,直到页面完成加载。userscript元数据指令应该能够实现这一点,但要么它在GreaseMonkey v4中被破坏,要么区块链脚本运行时间太长,您需要将userscript延迟更长时间。无论哪种方式,将代码包装在
setTimeout()
中都是一种简单的方法(检测另一个脚本何时完成会更优雅):

/==UserScript==
//@name xpath greasemonkey
//@namespace-bbb
//@description f
//@匹配http://srv1.yogh.io/
//@version 1
//@grant none
//==/UserScript==
setTimeout(函数(){
var allLinks,thisLink;
console.log(“dfsg”);
allLinks=document.evaluate(
“/html/body/div[3]/div[3]/div/div[6]/div[2]/div/div/div”,
文件,
无效的
XPathResult.UNORDERED\节点\快照\类型,
无效);
if(所有链接.快照长度){
log(allLinks.snapshotItem(0.innerHTML);
}否则{
console.log(“麻烦…”);
}

}, 5000);顺便说一句,我继承了上面的例子,我在学习伟大的XPath教程示例,但没有工具将网页转换为类似的树节点图什么是“XPath exaluate”?你是说“XPath评估”吗?或者“XPath评估”,考虑到它所处的环境,感谢@JRI给出的出色答案。自从我得到console.log(“麻烦…”)之后,我已经将您的脚本稍微修改为console.log(allLinks.snapshotLength);每次都被执行。超时增加到15000时,我得到DFSDFG 13 DFSDFG麻烦。。。0.看起来脚本执行了两次。已测试DFSG 2083236893…可下载字体:下载失败。。DFSDFG麻烦。。。0看起来像是allLinks.snapshotLength从1修改为0后续您的脚本稍微修改以获得更多Console.log超时设置为15000,并且脚本在GM3.17中执行两次,该脚本适用于FirefoxESR 52.2.1 32位。DFSDSDFG xpath_greasemonkey2.user.js:12:3 1 xpath_greasemonkey2.user.js:21:5 2083236893 xpath_greasemonkey2.user.js:22:5 DFSDSDDFG xpath_greasemonkey2.user.js:12:3。。。xpath_greasemonkey2.user.js:24:5 0 xpath_greasemonkey2.user.js:25:5是什么使GM脚本执行两次,并第二次将allLinks.snapshotLength从1切换到0?在GM4.1或v4.4中,该脚本仅为我运行一次。如果它运行两次,它可能会在IFrame和主网页上运行。在主页中快照长度仅为1,因为IFrame的结构不同。您可以通过测试if(window.self!==window.top)来检查这一点;或者{alert(“此窗口是最顶部的窗口!我在框架中吗?”);关闭控制台并单击按钮获取上述消息。不确定为什么脚本代码会立即执行,而不是等待15000ms窗口。setTimeout(function(){I get allLinks=document.evaluate(立即计算并同时在顶部显示Greasemonkey按钮,不等待15000。不确定如何延迟allLinks=document.evaluate(如果window.setTimeout(function()BTW)将更新的脚本附加到上面的代码段中供您查看。)