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
相关产品推荐
相关产品推荐

