Python自动化脚本循环执行失效问题求助:循环仅执行一次即停止
排查Selenium循环仅执行一次的问题
看起来你的循环只跑一次就停,大概率是执行过程中抛出了未捕获的异常(比如找不到元素),导致脚本直接终止。先看看你代码里的几个明显问题,再给你修复方案:
你的代码里的冗余&风险点
driver.find_element_by_class_name("submit").click() x = driver.find_element_by_class_name("submit").click() # 这行完全多余!click()返回None,赋值给x毫无意义 for x in range(100): time.sleep(0.1) driver.find_element_by_xpath("//input[@value='Continue >>']").click() time.sleep(2.5) driver.find_element_by_xpath("//a[contains(.,'Restart Battle')]").click() print(x)
- 第二行的
x = driver.find_element_by_class_name("submit").click()纯粹是冗余代码,而且click()方法返回None,这行除了占用资源没任何作用。 - 固定的
time.sleep()非常不可靠——如果页面加载慢一点,元素还没渲染出来你就去点击,直接会抛出NoSuchElementException,脚本直接停掉,这就是你循环只跑一次的核心原因。 - 没有任何异常捕获机制,一旦某一步出错,整个脚本直接终止。
修复后的代码(带异常处理+显式等待)
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始的submit点击(只需要一次) driver.find_element_by_class_name("submit").click() # 执行100次循环 for loop_num in range(1, 101): print(f"正在执行第 {loop_num} 次循环") try: # 显式等待「Continue >>」按钮可点击,最多等10秒 continue_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//input[@value='Continue >>']")) ) continue_btn.click() # 显式等待「Restart Battle」链接可点击,最多等10秒 restart_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//a[contains(.,'Restart Battle')]")) ) restart_btn.click() except Exception as e: print(f"第 {loop_num} 次循环出错: {str(e)}") # 可选:保存错误截图,方便排查页面状态 driver.save_screenshot(f"error_screenshot_{loop_num}.png") # 出错后继续下一次循环,而不是终止脚本 continue
关键改进点说明
- 去掉冗余代码:删掉了无意义的
x = driver.find_element_by_class_name("submit").click()。 - 用显式等待替代固定sleep:显式等待会主动轮询页面,直到元素可点击才会执行操作,比硬等时间要可靠得多,避免页面加载延迟导致的元素定位失败。
- 添加异常捕获:即使某次循环中出现元素找不到、页面跳转异常等问题,脚本也会打印错误信息后继续下一次循环,不会直接终止,方便你定位具体是哪一步出了问题。
- 更清晰的循环计数:把循环变量改成
loop_num,从1开始计数,打印的时候更直观。
额外排查方向
如果修复后还是有问题,你可以检查这几点:
- 页面点击后是否弹出了新窗口/弹窗?如果有,需要用
driver.switch_to.window()切换窗口,或者处理弹窗后再继续定位元素。 - 元素的XPATH是否正确?有时候页面动态渲染,元素的属性(比如value、文本)会有细微变化,你可以用浏览器开发者工具重新验证XPATH的有效性。
- 目标元素是否在iframe里?如果是,需要先执行
driver.switch_to.frame()切换到对应iframe,才能定位到里面的元素。
内容的提问来源于stack exchange,提问作者pocket monster
相关产品推荐
相关产品推荐

