Selenium自动化问题:输入框仅接受首个CPF值
问题:Selenium自动化脚本中CPF输入框无法更新后续值
此前运行正常的Python Selenium脚本,目前出现异常:填写CPF(巴西身份证号)的函数中,代码内CPF值已正确更新,但自动化仅将首个值填入输入框,后续传入新值时输入框始终显示首个值。
相关代码片段
def inserir_cpf(self, cpf): print(f" Inside the Insert CPF function: {cpf}") campo_cpf = WebDriverWait(self.driver, 10).until( ec.presence_of_element_located((By.NAME, 'documentNumber')) ) campo_cpf.clear() # Clears the field before inserting the new value campo_cpf.send_keys(cpf) self.simular() def filtrar_cpf(self): t = 0 while t < len(doc.dic_cpf): print(t) cpf = doc.list_cpf[t] print('Selecting CPF') print(cpf) self.list_banco = ['BMP', 'QI', 'J17'] for i in self.list_banco: print('Selecting Bank') print(i) bot.escolher_banco(i) bot.inserir_cpf(cpf) saldo_armazenado = bot.armazenar_saldo(cpf) if saldo_armazenado: print('Balance stored') break else: print('Balance not found') t += 1
已尝试的解决方法
- 输入前调用
campo_cpf.clear()清除输入框 - 改用
ec.element_to_be_clickable等待元素可交互 - 逐字符输入并添加延迟
- 循环执行
clear()直到输入框为空
以上方法均未解决问题,即使注释掉send_keys后的self.simular()函数,输入框仍只显示首个CPF值。目标输入框通过By.NAME='documentNumber'定位。
可能的解决方案
1. 检查页面是否存在多个同名元素
页面中可能存在多个name="documentNumber"的元素,导致每次定位到的都是第一个隐藏或非当前视图的元素。可以先验证元素数量:
# 在inserir_cpf函数中添加,查看定位到的元素数量 elements = self.driver.find_elements(By.NAME, 'documentNumber') print(f"找到{len(elements)}个name为documentNumber的元素") # 输出每个元素的可见性和位置 for idx, elem in enumerate(elements): print(f"元素{idx}可见性:{elem.is_displayed()},位置:{elem.location}")
如果存在多个元素,优化定位方式缩小范围,比如结合父容器的CSS选择器:
campo_cpf = WebDriverWait(self.driver, 10).until( ec.presence_of_element_located((By.CSS_SELECTOR, '.form-container [name="documentNumber"]')) )
2. 用键盘快捷键替代clear()方法
部分前端框架可能拦截clear()方法,导致内容未真正清除。改用全选后删除的方式:
from selenium.webdriver.common.keys import Keys campo_cpf.send_keys(Keys.CONTROL, 'a') # Windows/Linux环境 # macOS环境替换为:campo_cpf.send_keys(Keys.COMMAND, 'a') campo_cpf.send_keys(Keys.DELETE) campo_cpf.send_keys(cpf)
3. 手动触发输入框的change事件
部分前端组件需要触发change事件才会更新值,可通过JavaScript执行:
campo_cpf.send_keys(cpf) # 触发change事件 self.driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", campo_cpf)
4. 避免元素过期(Stale Element)
切换银行后页面可能重新渲染输入框,导致之前定位的元素过期。在切换银行后等待页面稳定:
# 在escolher_banco函数中添加,等待原输入框失效 def escolher_banco(self, banco): # 选择银行的业务代码... # 等待原输入框元素过期,确保页面重新渲染完成 old_cpf_field = self.driver.find_element(By.NAME, 'documentNumber') WebDriverWait(self.driver, 10).until(ec.staleness_of(old_cpf_field))
5. 直接通过JavaScript设置输入框值
绕过前端可能的拦截,直接用JS修改输入框的value属性:
self.driver.execute_script(f"arguments[0].value = '{cpf}';", campo_cpf) # 同步触发change事件 self.driver.execute_script("arguments[0].dispatchEvent(new Event('change'));", campo_cpf)
内容的提问来源于stack exchange,提问作者Luis Scarasatti
相关产品推荐
相关产品推荐

