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.
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: