Reputation: 945
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?
Upvotes: 39
Views: 206314
Reputation: 19
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.
price = driver.find_element(By.XPATH, '//*[@id="corePriceDisplay_desktop_feature_div"]/div[1]/span[1]/span[2]/span[2]')
print(price.text)
Upvotes: 0
Reputation: 22903
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
Upvotes: 6
Reputation: 32
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
Upvotes: -2
Reputation: 118271
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']")
Upvotes: 68