属性错误: 'WebDriver'对象没有'find_element_by_xpath'属性。

71
from selenium import webdriver
import time

test = webdriver.Chrome()
test.get('https://docs.google.com/forms/d/e/1FAIpQLSeYUmAYYZNtbU8t8MRxwJo-        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)
当我执行这段代码时,出现了一个错误,提示说:
AttributeError: 'WebDriver' 对象没有 'find_element_by_xpath' 属性。
4个回答

152
Selenium在版本4.3.0中删除了该方法。请参见更改记录:https://github.com/SeleniumHQ/selenium/blob/a4995e2c096239b42c373f26498a6c9bb4f2b3e7/py/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

你现在需要使用:

driver.find_element("xpath", '//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input')

在您的例子中,您将使用:

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')
为了提高可靠性,您应考虑将WebDriverWaitelement_to_be_clickable结合使用。

1
谢谢,它起作用了,但你是从哪里学到这种新方法的?我刚看了文档,它提到了旧的方法。 - fireslayer47
10
我是Selenium技术领导委员会的成员,我会在网上与团队交流,并偶尔进行视频通话。(更新方面的信息我都能够掌握。) - Michael Mintz
1
哦!如果可能的话,请尽量保持与旧版本的兼容性和/或提前包含弃用警告... - Peter
2
之前有一个弃用警告(假设它没有被忽略)。我不赞成Selenium委员会高层领导的决定,即删除与旧脚本的兼容性。我创建了SeleniumBase来以稍微不同的方式处理事情,并且旧方法不会被删除。2016年的脚本仍然可以在最新版本中使用。 - Michael Mintz
2
@Swannie 查找多个元素并创建列表的代码为:driver.find_elements(by=by, value=selector) - Michael Mintz
显示剩余2条评论

25

现在您可以使用:

from selenium.webdriver.common.by import By

driver.find_element(by=By.XPATH, value='//<your xpath>')

3
在Selenium 4及以上版本中,使用XPath是实现这一目标的完美方式。 - Tanveer Ahmad

17
根据 Selenium 4.3.0 的 更新日志
Selenium 4.3.0
* Deprecated find_element_by_* and find_elements_by_* are now removed (#10712)

根据 合并 的内容,更换的16个字符串如下:
.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,

这个用例

实际上,您需要替换以下代码行:

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 = 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')

注意

您还需要按照以下方式导入By

from selenium.webdriver.common.by import By

0

e = driver.find_element(by.By.XPATH,'//label[@analytics-event="All matches"]') from selenium.webdriver.common import by

e = driver.find_element(by.By.XPATH,'//label[@analytics-event="All matches"]') 从selenium.webdriver.common导入by


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接