Python Selenium实现循环执行直到页脚出现指定提示的问题排查
循环逻辑核心问题分析
你代码的主要问题集中在以下几点:
- 内层while循环未更新判断条件变量:进入while循环前你只获取了一次
mensajeproximo的值,循环体中点击下一页、页面更新后,没有重新拉取页脚的最新内容赋值给mensajeproximo,导致循环判断条件永远使用初始值,要么直接跳出循环,要么进入死循环。 - 缺少页面加载等待逻辑:每次点击提交、下一页按钮后,页面内容是动态更新的,你没有加等待逻辑就直接读取元素属性,大概率会拿到上一页的旧值,甚至直接抛出元素不存在的报错。建议使用Selenium的显式等待,等待页脚元素的文本更新后再取值判断。
- 文本匹配规则不合理:你直接匹配
innerHTML会引入HTML实体(比如 )、多余标签、空白字符的干扰,且你代码中两个提示文本的拼写存在差异(一个是don't一个是dont),很容易出现匹配失败的情况。建议改为获取元素的text属性,去除前后空白后再和目标文本比对。 - 旧版本Selenium方法弃用:
find_element_by_xpath是Selenium 3及更早版本的写法,Selenium 4+已经完全移除该API,如果你使用的是新版本Selenium,代码会直接报错无法运行,建议改为from selenium.webdriver.common.by import By后调用driver.find_element(By.XPATH, "你的XPath路径")写法。 - 文件操作不规范:你注释掉了
with open的上下文管理器写法,改为每次进入else分支单独打开文件,没有手动关闭文件,容易出现资源占用、内容未成功写入磁盘的问题。
核心逻辑修改参考
你需要调整内层while循环的逻辑,每次操作后更新判断变量,示例修改片段如下:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 提前定义目标提示文本,可先打印实际获取的页脚text确认准确内容 TARGET_TIP = "?dont have more values" # 外层遍历Excel的逻辑不变 for x in range (2,9): inputrut = driver.find_element(By.XPATH, '//*[@id="BodyText"]/input[1]') inputrut.clear() rutvalue= ws.cell(row=x, column=1).value dvvalue= ws.cell(row=x, column=2).value inputrut.send_keys(str(rutvalue)+"-"+str(dvvalue)) driver.find_element(By.XPATH, '//*[@id="MenuTable"]/tbody/tr[2]/td/input').click() # 等待页脚元素加载完成再取值 foot_elem = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="FootText"]')) ) mensaje = foot_elem.text.strip() print(mensaje) if mensaje != "?don't have values": print(x) # 内层循环每次都更新判断变量 while True: current_tip = foot_elem.text.strip() if current_tip == TARGET_TIP: break print("next "+current_tip) extractvalues(driver) # 点击下一页 driver.find_element(By.XPATH, '//*[@id="MenuTable"]/tbody/tr[3]/td/input').click() # 等待页脚文本更新 WebDriverWait(driver, 10).until(EC.staleness_of(foot_elem)) foot_elem = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, '//*[@id="FootText"]')) ) # 循环结束后执行下一个Excel条目的操作 print("new value") driver.find_element(By.XPATH, '//*[@id="MenuTable"]/tbody/tr[3]/td/input').click() else: # 用with open管理文件操作 with open("Output.txt", "a", encoding="utf-8") as text_file: text_file.write(f"{rutvalue}-{dvvalue}NO REGISTRA\n") print("no values") driver.find_element(By.XPATH, '//*[@id="MenuTable"]/tbody/tr[3]/td/input').click()
内容的提问来源于stack exchange,提问作者Luis Germán Orrego Campano
相关产品推荐
相关产品推荐

