Attributeerror: 'Webdriver' Object Has No Attribute 'Find_Element_By_Xpath'
From Selenium Import Webdriver Import Time Test = Webdriver. Chrome() Test. Get(' D1Zkmsaehodjxs78Rzog0Yfy2W/Viewform') Time. Sleep(5) Name = 'Kuch Bhi' Last =...
from selenium import webdriver
import time
test = webdriver.Chrome()
test.get(' d1zkmSaEHodJXs78RzoG0yFY2w/viewform')
time.sleep(5)
Name = 'kuch bhi'
last = test.find_element_by_xpath('//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input')
last.send_keys(Name)
When i execute the code, I get an error that says,
AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'
4 Answers
Selenium just removed that method in version 4.3.0. See the CHANGES:
Selenium 4.3.0
* Deprecated find_element_by_* and find_elements_by_* are now removed (#10712)
* Deprecated Opera support has been removed (#10630)
* Fully upgraded from python 2x to 3.7 syntax and features (#10647)
* Added a devtools version fallback mechanism to look for an older version when mismatch occurs (#10749)
* Better support for co-operative multi inheritance by utilising super() throughout
* Improved type hints throughout
You now need to use:
driver.find_element("xpath", '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input')
In your example, you would use:
last = test.find_element("xpath", '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input')
For improved reliability, you should consider using WebDriverWait in combination with element_to_be_clickable.
You can now use:
from selenium.webdriver.common.by import By
driver.find_element(by=By.XPATH, value='//<your xpath>')
As per the changelogs of Selenium 4.3.0:
Selenium 4.3.0
* Deprecated find_element_by_* and find_elements_by_* are now removed (#10712)
and as per the merge the 16 replaced strings are as follows:
.find_element_by_class_name(
.find_element(By.CLASS_NAME,
.find_element_by_css_selector(
.find_element(By.CSS_SELECTOR,
.find_element_by_id(
.find_element(By.ID,
.find_element_by_link_text(
.find_element(By.LINK_TEXT,
.find_element_by_name(
.find_element(By.NAME,
.find_element_by_partial_link_text(
.find_element(By.PARTIAL_LINK_TEXT,
.find_element_by_tag_name(
.find_element(By.TAG_NAME,
.find_element_by_xpath(
.find_element(By.XPATH,
.find_elements_by_class_name(
.find_elements(By.CLASS_NAME,
.find_elements_by_css_selector(
.find_elements(By.CSS_SELECTOR,
.find_elements_by_id(
.find_elements(By.ID,
.find_elements_by_link_text(
.find_elements(By.LINK_TEXT,
.find_elements_by_name(
.find_elements(By.NAME,
.find_elements_by_partial_link_text(
.find_elements(By.PARTIAL_LINK_TEXT,
.find_elements_by_tag_name(
.find_elements(By.TAG_NAME,
.find_elements_by_xpath(
.find_elements(By.XPATH,
Must Read
This usecase
So effectively you have to replace the line of code:
last = test.find_element_by_xpath('//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input')
as:
last = test.find_element(By.XPATH, '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input')