* 模拟用户输入(增强版,支持 React/Vue 等框架)
(element, value)
| 170 | * 模拟用户输入(增强版,支持 React/Vue 等框架) |
| 171 | */ |
| 172 | function simulateInput(element, value) { |
| 173 | // 聚焦元素 |
| 174 | element.focus(); |
| 175 | |
| 176 | // 对于 React 等框架,需要使用原生 setter |
| 177 | const nativeInputValueSetter = Object.getOwnPropertyDescriptor( |
| 178 | window.HTMLInputElement.prototype, 'value' |
| 179 | )?.set; |
| 180 | |
| 181 | const nativeTextAreaValueSetter = Object.getOwnPropertyDescriptor( |
| 182 | window.HTMLTextAreaElement.prototype, 'value' |
| 183 | )?.set; |
| 184 | |
| 185 | // 清空并设置值 |
| 186 | if (element.tagName.toLowerCase() === 'textarea' && nativeTextAreaValueSetter) { |
| 187 | nativeTextAreaValueSetter.call(element, value); |
| 188 | } else if (nativeInputValueSetter) { |
| 189 | nativeInputValueSetter.call(element, value); |
| 190 | } else { |
| 191 | element.value = value; |
| 192 | } |
| 193 | |
| 194 | // 触发各种事件以确保表单验证和框架状态更新 |
| 195 | element.dispatchEvent(new Event('input', { bubbles: true, cancelable: true })); |
| 196 | element.dispatchEvent(new Event('change', { bubbles: true, cancelable: true })); |
| 197 | element.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, key: 'a' })); |
| 198 | element.dispatchEvent(new KeyboardEvent('keypress', { bubbles: true, key: 'a' })); |
| 199 | element.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true, key: 'a' })); |
| 200 | |
| 201 | // 失焦触发验证 |
| 202 | element.blur(); |
| 203 | } |
| 204 | |
| 205 | /** |
| 206 | * 处理 select 元素(增强版) |
no outgoing calls
no test coverage detected