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
相关产品推荐
相关产品推荐

