Selenium代码转换报错:AttributeError: 'list'对象无find_elements属性
Selenium新旧代码差异、报错原因及解决方法
一、新旧代码核心差异
- 元素定位API更新:旧版本使用
find_element_by_*/find_elements_by_*系列方法(如find_element_by_name、find_element_by_class_name),新版本统一替换为find_element(By.XXX, value)/find_elements(By.XXX, value)形式,参数通过By类指定定位策略。 - 潜在逻辑差异:旧代码中
main变量理论上会因presence_of_all_elements_located返回列表而报错,但可能是讲师笔误或旧版本兼容问题未触发;新代码严格遵循新版本API,直接暴露了这个逻辑错误。
二、报错原因
你使用了EC.presence_of_all_elements_located等待条件,该方法会返回匹配定位条件的元素列表,而Python列表对象没有find_elements方法——这就是AttributeError: 'list' object has no attribute 'find_elements'的根源。
另外,ID为main的页面元素是唯一的,用presence_of_all_elements_located(等待所有匹配元素)本身就不符合业务逻辑,应该用等待单个元素的条件。
三、解决方法
- 修正等待条件:将
EC.presence_of_all_elements_located替换为EC.presence_of_element_located,该方法返回单个WebElement对象,支持调用find_elements等元素定位方法。 - 保留新版本定位语法:继续使用
find_elements(By.CLASS_NAME, "entry-title")获取main容器下的所有文章标题元素。
修正后的完整代码:
from selenium import webdriver from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC PATH = "my_path" driver = webdriver.Chrome(PATH) driver.get("https://techwithtim.net") search = driver.find_element(By.NAME, value="s") search.send_keys("test") search.send_keys(Keys.RETURN) try: # 等待单个ID为main的元素加载完成 main = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "main"))) # 获取main下所有文章标题元素 articles = main.find_elements(By.CLASS_NAME, "entry-title") # 遍历输出标题(可选) for article in articles: print(article.text) finally: driver.quit()
内容的提问来源于stack exchange,提问作者Herkul
相关产品推荐
相关产品推荐

