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

Selenium使用send_keys()注入文本几秒后消失问题求助

Selenium注入文本到Livewire防抖输入框后消失的问题解决思路

问题描述

编写数据录入脚本时,使用Selenium与带有wire:model.debounce.500ms属性的文本输入框交互出现异常:前几次操作能正常注入文本并触发自动补全,但处理第4个患者的诊断字段时,注入的文本显示几秒后消失,无法唤起自动补全建议列表。

目标HTML元素

<input class="border-gray-300 focus:border-indigo-300 focus:ring focus:ring-indigo-200 focus:ring-opacity-50 rounded-md shadow-sm" wire:model.debounce.500ms="search_diagnoses.0" type="text" placeholder="Search diagnosis...">

该输入框通过点击「Add New Diagnosis」按钮动态添加,输入内容后会弹出自动补全列表,需点击选项完成诊断添加。

当前实现代码

while count < dx_count:
    driver.find_element(by=By.CSS_SELECTOR,value="button[class='btn btn-sm btn-secondary font-medium text-sm text-gray-700']").click()
    print(f"Current Count {count}")
    xpath_id = [7,10,13,16,19]
    dx_field = None
    dx_field = wait.until(EC.visibility_of_element_located((By.XPATH,f'//*[@id="919e06c4ea7e2a5bb720134d693a8671"]/div[2]/div[1]/div[2]/div/form/div/div/div[{xpath_id[count]}]/div[2]/input')))
    try:
       ActionChains(driver).send_keys_to_element(dx_field,patient.diagnosis[index]).perform()
       wait.until(EC.text_to_be_present_in_element_value((By.XPATH,f'//*[@id="919e06c4ea7e2a5bb720134d693a8671"]/div[2]/div[1]/div[2]/div/form/div/div/div[{xpath_id[count]}]/div[2]/input'),patient.diagnosis[index]))
    except:
       driver.refresh()
       self.record_visit(patient)

已尝试无效的方案

  • 调用dx_field.click()和dx_field.clear()确保输入框获焦点,问题依旧
  • 逐字符注入文本并添加time.sleep()延迟,无法规避防抖影响
  • 改用ActionChains.send_keys_to_element()和JsExecutor注入文本,文本仍消失
  • 用driver.get("url")强制刷新页面,未解决DOM加载问题

可行解决思路

1. 替换不稳定的元素定位方式

当前代码依赖硬编码的固定ID和xpath索引,Livewire组件的ID可能随渲染动态变化,第4次操作时定位到的元素可能已失效或错误。建议改为基于属性的动态定位:

# 通过wire:model前缀定位所有诊断输入框,取最后一个新增的
dx_fields = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "input[wire:model^='search_diagnoses']")))
dx_field = dx_fields[-1]

或通过输入框的placeholder定位:

dx_field = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[placeholder='Search diagnosis...']")))

2. 等待Livewire渲染完成

Livewire作为Vue衍生框架,点击添加按钮后会重新渲染DOM,若输入操作早于渲染完成,文本会被后续绑定逻辑清空。可通过JS判断Livewire状态:

# 等待所有Livewire组件处于非加载状态
wait.until(lambda driver: driver.execute_script("return window.Livewire && window.Livewire.all().every(c => !c.loading)"))
# 再定位输入框
dx_field = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "input[wire:model^='search_diagnoses']")))

3. 模拟真实用户交互时序

自动补全需要完整的焦点-输入-等待流程,可优化步骤:

dx_field.click()
# 等待焦点稳定
time.sleep(0.2)
dx_field.send_keys(patient.diagnosis[index])
# 等待自动补全列表出现,而非仅判断输入框值
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div[class*='autocomplete-dropdown']")))

4. 检查焦点状态与页面干扰

若页面存在弹窗、通知等抢占焦点,会导致输入框失焦触发清空逻辑,可提前校验焦点:

is_focused = driver.execute_script("return document.activeElement === arguments[0]", dx_field)
if not is_focused:
    dx_field.click()

内容的提问来源于stack exchange,提问作者gd802

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:35:18