Selenium - Python - AttributeError:“WebDriver”对象没有属性“find_element_by_name”

Ale*_*sss 118 python selenium google-chrome selenium-chromedriver selenium-webdriver

我正在尝试让 Selenium 与 Chrome 一起使用,但我不断遇到此错误消息(以及其他类似的错误消息):

AttributeError:“WebDriver”对象没有属性“find_element_by_name”

find_element_by_id()find_element_by_class()等也会出现同样的问题。

我也打不通电话send_keys()

我只是运行ChromeDriver - WebDriver for Chrome - Getting Started中提供的测试代码。

import time

from selenium import webdriver

driver = webdriver.Chrome("C:/Program Files/Chrome Driver/chromedriver.exe")  # Path to where I installed the web driver

driver.get('http://www.google.com/');

time.sleep(5) # Let the user actually see something!

search_box = driver.find_element_by_name('q')

search_box.send_keys('ChromeDriver')

search_box.submit()

time.sleep(5) # Let the user actually see something!

driver.quit()
Run Code Online (Sandbox Code Playgroud)

我使用的是 Google Chrome 版本 103.0.5060.53 并从Downloads下载了 ChromeDriver 103.0.5060.53 。

运行代码时,Chrome 打开并导航到 google.com,但它收到以下输出:

import time

from selenium import webdriver

driver = webdriver.Chrome("C:/Program Files/Chrome Driver/chromedriver.exe")  # Path to where I installed the web driver

driver.get('http://www.google.com/');

time.sleep(5) # Let the user actually see something!

search_box = driver.find_element_by_name('q')

search_box.send_keys('ChromeDriver')

search_box.submit()

time.sleep(5) # Let the user actually see something!

driver.quit()
Run Code Online (Sandbox Code Playgroud)

注意:我替换了这篇文章的文件路径。

我认为 DevTools 监听部分与该问题无关,但我想我应该将其包括在内,以防万一。

Mic*_*ntz 176

Selenium 刚刚在 version 中删除了该方法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
Run Code Online (Sandbox Code Playgroud)

您现在需要使用:

driver.find_element("name", "q")
Run Code Online (Sandbox Code Playgroud)

在你的例子中,它将变成:

search_box = driver.find_element("name", "q")

search_box.send_keys('ChromeDriver')

search_box.submit()
Run Code Online (Sandbox Code Playgroud)

为了提高可靠性,您应该考虑WebDriverWait与 结合使用element_to_be_clickable

  • 这有效,谢谢!我确实希望有人能够更新 ChromeDriver 入门页面以包含这个新方法,这样可以省去很多麻烦。 (6认同)
  • 请注意,如果您想查找多个元素,则必须添加 ``s```,因此现在是 ```find_elements()```,而不是 ```find_elements_by_*```。看到这个做得很好的答案:/sf/ask/4891258781/ (3认同)

小智 61

您需要使用以下代码导入Selenium WebDriver :

\n
from selenium.webdriver.common.by import By\n
Run Code Online (Sandbox Code Playgroud)\n

接下来使用这个API:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
旧API新的API
按 id 查找元素(\xe2\x80\x98id\xe2\x80\x99)find_element(By.ID, \xe2\x80\x98id\xe2\x80\x99)
按名称查找元素(\xe2\x80\x98名称\xe2\x80\x99)find_element(By.NAME, \xe2\x80\x98name\xe2\x80\x99)
find_element_by_xpath(\xe2\x80\x98xpath\xe2\x80\x99)find_element(By.XPATH, \xe2\x80\x98xpath\xe2\x80\x99)
\n
\n

等等。

\n

来源:修复 Selenium AttributeError: \xe2\x80\x98WebDriver\xe2\x80\x99 对象没有属性 \xe2\x80\x98find_element_by_xpath\xe2\x80\x99

\n


小智 36

find_element_by_* 和 find_elements_by_* 已弃用。您可以使用find_element()代替。

首先你必须导入:

from selenium.webdriver.common.by import By
Run Code Online (Sandbox Code Playgroud)

然后你可以使用它:

driver.find_element(By.XPATH, " ")
driver.find_elements(By.XPATH, " ")

driver.find_element(By.CLASS_NAME, " ")
driver.find_elements(By.CLASS_NAME, " ")
Run Code Online (Sandbox Code Playgroud)

等等..请参阅 find_element() API 了解所有用法


小智 9

感谢Michael-Mintz 和 Federikowsky 提供了根本原因的线索。

就我而言,我无法编辑代码以与最新的 Selenium 版本兼容。因此,作为解决方法,我将 Selenium 降级到 4.2.0。

对于Python 3:

  1. 确保您的 Selenium 为 4.3.0 或更高版本。启动 Python 交互式会话并运行:

    >>> import selenium
    >>> selenium.__version__
    
    Run Code Online (Sandbox Code Playgroud)
  2. 降级你的硒