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

Selenium Python实现iframe内滚动加载全部内容的问题

iframe内滚动加载全部数据的问题

我在操作下图中的iframe应用时遇到滚动加载问题:iframe切换功能正常,能在其中获取信息、点击元素,但目前只能统计到25个“Descargar Factura (XML)”元素,实际应该有64个。需要通过滚动让iframe加载全部数据,寻求正确的实现方法。

该iframe应用

现有代码

...
driver.find_element(By.XPATH,'//*[@id="nivel4_11_5_3_1_2"]').click() # Consultar factura y nota
WebDriverWait(driver,60).until(EC.frame_to_be_available_and_switch_to_it(('iframeApplication'))) #Cambiar a iframe consulta de facturas
for z in categories_1:
    WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[1]/td[3]/div/div[2]/input')))
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[1]/td[3]/div/div[2]/input').send_keys(periodoactual[0]) #Rellenar fecha inicio
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[2]/td[3]/div/div[2]/input').send_keys(periodoactual[1]) #Rellenar fecha final
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[3]/td[3]/div/div[3]/input[1]').clear() #Limpiar campo de tipo de consulta
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[3]/td[3]/div/div[3]/input[1]').send_keys('FE Recibidas') #Llenar con tipo de consultas
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[3]/tbody/tr[1]/td[1]/span/span/span/span[3]').click() #Clickear en buscar comprobantes
    sleep(5)
    driver.switch_to.default_content()
    WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.ID,'iframeApplication')))
    marco= driver.find_element(By.ID,'iframeApplication')
    driver.execute_script('arguments[0].scrollIntoView({block: "center"})', marco)
    print(len(driver.find_elements(By.LINK_TEXT,'Descargar Factura (XML)')))

问题根源

你当前代码中点击搜索后切回了default_content,然后调用scrollIntoView滚动的是iframe标签在父页面的位置,不是iframe内部的内容,所以无法触发内部数据加载。

解决方法

1. 保持iframe上下文,直接滚动内部内容

去掉driver.switch_to.default_content()这行代码,留在iframe的上下文里,直接执行脚本滚动iframe内部的页面或可滚动容器。

2. 循环滚动直到数据全部加载

部分页面滚动一次只会加载部分数据,需要循环滚动直到元素数量不再增加:

# 留在iframe内,不切回默认内容
prev_count = 0
current_count = len(driver.find_elements(By.LINK_TEXT,'Descargar Factura (XML)'))
while current_count > prev_count:
    prev_count = current_count
    # 滚动iframe内部到最底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待数据加载,时间可根据页面响应速度调整
    time.sleep(2)
    current_count = len(driver.find_elements(By.LINK_TEXT,'Descargar Factura (XML)'))

3. 针对特定可滚动容器滚动(更精准)

如果页面内有固定的滚动容器(比如结果列表的tbody或div),可以直接定位该容器并滚动:

# 定位iframe内的可滚动容器(示例XPath,需替换为实际容器的定位方式)
scroll_container = driver.find_element(By.XPATH, "//table[@class='结果表格类名']/tbody")
# 滚动容器到底部
driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scroll_container)

修正后的完整代码

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

...
driver.find_element(By.XPATH,'//*[@id="nivel4_11_5_3_1_2"]').click() # Consultar factura y nota
WebDriverWait(driver,60).until(EC.frame_to_be_available_and_switch_to_it(('iframeApplication'))) #Cambiar a iframe consulta de facturas
for z in categories_1:
    WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[1]/td[3]/div/div[2]/input')))
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[1]/td[3]/div/div[2]/input').send_keys(periodoactual[0]) #Rellenar fecha inicio
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[2]/td[3]/div/div[2]/input').send_keys(periodoactual[1]) #Rellenar fecha final
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[3]/td[3]/div/div[3]/input[1]').clear() #Limpiar campo de tipo de consulta
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[2]/tbody/tr[3]/td[3]/div/div[3]/input[1]').send_keys('FE Recibidas') #Llenar con tipo de consultas
    driver.find_element(By.XPATH,'/html/body/div[1]/table/tbody/tr/td/div/div/form/table/tbody/tr/td/table/tbody/tr/td/table[3]/tbody/tr[1]/td[1]/span/span/span/span[3]').click() #Clickear en buscar comprobantes
    time.sleep(5)
    
    # 循环滚动加载全部数据
    prev_count = 0
    current_count = len(driver.find_elements(By.LINK_TEXT,'Descargar Factura (XML)'))
    while current_count > prev_count:
        prev_count = current_count
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)
        current_count = len(driver.find_elements(By.LINK_TEXT,'Descargar Factura (XML)'))
    
    print(f"实际加载的元素数量:{current_count}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:25:43