我正在尝试针对RSelenium中的Java硒复制此答案中的操作:https://stackoverflow.com/a/27611777/7837376
我很想能够做这样的事情:
#replicating simple RSelenium process getting all //a elements
library(RSelenium)
#start remDr etc. etc.
all_a <- remDr$findElements(using='xpath','//a')
selected_a <- all_a[[10]]
理想情况下,我可以使用下面的组合函数生成selected_a元素的xpath:
#desired function
getElementXPATH(selected_a)
我知道可以为同一元素指定许多不同的XPATH,我只是在寻找该元素的唯一xpath标识符,因此该元素的 any 唯一xpath就足够了!
谢谢!
答案 0 :(得分:1)
就我个人而言,我绝对不是绝对的xpath。但是,您可以使用javascript来获得绝对的xpath,而不是使用您的语言编写该函数,该函数运行速度更快并且易于移植。
这是JavaScript。
// this function will return the absolute xpath of any given element
jsFunction = """window.getAbsoluteXpath =function(el){
// initialize the variables
aPath ="";
// iterate until the tag name is 'HTML'
while (el.tagName!='HTML'){
// get parent node
pEle=el.parentNode;
// check if there are more than 1 nodes with the same tagname under the parent
if(pEle.querySelectorAll(el.tagName).length>1){
//now findout the index of the current child
cIndex = 0;
pEle.querySelectorAll(el.tagName).forEach(function(cEle){
cIndex= cIndex+1;
// check if iterating ChildNode is equal to current ChildNode
if(cEle === el){
// set the aPath using index
aPath = el.tagName + "[" + cIndex + "]" + "/" +aPath;
}
})
}else{
// simply add the tagName when there is only one child with the tag name
aPath = el.tagName + "/" +aPath;
}
// set parent node as current element
el=el.parentNode;
}
// append HTML to the absolute xpath generated
return "//HTML/"+aPath.substring(0,aPath.length-1);
};"""
现在,您可以在javascript中调用此方法,并传递您对获取绝对xpath感兴趣的元素。
让我们尝试在stackoverflow中获取的绝对xpath。
注意:由于我的计算机上缺少环境,因此未测试以下代码逻辑。
# run the javascript in browser so that you can call the function anytime in your script
remDr %>% executeScript(jsFunction, args = list())
# get stackoverflow `Achievements` link element
webElem <- remDr %>% findElement("css", "a.-link.js-achievements-button")
# # get the absolute xpath of Stackoverflow `Achievements`
remDr %>% executeScript("return getAbsoluteXpath(arguments[0])", args = list(webElem))
答案 1 :(得分:0)
请尝试以下逻辑
function absolutePath(element) {
if (element.tagName.toLowerCase() == 'html')
return '/html[1]';
if (element === document.body)
return '/html[1]/body[1]';
var ix = 0;
var siblings = element.parentNode.childNodes;
for (var i = 0; i < siblings.length; i++) {
var sibling = siblings[i];
if (sibling === element)
return absolutePath(element.parentNode) + '/' + element.tagName.toLowerCase() + '[' + (ix + 1) + ']';
if (sibling.nodeType === 1 && sibling.tagName.toLowerCase() === element.tagName.toLowerCase())
ix++;
}}
我确实尝试了supputuri提供的解决方案,但是它不适用于所有情况。 示例:尝试在https://www.amazon.in/上使用@suppututri提供的功能,并尝试找到的绝对xpath
var element=document.querySelector('#nav-xshop > a:nth-child(2)');
getAbsoluteXpath(element);
控制台中显示的不正确的xpath将是:"//HTML/BODY/DIV[1]/HEADER/DIV[1]/DIV[68]/DIV[9]/DIV[1]/DIV/A[1]"