0

我正在尝试在greasemonkey 脚本中修改gmail。使用 xpather,我可以获得我想要隐藏的部分的 xpath 表达式。但是使用以下代码段我无法匹配。永远不会调用警报函数。谁能指出我做错了什么?

var allLinks, thisLink;
allLinks = document.evaluate(
     "//html/body/div[1]/div/div/div[1]/div/div[3]/div[1]/div[2]/div[2]/div[1]/div[1]",
     document,
     null,
     XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
     null);
for (var i = 0; i < allLinks.snapshotLength; i++) {
  thisLink = allLinks.snapshotItem(i);
  alert("found");
}

@艾伦风暴

我安装了firebug,使用控制台测试了它的脚本,但我仍然无法让它在greasemonkey下工作。Greasemonkey 仍然没有给我一个警告框。我还尝试添加一个加载事件侦听器,但也没有帮助。

4

1 回答 1

1

首先,一般调试技巧,然后刺你的问题。

请记住,Greasemonkey 脚本只是 javascript,您仍然可以使用所有可用的 Javascript 工具来调试您的问题。打开 gmail,启动Firebug,然后尝试直接在命令行上运行您的 javascript 代码(单击控制台行右侧的向上圆圈箭头以获得更大的输入区域)。

当我对您的 javascript 片段执行上述操作时, allLinks.snapshotLength 的计算结果为 0,表明您的 xpath 表达式不匹配任何内容。这很奇怪,因为当我使用XPath Checker时,它与徽标相匹配。

再深入一点,看起来 gmail 的主文档是许多 iframe,而 iframe 包含实际的应用程序元素。具体来说,有一个 ID 为“canvas_frame”的框架,其中包含应用程序界面的实际 DOM。当我尝试

canvas = window.frames[document.getElementById('canvas_frame').name].document;
allLinks = canvas.evaluate(
     "//html/body/div[1]/div/div/div[1]/div/div[3]/div[1]/div[2]/div[2]/div[1]/div[1]",
     canvas,
     null,
     XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
     null);

我得到一个长度为 1 的响应,这可能更适合您的需求。

最后,这不是必需的,但您的 xPath 表达式看起来有点脆弱。如果 gmail 稍微改变了文档结构(例如,使用包装器 div),您的程序就会中断。考虑这样的事情。

<!-- 
all divs on the page that contains an h1 element 
that contains the text "Gmail Logo" 
-->
//div[contains(./h1,"Gmail Logo")]
于 2009-04-18T06:58:34.953 回答