find_element_by_* 命令在 Selenium 中已弃用

问题描述 投票:0回答:4

启动功能时

def run(driver_path):
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://tproger.ru/quiz/real-programmer/')
    button = driver.find_element_by_class_name("quiz_button")
    button.click()
run(driver_path)

我遇到这样的错误:

<ipython-input-27-c5a7960e105f>:6: DeprecationWarning: executable_path has been deprecated, please pass in a Service object
  driver = webdriver.Chrome(executable_path=driver_path)
<ipython-input-27-c5a7960e105f>:10: DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead
  button = driver.find_element_by_class_name("quiz_button")

...但我不明白为什么。

我正在为我的 Chrome 版本使用最新版本的 WebDriver。我不明白为什么我会这样

find_element_by_* commands are deprecated

...当文档中存在该命令时。

python selenium selenium-webdriver webdriver findelement
4个回答
204
投票

这个错误信息...

DeprecationWarning: find_element_by_* commands are deprecated. Please use find_element() instead

...意味着

find_element_by_*
命令在最新的 Selenium Python 库中已被弃用。

正如 AutomatedTester 提到的:这个 DeprecationWarning 反映了关于简化跨语言 API 的决定所做的更改,并且做到了这一点。


解决方案

相反,您必须使用

find_element()
。举个例子:

您必须包含以下导入内容

from selenium.webdriver.common.by import By
  • 使用

    class_name

    button = driver.find_element_by_class_name("quiz_button")
    

    需要替换为:

    button = driver.find_element(By.CLASS_NAME, "quiz_button")
    

沿着这条线,您还必须更改以下内容:

  • 使用

    id

    element = find_element_by_id("element_id")
    

    需要替换为:

    element = driver.find_element(By.ID, "element_id")
    
  • 使用

    name

    element = find_element_by_name("element_name")
    

    需要替换为:

    element = driver.find_element(By.NAME, "element_name")
    
  • 使用

    link_text

    element = find_element_by_link_text("element_link_text")
    

    需要替换为:

    element = driver.find_element(By.LINK_TEXT, "element_link_text")
    
  • 使用

    partial_link_text

    element = find_element_by_partial_link_text("element_partial_link_text")
    

    需要替换为:

    element = driver.find_element(By.PARTIAL_LINK_TEXT, "element_partial_link_text")
    
  • 使用

    tag_name

    element = find_element_by_tag_name("element_tag_name")
    

    需要替换为:

    element = driver.find_element(By.TAG_NAME, "element_tag_name")
    
  • 使用

    css_selector

    element = find_element_by_css_selector("element_css_selector")
    

    需要替换为:

    element = driver.find_element(By.CSS_SELECTOR, "element_css_selector")
    
  • 使用

    xpath

    element = find_element_by_xpath("element_xpath")
    

    需要替换为:

    element = driver.find_element(By.XPATH, "element_xpath")
    

注意: 如果您要通过搜索和替换来实现上述更改,则需要对

find_elements_*
(即
find_element_*
的复数形式)执行相同的操作。

您可能还会发现此升级指南很有用,因为它涵盖了升级时可能需要进行的一些其他不相关的更改:升级到 Selenium 4


10
投票

@DebanjanB 提到并解释了新结构。另外,最好使用这些行:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service

s = Service('C:/Users/.../chromedriver.exe')
driver = webdriver.Chrome(service=s)

4
投票

正如其他人提到的,您应该使用

find_element()
find_elements()
而不是
find_element_by_*()
find_elements_by_*()

我编写了正则表达式模式来将已弃用的方法替换为新方法,因此如果需要,请尝试此操作。

# from - e.g. find_element_by_id("test")

find_element(s?)_by_([a-z_]+)\((.*)

# to - e.g. find_element(By.ID, "test")

find_element$1(By.\U$2\E, $3

注意:您需要导入行才能使用新方法

from selenium.webdriver.common.by import By

0
投票

谢谢@Stephen 和未检测到的Selenium的回答。经过一段时间阅读如何在哪里找到

send_key
的示例后,我发现了一个令人惊叹的 示例要点

下面的

send_keys
示例对我有用:

browser = webdriver.Chrome()

 

def test_key_down(driver):
    driver.get('https://www.selenium.dev/selenium/web/single_text_input.html?#')

    ActionChains(driver) \
        .send_keys("abc") \
        .perform()

 

test_key_down(browser)

© www.soinside.com 2019 - 2024. All rights reserved.