Selenium find_element仅返回首个元素 如何获取所有匹配元素
问题根源
你调用的find_element()方法本身的逻辑就是仅返回DOM中第一个匹配定位规则的元素,无论页面上存在多少个符合XPath条件的节点,该方法都只会输出单个WebElement对象。你对单个WebElement对象执行len()得到返回值1,是Selenium对单个元素对象的内置实现返回的结果,不代表页面上只有1个匹配的评论元素,属于方法选型错误。
修复方案
要获取所有匹配定位规则的评论元素,需要替换为复数形式的find_elements()方法,该方法会按DOM节点顺序,返回所有符合XPath规则的WebElement组成的列表,对这个列表取len()才能得到真实的评论元素总数,遍历列表即可读取每一条评论的内容。
修正后的可运行代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Firefox() driver.get("link") wait_page_to_load() scroll_all_the_down() # 替换为复数形式的find_elements方法 comment_elems = driver.find_elements(By.XPATH,'//*[@id="content-text"]') print(len(comment_elems)) # 输出实际匹配到的评论元素总数 # 遍历读取所有评论内容示例 for elem in comment_elems: print(elem.text)
注意事项
find_element()和find_elements()核心逻辑差异:前者匹配不到元素时直接抛出NoSuchElementException异常,匹配到多个元素时仅返回第一个;后者匹配不到元素时返回空列表,匹配到多个元素时返回全部元素组成的列表- 你之前校验通过的XPath路径不需要修改,只要确认自定义的滚动加载逻辑已经把所有评论节点渲染到DOM树中,调用
find_elements()就能拿到全部目标元素 - 不要对单个WebElement对象使用
len()统计元素数量,该操作的返回值不代表匹配到的元素总数,会误导排查方向
内容的提问来源于stack exchange,提问作者Margouma Saleh
相关产品推荐
相关产品推荐

