表单提交和动态加载需精准识别状态变化、适配页面真实行为:表单要校验元素可点击性、触发失焦事件、等待反馈元素;动态加载应监听内容区域变化而非固定等待,结合滚动与自定义条件;组合场景需分步验证异步交互,并用Network调试定位问题。
表单提交和动态加载是 Selenium 自动化中最常遇到的两类场景。处理不好,轻则脚本报错中断,重则元素找不到、数据没提交成功却无提示。核心在于:不依赖固定等待,而要精准识别状态变化;不硬编码元素定位,而要适配页面真实行为。
很多新手写完填值就直接 click() 提交按钮,但实际页面中,提交往往受校验逻辑约束——比如邮箱格式不对、必填项为空、验证码未输入,按钮可能被禁用(disabled)或点击后无响应。
button.is_enabled() and button.is_displayed(),避免 ElementNotInteractableException
input_field.send_keys(Keys.TAB) 或 input_field.send_keys(Keys.ENTER),模拟用户失焦行为WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.ID, "success-tip")))
页面通过 Ajax 加载列表、下拉选项、弹窗内容时,DOM 可能已存在,但数据还没回来。用 time.sleep() 是最不可靠的方式——网速快时浪费时间,慢时又不够。
出现且文本非空WebDriverWait(driver, 10).until_not(EC.presence_of_element_located((By.CLASS_NAME, "loading-spinner")))
driver.execute_script("arguments[0].scrollIntoView(true);", element) 滚到目标位置,再等待新内容出现,避免因元素不可见导致查找失败典型例子:输入手机号 → 触发短信验证码发送 → 等待倒计时按钮变可点击 → 输入验证码 → 提交。这个过程涉及多次异步交互,不能线性堆砌 click() 和 send_keys()。
WebDriverWait 配合自定义条件:lambda d: "s" in d.find_element(By.ID, "send-btn").text
presence_of_element_located 确保它已插入 DOM,再用 element_to_be_clickable 确保可操作运行失败时别急着改代码,先人工复现并观察浏览器行为:
ve log”,看关键请求是否发出、状态码是否 200、响应体是否含预期数据driver.save_screenshot("debug-form.png"),确认当前页面状态与预期一致print(button.get_attribute("disabled"), button.get_attribute("class")),比单纯看报错更直观