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

Selenium遍历ul下li标签时重复获取相同元素值的问题

问题原因

重复输出问题和li元素获取逻辑无关,问题出在循环内查找time节点的XPath写法错误:
当你在已定位到的WebElement对象(即循环里的每个li元素i)上调用find_element方法时,如果传入的XPath以//开头,Selenium会忽略当前元素的上下文范围,直接从整个HTML文档的根节点开始查找,返回全页面第一个匹配选择规则的元素。因此三次循环实际拿到的都是页面上第一个符合规则的time节点,输出的title值自然完全相同。
你之前尝试修改lis的定位语句没有效果,是因为改错了位置:原代码中the_ul.find_elements(By.TAG_NAME,'li')的写法本身是正确的,传入//li作为TAG_NAME的参数反而不符合定位器语法,只是没有触发报错,自然解决不了问题。

修复方法

只需要修改循环内的XPath,在路径前加.,表示从当前li元素的节点范围开始查找子元素即可,修正后的完整代码如下:

from selenium.webdriver.common.by import By

the_ul = driver.find_element(By.XPATH,'//ul[@aria-label="Chat content"]')
lis = the_ul.find_elements(By.TAG_NAME,'li')
print(lis)
print("this is len lis: ",len(lis))
for i in lis:
    # 注意XPath开头的. 代表相对当前元素节点查找
    txt = i.find_element(By.XPATH,'.//div[@class="ui-chat__messageheader"]/time').get_attribute('title')
    print("TXT: ",txt)
注意事项
  • 使用By.TAG_NAME定位时,参数直接传标签名即可,不要加//前缀,//是XPath专属的路径语法,和TAG_NAME定位方式不匹配。
  • 所有基于已定位WebElement的相对XPath查找,只要目标是当前元素子树内的节点,XPath都要以.//开头,直接写//会触发全页面查找,这是Selenium中XPath定位的固定规则。

内容的提问来源于stack exchange,提问作者A B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:18:23