Search code examples
pythonselenium-webdriverselenium-chromedriver

Selenium 4.6 for Python doesn't like it's own syntax for finding element by ID


For years I have used driver.find_element_by_id('foo'). Company did a computer refresh and the newer version (4.6) doesn't recognize that syntax. It wants be to use driver.find_element(By.ID, 'foo').

However I either get the error Undefined name 'By' or I get positional argument follows keyword argument. This happens even if I literally copy and paste the sample usage code within Spyder. The parser flags it before I even run anything.


Solution

  • from selenium.webdriver.common.by import By
    

    You just need the above imports statement to get rid of Undefined name 'By'

    Refer the simple code below for latest syntax:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://stackoverflow.com/")
    driver.find_element(By.XPATH, "//a[text()='Log in']").click()
    driver.quit()
    

    If you are wondering that there is no code to set path for driver.exe or WebDriverManager is not used to manage browser drivers, that's because starting selenium v4.6.0, you no longer need to set the path of driver.exe, new tool within selenium known as Selenium Manager will do the driver management.

    Few references: