You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python+Selenium遍历div时报AttributeError如何解决

错误原因

你的报错AttributeError: 'list' object has no attribute 'find_elements_by_class_name'核心由两个低级错误导致:

  1. browser.find_elements_by_class_name()返回的是匹配到的元素组成的列表,列表本身没有Selenium元素的查找方法,你直接对all_urls_div这个列表调用元素查找方法必然报错。
  2. find_elements_by_class_name方法本身不支持同时传入多个类名,你传逗号分隔的多类名写法本身就无法正确匹配元素。

修复方案

  1. 多类名匹配改用CSS选择器写法,新版Selenium更推荐统一使用find_elements(By.CSS_SELECTOR)的写法,兼容性更强。
  2. 遍历的时候直接用索引取对应元素,不需要额外定义j变量计数,也不需要重复对子元素做查找。
  3. 操作页面后DOM会刷新,原有元素列表会失效,所以每次循环都要重新获取元素列表,避免出现stale element报错。

修正后的代码如下:

from selenium.webdriver.common.by import By
import time

# 定义多类名CSS选择器,多个类名用.连接
target_selector = ".DPiy6.qF0y9.Igw0E.IwRSH.eGOV_._4EzTm"
# 先获取总数量确定循环次数
all_urls_div = browser.find_elements(By.CSS_SELECTOR, target_selector)

for i in range(len(all_urls_div)):
    # 每次循环重新获取元素,避免DOM刷新后元素失效
    current_chats = browser.find_elements(By.CSS_SELECTOR, target_selector)
    current_chats[i].click()
    # 加短延迟等待页面加载,可根据实际情况调整或替换为显式等待
    time.sleep(1)
    
    # 原有业务逻辑保留
    lastMessageBlock = browser.find_element(By.XPATH,
        "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[1]/div/div/div[2]/div[2]/div/div/div")
    act = ActionChains(browser)
    act.move_to_element(lastMessageBlock).perform()

    threeDots = browser.find_element(By.XPATH,
        "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[1]/div/div/div[2]/div[2]/div/div/div/button[1]").click()
    deleteLastMessage = browser.find_element(By.XPATH,
        "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[1]/div/div/div[2]/div[2]/div/div/div/div[2]/div/div[2]/div[4]/button").click()
    browser.find_element(By.XPATH, "/html/body/div[6]/div/div/div/div[2]/button[1]").click()

    textArea = browser.find_element(By.XPATH,
        "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div[2]/textarea")
    textArea.clear()
    browser.execute_script("arguments[0].value='" + message + "'", textArea)
    textArea.send_keys(Keys.SPACE)

    sendButton = browser.find_element(By.XPATH,
        "/html/body/div[1]/section/div/div[2]/div/div/div[2]/div[2]/div/div[2]/div/div/div[3]/button").click()
    
# 滚动逻辑保留
browser.execute_script("arguments[0].scrollTop = arguments[0].scrollTop + arguments[0].offsetHeight;",
                       general_path_block)

额外优化建议

  • 不要使用绝对路径的XPath,页面结构稍有变动就会失效,建议改成用属性匹配的相对XPath,稳定性更高。
  • 元素查找操作建议替换为显式等待,不用强制sleep,执行效率更高也更稳定。

内容的提问来源于stack exchange,提问作者Дмитрий Гуща

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:24:06