find_element_by_* 命令在 Selenium 中已弃用
- 2024-12-30 08:42:00
- admin 原创
- 105
问题描述:
启动功能时
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
当文档中存在该命令时。
解决方案 1:
此错误信息:
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
解决方案 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)
解决方案 3:
正如其他人提到的,您应该使用find_element()
orfind_elements()
而不是find_element_by_*()
or 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$2E, $3
注意:你需要导入行才能使用新方法
from selenium.webdriver.common.by import By
解决方案 4:
感谢@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) \n .send_keys("abc") \n .perform()
test_key_down(browser)