在 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 的 find_element()和find_elements()
关于Python selenium,无法使用,find_element求大神指点