在 selenium 中不推荐使用 find_element_by_* 命令

Posted

技术标签:

【中文标题】在 selenium 中不推荐使用 find_element_by_* 命令【英文标题】:find_element_by_* commands are deprecated in selenium 【发布时间】:2021-12-20 19:12:25 【问题描述】:

函数启动时

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` 

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

【问题讨论】:

试试这个。匹配您的查询。 ***.com/questions/61308799/… 【参考方案1】:

此错误消息...

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

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

作为@AutomatedTester mentions:这个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")

【讨论】:

NameError: name 'By' 未定义 从 selenium.webdriver.common.by 导入【参考方案2】:

@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)

【讨论】:

在这个例子中keys 是什么意思? @Arete, By and Key 将用于检测目标和输入数据! ,这几行是主要结构。【参考方案3】:

正如其他人提到的,您应该使用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

【讨论】:

【参考方案4】:

Unable to locate elements in Selenium (Python)

此更改与 Selenium 4 Release Candidate 1 一致 更改日志中提到

硒 4 会导致这种情况;我降级到 selenium==3.141.0(selenium 3 的最新版本)(selenium==3.0.0 有错误,所以不要走得太远哈哈)

它可以工作

【讨论】:

以上是关于在 selenium 中不推荐使用 find_element_by_* 命令的主要内容,如果未能解决你的问题,请参考以下文章

selenium中find_element和find_elements的区别

selenium BY定位

selenium 的 find_element()和find_elements()

关于Python selenium,无法使用,find_element求大神指点

Selenium find_elements 仅在 get() 之后经过时间时才有效

selenium—用NoSuchElementException异常判断页面元素是否存在