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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:37:19