3
browser = webdriver.Firefox()
browser.get("http://www.example.com/admin/orders")
total_images = len(browser.find_elements_by_xpath('/html/body/div[5]/div[3]/div[1]/div[3]/div[4]/form[1]//img'))
for i in range(1,total_images):
            compiledData['item_url'] = browser.find_elements_by_xpath(browser.xpath('/html/body/div[5]/div[3]/div[1]/div[3]/div[4]/form[1]//img[')+str(']'))

Now what I need is the actual path of the element. As you can see that I am looping through the range of images within a dynamic xpath code. Now if I am in a loop and there I need the exact xpath of that current dynamically identified image xpath

For example, if it is running for the first image then it should give:

/html/body/div[5]/div[3]/div[1]/div[3]/div[4]/form[1]/img[1]

if it's running for second time then:

/html/body/div[5]/div[3]/div[1]/div[3]/div[4]/form[1]/img[2]

I want to extract this actual xpath of that current node within that loop

Now something like the PHP one:

$breakup = $xpath->query('/html/body/div[5]/div[3]/div[1]/div[3]//*[text()="Package total"]');
if($breakup->length != 0)
{
    $breakupPath = substr($breakup->item(0)->getNodePath(), 0, -2)."2]";
    $orderData['total'] = str_replace("Rs.", "", trim($xpath->query($breakupPath)->item(0)->nodeValue));
}

Where, $breakup->item(0)->getNodePath() gives the real xPath of the dynamically identified xPath

1 Answer 1

4
+100

One option here would be to use one of the XPath generating functions suggested here:

And execute them using execute_script(). Example code:

from selenium import webdriver


driver = webdriver.Firefox()
driver.get("http://www.w3schools.com/")


driver.execute_script("""
window.getPathTo = function (element) {
    if (element.id!=='')
        return 'id("'+element.id+'")';
    if (element===document.body)
        return element.tagName;

    var ix= 0;
    var siblings= element.parentNode.childNodes;
    for (var i= 0; i<siblings.length; i++) {
        var sibling= siblings[i];
        if (sibling===element)
            return window.getPathTo(element.parentNode)+'/'+element.tagName+'['+(ix+1)+']';
        if (sibling.nodeType===1 && sibling.tagName===element.tagName)
            ix++;
    }
}
""")

element = driver.find_element_by_class_name("w3-fluid")

generated_xpath = driver.execute_script("return window.getPathTo(arguments[0]);", element)
print(generated_xpath)

Another option would be to get the source of a page and feed it to lxml.html HTML parser which has getPath() method:

from selenium import webdriver
import lxml.html


driver = webdriver.Firefox()
driver.get("http://www.w3schools.com/")

tree = lxml.html.fromstring(driver.page_source)
root = tree.getroottree()

driver.close()

element = tree.xpath("//*[@class='w3-fluid']")[0]
print(root.getpath(element))
Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for the answer, lemme check and will update you.
@DjangoAnonymous So, did you check whether this answer is worth your bounty?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.