Selenium Python实现iframe内滚动加载全部内容的问题
iframe内滚动加载全部数据的问题
我在操作下图中的iframe应用时遇到滚动加载问题:iframe切换功能正常,能在其中获取信息、点击元素,但目前只能统计到25个“Descargar Factura (XML)”元素,实际应该有64个。需要通过滚动让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
相关产品推荐
相关产品推荐

