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

Selenium使用class_name定位元素仅返回1个,实际存在2个如何解决?

Selenium定位Pixiv多图元素仅返回1个的解决办法

问题根因

  • 操作顺序有误:你先调用find_element获取首个元素点击,该操作会触发原图预览弹窗加载,原页面DOM结构已发生变化,后续再查找同class元素时,无法匹配到原本存在的第二个元素。
  • 懒加载未触发:Pixiv的多图作品中,非首图的元素默认使用懒加载机制,未滚动到对应区域时,第二个元素不会被插入DOM树,仅用presence_of_all_elements_located等待,也捕获不到还未渲染的元素。
  • 定位规则不稳定:你用的sc-1qpw8k9-3是前端框架自动生成的动态类名,本身匹配逻辑就容易受页面更新影响。

修复代码

先调整操作顺序,触发所有元素渲染后再执行匹配,同时换用更稳定的定位方式,参考代码如下:

# 滚动到作品配图容器区域,触发所有图片懒加载
img_container = driver.find_element(By.CSS_SELECTOR, 'figure[role="group"]')
driver.execute_script("arguments[0].scrollIntoView();", img_container)

# 等待所有原图链接元素全部加载,使用业务属性定位避免动态类名影响
full_image_links = WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located(
        (By.CSS_SELECTOR, 'div[data-gtm-value="查看原图"] a')
    )
)

# 依次处理每个元素即可
for link in full_image_links:
    # 点击前可先滚动到对应元素位置,避免不可交互报错
    driver.execute_script("arguments[0].scrollIntoView();", link)
    link.click()
    # 这里加关闭弹窗的逻辑,再处理下一个元素

补充提示

如果需要逐个点击预览,每次点击后要先关闭弹窗再操作下一个元素,避免弹窗遮挡导致元素不可交互。日常定位元素优先选data-开头的自定义属性、href特征、角色属性等稳定规则,不要用sc-xxx-xx格式的动态类名,兼容性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:30:03