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

