我正尝试在greasemonkey脚本中修改gmail。使用xpather,我可以获得我试图隐藏的部分的xpath表达式。但是使用下面的代码片段我找不到匹配的。永远不会调用alert函数。谁能告诉我我做错了什么?
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 Storm
我安装了firebug,使用控制台测试了脚本,它可以工作,但我仍然无法让它在greasemonkey下工作。老天爷还是不给我一个警报箱。我还尝试添加一个加载事件侦听器,但也没有任何帮助。
发布于 2009-04-18 06:58:35
首先是一般的调试技巧,然后是针对您的问题所做的尝试。
请记住,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")]https://stackoverflow.com/questions/762844
复制相似问题