首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xpath greasemonkey

xpath greasemonkey
EN

Stack Overflow用户
提问于 2009-04-18 03:50:51
回答 1查看 1.9K关注 0票数 0

我正尝试在greasemonkey脚本中修改gmail。使用xpather,我可以获得我试图隐藏的部分的xpath表达式。但是使用下面的代码片段我找不到匹配的。永远不会调用alert函数。谁能告诉我我做错了什么?

代码语言:javascript
复制
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下工作。老天爷还是不给我一个警报箱。我还尝试添加一个加载事件侦听器,但也没有任何帮助。

EN

回答 1

Stack Overflow用户

发布于 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。当我尝试的时候

代码语言:javascript
复制
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),你的程序就会崩溃。相反,可以考虑这样的事情。

代码语言:javascript
复制
<!-- 
all divs on the page that contains an h1 element 
that contains the text "Gmail Logo" 
-->
//div[contains(./h1,"Gmail Logo")]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/762844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档