Question: I am practicing Selenium in Python and I wanted to fetch all the links on a web page using Selenium.

For example, I want all the links in the `href=` property of all the `<a>` tags on <http://psychoticelites.com/>

I've written a script and it is working. But, it's giving me the object address. I've tried using the `id` tag to get the value, but, it doesn't work.

My current script:

```
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

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

assert "Psychotic" in driver.title

continue_link = driver.find_element_by_tag_name('a')
elem = driver.find_elements_by_xpath("//*[@href]")
#x = str(continue_link)
#print(continue_link)
print(elem)

```

Answer: 
```
driver.get(URL)
time.sleep(7)
elems = driver.find_elements_by_xpath("//a[@href]")
for elem in elems:
    print(elem.get_attribute("href"))
driver.close()

```

Note: Adding delay is very important. First run it in debug mode and Make sure your URL page is getting loaded. If the page is loading slowly, increase delay (sleep time) and then extract.

If you still face any issues, please refer below link (explained with an example) or comment

[Extract links from webpage using selenium webdriver](https://gethowstuff.com/extract-links-webpage-python-selenium-webdriver/)
All of the accepted answers using Selenium's `driver.find_elements_by_***` [no longer work](https://www.selenium.dev/documentation/webdriver/getting_started/upgrade_to_selenium_4/) with Selenium 4. The current method is to use `find_elements()` with the `By` class.

Method 1: For loop
==================

The below code utilizes 2 lists. One for `By.XPATH` and the other, `By.TAG_NAME`. One can use either-or. Both are not needed.

`By.XPATH` IMO is the easiest as it does not return a seemingly useless `None` value like `By.TAG_NAME` does. The code also removes duplicates.

```py
from selenium.webdriver.common.by import By

driver.get("https://www.amazon.com/")

href_links = []
href_links2 = []

elems = driver.find_elements(by=By.XPATH, value="//a[@href]")
elems2 = driver.find_elements(by=By.TAG_NAME, value="a")

for elem in elems:
    l = elem.get_attribute("href")
    if l not in href_links:
        href_links.append(l)

for elem in elems2:
    l = elem.get_attribute("href")
    if (l not in href_links2) & (l is not None):
        href_links2.append(l)

print(len(href_links))  # 360
print(len(href_links2))  # 360

print(href_links == href_links2)  # True

```

Method 2: List Comprehention
============================

If duplicates are OK, one liner list comprehension can be used.

```py
from selenium.webdriver.common.by import By

driver.get("https://www.amazon.com/")

elems = driver.find_elements(by=By.XPATH, value="//a[@href]")
href_links = [e.get_attribute("href") for e in elems]

elems2 = driver.find_elements(by=By.TAG_NAME, value="a")
# href_links2 = [e.get_attribute("href") for e in elems2]  # Does not remove None values
href_links2 = [e.get_attribute("href") for e in elems2 if e.get_attribute("href") is not None]

print(len(href_links))  # 387
print(len(href_links2))  # 387

print(href_links == href_links2)  # True

```