使用Selenium Python提交表单后URL未变更时重填表单的代码问题
问题分析与解决方案
核心问题点
form1函数强制回退页面:每次调用form1都会执行driver.get(site),即使提交成功跳转到第二个页面,这行代码会强制回到第一个表单页面,导致循环无法跳出。- URL检查未等待页面加载:提交按钮点击后页面跳转需要时间,直接判断
driver.current_url会拿到旧URL,误判为未跳转,重复触发表单填写。 - 输入框未清空:重复提交时输入框内容叠加,可能触发表单验证失败,进一步阻碍跳转。
修正后的代码实现
1. 优化第一个表单填写函数
def form1(): try: # 移除强制加载页面的driver.get(site),仅首次访问时加载 mission = WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="mission"]/option[1]'))).click() service = WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="service"]/option[4]'))).click() # 清空输入框后填写,避免内容叠加 phone = WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="phone"]'))) phone.clear() phone.send_keys('+15041245829') email = WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="email"]'))) email.clear() email.send_keys('test@email.com') # 等待提交按钮可点击后再点击 submit = WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.ID, 'submit'))).click() except Exception as e: print(f"表单1提交出错: {e}")
2. 封装带重试的提交与跳转检查逻辑
from selenium.common.exceptions import TimeoutException first_url = 'http://example.com/1' max_retries = 3 # 设置最大重试次数,避免无限循环 def submit_form1_with_retry(): # 首次访问第一个表单页面 driver.get(first_url) retry_count = 0 while retry_count < max_retries: form1() # 等待URL变更,最多等待10秒 try: WebDriverWait(driver, 10).until(lambda d: d.current_url != first_url) print("成功跳转到第二个页面") return True except TimeoutException: retry_count += 1 print(f"提交未跳转,第{retry_count}次重试") # 停留在第一个页面,重新填写提交 continue print(f"重试{max_retries}次仍未跳转,终止流程") return False
3. 优化第二个表单填写函数
def form2(): try: date = WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="date"]/option[1]'))).click() time = WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="time"]/option[2]'))).click() submit = WebDriverWait(driver, 10).until(ec.element_to_be_clickable((By.ID, 'submit'))).click() print("表单2提交成功") except Exception as e: print(f"表单2提交出错: {e}")
4. 最终执行流程
if submit_form1_with_retry(): # 跳转成功后执行第二个表单 form2() else: print("表单1提交失败,无法继续流程")
关键优化说明
- 移除
form1中的driver.get(site),避免强制回退页面。 - 使用
WebDriverWait等待URL变更,确保页面跳转完成后再判断。 - 增加输入框清空逻辑,避免重复提交时内容叠加导致验证失败。
- 设置最大重试次数,防止无限循环。
内容的提问来源于stack exchange,提问作者Boundless
相关产品推荐
相关产品推荐

