How to select element using XPATH syntax on Selenium for Python?

Question:

consider following HTML:

<div id='a'>
  <div>
    <a class='click'>abc</a>
  </div>
</div>

I want to click abc, but the wrapper div could change, so

driver.get_element_by_xpath("//div[@id='a']/div/a[@class='click']")

is not what I want

i tried:

 driver.get_element_by_xpath("//div[@id='a']").get_element_by_xpath(.//a[@class='click']")

but this would not work with deeper nesting

any ideas?

Asked By: user2534633

||

Answers:

HTML

<div id='a'>
  <div>
    <a class='click'>abc</a>
  </div>
</div>

You could use the XPATH as :

//div[@id='a']//a[@class='click']

output

<a class="click">abc</a>

That said your Python code should be as :

driver.find_element_by_xpath("//div[@id='a']//a[@class='click']")
Answered By: Arup Rakshit

Check this blog by Martin Thoma. I tested the below code on MacOS Mojave and it worked as specified.

> def get_browser():
>     """Get the browser (a "driver")."""
>     # find the path with 'which chromedriver'
>     path_to_chromedriver = ('/home/moose/GitHub/algorithms/scraping/'
>                             'venv/bin/chromedriver')
>     download_dir = "/home/moose/selenium-download/"
>     print("Is directory: {}".format(os.path.isdir(download_dir)))
> 
>     from selenium.webdriver.chrome.options import Options
>     chrome_options = Options()
>     chrome_options.add_experimental_option('prefs', {
>         "plugins.plugins_list": [{"enabled": False,
>                                   "name": "Chrome PDF Viewer"}],
>         "download": {
>             "prompt_for_download": False,
>             "default_directory": download_dir
>         }
>     })
> 
>     browser = webdriver.Chrome(path_to_chromedriver,
>                                chrome_options=chrome_options)
>     return browser
Answered By: Gayathry

In the latest version 4.x, it is now:

elem = driver.find_element(By.XPATH, "/html/body/div[1]/div/div[2]/h2/a")

To import By:

from selenium.webdriver.common.by import By
Answered By: Stéphane Bruckert

Selenium 4.X ~
In the real-world scenario, we need to filter the XPATH to extract the data.
For example, below Amazon’s website:
https://www.amazon.ca/gp/product/B09NZ72B5X/ref=ewc_pr_img_1?smid=A3VU3XJC72QOSZ&th=1

while extracting the XPATH for an item, we get "/text()" in the end. I removed it and it worked for me.

XPATH

price = driver.find_element(By.XPATH, ‘//*[@id="corePriceDisplay_desktop_feature_div"]/div[1]/span[1]/span[2]/span[2]’)
print(price.text)

Answered By: iamanshulstack
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.