获取节点下所有文本节点的绝对xpath

时间:2019-05-06 05:32:27

标签: python selenium xpath

我有一个通过添加3个字符串构成的xpath

path_prefix='(.//tr|.//div[not(ancestor::div)][not(descendant::tr)])[3]'
r1=u'Company  (Name in which such subsidiary conducts business if other than corporate name):  '
path=path=path_prefix+"//*[text()="+"'"+r1+"'"+"]"

当我在浏览器中运行此路径时,它运行正常。但是,当我尝试使用execute_javascript在selenium上运行它时,它给出了一个null元素。

stg="var element=document.evaluate("+'"'+path+'"'+",document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;return element.getBoundingClientRect()"
driver.execute_script(str(stg))

此外,我在运行代码时检查了一下,我的stg元素看起来像这样。 (添加了“ \”,但在浏览器中仍然可以正常使用)

stg='var element=document.evaluate("(.//tr|.//div[not(ancestor::div)][not(descendant::tr)])[3]//*[text()=\'Company  (Name in which such subsidiary conducts business if other than corporate name):  \']",document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;return element.getBoundingClientRect()'

编辑:(OP的评论)

主要问题是。我想提取html页面及其xpath中存在的所有文本节点。 xpath应该从html / / / ...开始。有没有更好的方法或已经存在的任何库。

1 个答案:

答案 0 :(得分:0)

如果要获取html中所有textnodes的绝对xpath,我建议使用Javascript会更快,更简单。您只需要忽略脚本中的“↵”即可。

这是用python实现的Javascript解决方案。

注意:数组输出将具有“ text-absolutexpath”对。

  # this is the custom javascript developed to get the absolute xpaths for all 
  # textnodes under given element using TreeWalker
  jsFunction = """window.getAbsoluteXpathsUnder =function(el){
  var nText ='';
  var aPath ='';
  var elm="";
  var tNode, aPaths=[], walk=document.createTreeWalker(el,NodeFilter.SHOW_TEXT,null,false);
  while(tNode=walk.nextNode()){
        nText = tNode.textContent;
        if (nText.trim()!=""){
        aPath='';
        elm = tNode.parentNode;
        while (elm.tagName!='HTML'){ aPath = elm.tagName + "/" +aPath; elm=elm.parentNode;}
         aPaths.push(nText + " - HTML/" + aPath);
        }
  }
  return aPaths;
};"""
# Run the Javascript function
driver.execute_script(jsFunction)
# get the all text node absolute xpaths under first "div table"
aXpaths = driver.execute_script("return getAbsoluteXpathsUnder(arguments[0])",driver.find_elements_by_css_selector('div table')[0])
print(aXpaths)

这是输出enter image description here

页面中有3个这样的表,您可能不得不调用aXpaths = driver.execute_script("return getAbsoluteXpathsUnder(arguments[0])",ele) 3次或使用循环。