启动功能时
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
...当文档中存在该命令时。
这个错误信息...
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
@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)
正如其他人提到的,您应该使用
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
谢谢@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)