Генерировать абсолютный путь xpath данного веб-элемента в RSelenium [R] - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь повторить то, что было сделано в этом ответе для java selenium в RSelenium: 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]]

В идеале тогда я мог бы сгенерировать xpath элемента selected_a, используя приведенную ниже функцию make:

#desired function
getElementXPATH(selected_a) 

Я понимаю, что для одного и того же элемента можно указать несколько разных XPATH, я просто смотрюдля уникального идентификатора xpath для элемента, поэтому любой уникальный xpath для элемента будет достаточным!

Спасибо!

1 Ответ

1 голос
/ 18 июня 2019

Лично я не большой поклонник абсолютного xpath.Однако вы можете получить абсолютный xpath, используя javascript, вместо этого имея функцию на вашем языке, которая будет работать быстрее и легко портировать.

Вот 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.

Давайте попробуем получить абсолютный xpath enter image description here в стековом потоке.

Примечание. Не проверял приведенную ниже логику кода из-за отсутствия среды на моем компьютере.

# 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))

Снимок экрана: Запустил JavaScript вбраузерная консоль Chrome для улик enter image description here

...