5

I tried to use Selenium with Chrome but was unable to find elements on the page, I tried it with link text, XPath, full XPath but there was just one error and it wasn't clicking on the element.

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver= webdriver.Chrome()
driver.get("https://www.youtube.com/")
print(driver.title)
driver.find_element_by_xpath("//*[@id='search']").click()

Output:

 UserWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  warnings.warn("find_element_by_* commands are deprecated. Please use find_element() instead")
SeleniumUser
  • 3,833
  • 2
  • 6
  • 23
Amaan001
  • 53
  • 1
  • 1
  • 3

7 Answers7

10

This error message...

 UserWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  warnings.warn("find_element_by_* commands are deprecated. Please use find_element() instead")

...implies that the find_element_by_* commands are now associated with a deprecation warning in the latest Selenium Python libraries.

This change is inline with the Selenium 4 Release Candidate 1 changelog which mentions:

Specify that the "find_element_by_* ..." warning is a deprecation warning (#9700)


Solution

Instead of find_element_by_* you have to use find_element(). As an example:

You need to add the following import:

from selenium.webdriver.common.by import By
  • Using xpath:

    driver.find_element_by_xpath("//*[@id='search']").click()
    

    Needs be replaced with:

    driver.find_element(By.XPATH, "//*[@id='search']").click()
    

Likewise you also have to consider the following changes:

  • Using class_name:

    element = find_element_by_class_name("element_class_name")
    

    Needs be replaced with:

    element = driver.find_element(By.CLASS_NAME, "element_class_name")
    
  • Using id:

    element = find_element_by_id("element_id")
    

    Needs be replaced with:

    element = driver.find_element(By.ID, "element_id")
    
  • Using name:

    element = find_element_by_name("element_name")
    

    Needs be replaced with:

    element = driver.find_element(By.NAME, "element_name")
    
  • Using link_text:

    element = find_element_by_link_text("element_link_text")
    

    Needs be replaced with:

    element = driver.find_element(By.LINK_TEXT, "element_link_text")
    
  • Using partial_link_text:

    element = find_element_by_partial_link_text("element_partial_link_text")
    

    Needs be replaced with:

    element = driver.find_element(By.PARTIAL_LINK_TEXT, "element_partial_link_text")
    
  • Using tag_name:

    element = find_element_by_tag_name("element_tag_name")
    

    Needs be replaced with:

    element = driver.find_element(By.TAG_NAME, "element_tag_name")
    
  • Using css_selector:

    element = find_element_by_css_selector("element_css_selector")
    

    Needs be replaced with:

    element = driver.find_element(By.CSS_SELECTOR, "element_css_selector")
    

tl; dr

You can find a couple of relevant detailed discussion in:

undetected Selenium
  • 151,581
  • 34
  • 225
  • 281
4

As per your comment you are using selenium webdriver version 4.0.0a5 which is not stable though. There is the potential that features may be added/removed between this release. Can you switch back to 3.141.59 and give a try :

enter image description here

driver = webdriver.Chrome(executable_path="C:\New folder\chromedriver.exe",chrome_options=chrome_options)
url = 'http://www.youtube.com'
driver.get(url)
driver.maximize_window()
wait = WebDriverWait(driver, 20)

element = wait.until(EC.presence_of_element_located((By.XPATH, "//form[@id='search-form']//div[@id='container']//div[@id='search-input']//input")))

actionChains = ActionChains(driver)
actionChains.move_to_element(element).click().perform()
actionChains.move_to_element(element).send_keys("Test",Keys.RETURN).perform()

Note : please add below imports to your solution

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
SeleniumUser
  • 3,833
  • 2
  • 6
  • 23
0

I changed the xpath of the search box to (there are multiple elements with id 'search'): driver.find_element_by_xpath("//input[@id='search']").click()

I then ran your code and it worked with no errors or warnings. Do this fix it for you?

Also, I don't know what you're trying to accomplish overall, but if you want to search something then you don't need to click the search bar first, you could just do.

driver.find_element_by_xpath("//input[@id='search']").send_keys("Your search query")
driver.find_element_by_xpath("//button[@id='search-icon-legacy']").click()

As for the warning: "find_element_by_* commands are deprecated. Please use find_element() instead" I believe that is because selenium is wanting you to use:

from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//input[@id='search']')
Peter
  • 563
  • 4
  • 12
0

I just found something on selenium documentation. Try use this:

driver.findElement(By.id("search"))

I hope it works.

0

You can just use:

driver.find_element_by_id('search')

For more info read the doc

rafalou38
  • 540
  • 1
  • 5
  • 15
0

It just because of the version.

pip install selenium==3.14.0
Turbo -V9
  • 11
  • 2
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Oct 27 '21 at 06:17
0

You would have to first import the By from selenium

from selenium.webdriver.common.by import By 

driver.find_element(By.XPATH, '//input[@id='search']')

This would work.

Suraj Rao
  • 28,850
  • 10
  • 94
  • 99