2014-12-02 584 views
0

我想问一些具体的问题。在谷歌Chrome插件中通过xpath获取元素值(javascript)

我正在尝试使用谷歌浏览器扩展程序实现一个应用程序,该应用程序从另一个Chrome扩展程序获取xpath。然后找到元素的价值,并用它做一些事情。

我在Chrome插件中有一个侦听器,它接收用户用光标指向的html元素的xpath的JSON。例如/HTML/BODY/DIV[@id='viewport']/DIV[@id='main']/DIV[@id='cnt']/DIV[6]/DIV[@id='rcnt']/DIV[3]/DIV[@id='center_col']/DIV[@id='res']/DIV[@id='search']/DIV[1]/DIV[@id='ires']/OL[@id='rso']/DIV[2]/LI[2]/DIV[1]/DIV[1]/DIV[1]/SPAN[1]

我想获取该元素的值。所以,如果:

<html> 
<body> 
<div>Hello<\div> 
<body> 

,我有xpath = /html[1]/body[1]/div[1]这个元素

我想获得字符串 “Hello”

我知道有一个函数在JavaScript中检索元素:

var xPathResult = document.evaluate(xPath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);

但我几乎总是检索null。 所有的代码在这里:

chrome.runtime.onConnectExternal.addListener(function (port) { 
    port.onMessage.addListener(function (msg) { 
     var index; 

     if (msg != null) { 
      // console.log("Received message: " + msg); 
      var objJSON = JSON.parse(msg); 

      for (index = 0; index < objJSON.length; ++index) { 
       var xpath = objJSON[index].xpath; 
       var url = objJSON[index].url; 

       if (xpath != "Not looking at browser") { 

         var xp = getElementByXPath(xpath); //returns null all the time 
         var value = xp.innerHTML; 
       } 
      } 
     } 

    }); 
}); 

var getElementByXPath = function (xPath) { 
    var xPathResult = document.evaluate(xPath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
    return xPathResult.singleNodeValue; 
}; 

你能帮忙吗?在xpaths中没有错误 - 在运行时没有错误的xpath抛出异常,如果我通过xpaths检查Chrome中的元素,它也看起来没问题。

回答

1

错误document。先看看Architecture Overview

您的后台脚本存在于一个特殊的不可见页面中,并且document引用该页面。

要访问当前选项卡的DOM,您需要注入一个content script并在那里执行您的代码。

+0

谢谢:)解决.. – 2014-12-06 18:15:35