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

使用Selenium Python提交表单后URL未变更时重填表单的代码问题

问题分析与解决方案

核心问题点

  1. form1函数强制回退页面:每次调用form1都会执行driver.get(site),即使提交成功跳转到第二个页面,这行代码会强制回到第一个表单页面,导致循环无法跳出。
  2. URL检查未等待页面加载:提交按钮点击后页面跳转需要时间,直接判断driver.current_url会拿到旧URL,误判为未跳转,重复触发表单填写。
  3. 输入框未清空:重复提交时输入框内容叠加,可能触发表单验证失败,进一步阻碍跳转。

修正后的代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:55:26