
在使用selenium进行web自动化时,开发者可能会遇到typeerror,尤其是在尝试通过find_elements_by_css_selector等方法定位元素时。这个错误通常不是因为代码逻辑上的缺陷,而是由于selenium webdriver api的演进。在较新版本的selenium中,直接使用find_elements_by_*系列方法(例如find_element_by_id、find_elements_by_name、find_element_by_xpath、find_elements_by_css_selector等)已经被弃用。
最初的Selenium API设计允许直接通过定位策略后缀来调用方法,例如:
# 旧版写法 (已弃用)
event_times = driver.find_elements_by_css_selector(".event-widget time")
event_names = driver.find_elements_by_css_selector(".event-widget li a")这种写法在较早的Selenium版本中是完全有效的,但在后续版本中,为了API的统一性、可读性以及对未来扩展的考虑,这些方法被标记为弃用,并最终被移除。当尝试在不支持这些方法的Selenium版本中执行时,Python解释器会抛出TypeError,指出webdriver.Chrome对象没有这样的属性或方法。
为了解决上述TypeError并遵循Selenium的最新最佳实践,我们需要采用基于By模块的元素定位方式。By模块(selenium.webdriver.common.by.By)提供了一组标准化的定位器类型,使得元素定位更加清晰和灵活。
新的定位语法统一为:
其中,LOCATOR_TYPE是By模块中定义的常量,代表不同的定位策略。常用的定位策略包括:
对于本教程中遇到的TypeError,问题在于使用了弃用的find_elements_by_css_selector。正确的做法是导入By模块,并使用By.CSS_SELECTOR作为定位类型。
以下是原始代码和修正后的代码对比,展示了如何将旧版元素定位方法更新为现代API:
原始代码 (可能引发 TypeError):
from selenium import webdriver
# from selenium.webdriver.common.by import By # 尽管导入了,但未使用
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.python.org/")
# 问题所在:使用了弃用的方法
event_times = driver.find_elements_by_css_selector(".event-widget time")
event_names = driver.find_elements_by_css_selector(".event-widget li a")
events = {}
for n in range(len(event_times)):
events[n] = {
"time": event_times[n].text,
"name": event_names[n].text,
}
print(events)
driver.quit()修正后的代码 (使用现代API):
from selenium import webdriver
from selenium.webdriver.common.by import By # 确保导入并使用 By 模块
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("detach", True)
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.python.org/")
# 修正:使用 driver.find_elements(By.CSS_SELECTOR, "selector")
event_times = driver.find_elements(By.CSS_SELECTOR, ".event-widget time")
event_names = driver.find_elements(By.CSS_SELECTOR, ".event-widget li a")
events = {}
for n in range(len(event_times)):
events[n] = {
"time": event_times[n].text,
"name": event_names[n].text,
}
print(events)
driver.quit()通过将driver.find_elements_by_css_selector(".event-widget time")改为driver.find_elements(By.CSS_SELECTOR, ".event-widget time"),我们遵循了Selenium推荐的API规范,从而解决了TypeError。
TypeError在Selenium中通常是由于使用了弃用的API方法所致。通过理解Selenium API的演进,并采纳By模块结合find_element(s)(By.LOCATOR_TYPE, "selector")的现代定位语法,开发者可以有效地解决这类问题,并编写出更稳定、更易于维护的Web自动化脚本。遵循这些最佳实践将有助于避免常见的陷阱,并提升自动化项目的效率和可靠性。
以上就是Selenium TypeError 调试指南:理解并应用现代元素定位API的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号