【问题标题】:Generate Absolute xpath of given webElement in RSelenium [R]在 RSelenium [R] 中生成给定 webElement 的绝对 xpath
【发布时间】:2019-06-18 01:55:02
【问题描述】:

我正在尝试复制 RSelenium 中 java selenium 的这个答案中所做的事情: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 标识符,所以 任何 元素的唯一 xpath 就足够了!

谢谢!

【问题讨论】:

    标签: r selenium xpath getelementbyid rselenium


    【解决方案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))
    

    屏幕截图: 在 chrome 浏览器控制台中运行 javascript 以获取证据

    【讨论】:

    • 能否请您告诉我与 RSelenium 搭配使用的是谁。只是想确保我提供的 RSelenium 语法是正确的。
    • 是的,我会的。我可能会在今天晚些时候回到这个话题。谢谢!
    • 能否让我知道这是否解决了问题?
    【解决方案2】:

    请尝试以下逻辑

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多