我有一个通过添加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 / / / ...开始。有没有更好的方法或已经存在的任何库。
答案 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)
页面中有3个这样的表,您可能不得不调用aXpaths = driver.execute_script("return getAbsoluteXpathsUnder(arguments[0])",ele)
3次或使用循环。