2009-04-18 55 views
0

我想修改gremonmonkey脚本中的gmail。使用xpather我可以得到我想要隐藏的部分的xpath表达式。但使用以下片段我无法获得匹配。警报功能从未被调用。任何人都可以指出我做错了什么?xpath greasemonkey

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"); 
} 

@Alan风暴

我安装Firebug的使用控制台它的工作原理但我仍然不能得到它的下Greasemonkey的工作测试脚本。 Greasemonkey仍然没有给我一个警戒框。我也尝试添加一个没有帮助的加载事件监听器。

+0

@Hamza,这听起来像你有超过xpath的问题。如果您发布了完整的greasemonkey脚本,其他人可能会提供帮助。 – 2009-04-18 16:15:12

回答

2

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

请记住,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")] 
+0

如果我运行 var canvas = window.frames [document.getElementById('canvas_frame')。name] .document;如果(画布)警报('有画布');我没有得到警报。如果我运行var canvas = document.getElementById('canvas_frame');如果(画布)警报('有画布');我确实得到了一个警报,但画布不具备评估功能。我究竟做错了什么? – 2011-04-21 11:47:44