在RSelenium中生成给定webElement的绝对xpath [R]

时间:2019-06-18 01:55:02

标签: r selenium xpath getelementbyid rselenium

我正在尝试针对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就足够了!

谢谢!

2 个答案:

答案 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中获取enter image description here的绝对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))

截屏在chrome浏览器控制台中运行javascript以获取证据 enter image description here

答案 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]"