通过js脚本改变input元素的value值时无法触发change事件的解决方案

模拟用户输入解决油猴脚本登录问题
当使用油猴脚本直接赋值给input元素的value属性无法触发change事件,导致登录失败时,可以采用模拟用户输入的方法。通过调用`focus()`使input获取焦点,再利用`document.execCommand('inserttext', false, 'username')`模拟粘贴操作,成功触发change事件,实现自动登录。

最近用油猴写自动脚本时发现,在登录时直接把信息赋给对应input元素的value变量后,无法触发change事件导致登录失败。在网上查询了好几篇说这事的文章全都是在胡说八道,最后还是自己摸索出解决方案,在这分享给大家,以正视听。

解决思路

既然直接赋值无法触发,那么如果模拟用户操作输入信息的的过程能否触发呢?而在document下的execCommand方法,可以通过执行指令模拟复制粘贴等操作。

execCommand方法

其中insertText指令,可以在光标处插入选中的内容,因此先通过focus方法使input元素获取焦点,然后insertText通过指令插入对应信息,即可模拟点击粘贴的过程。

在这里插入图片描述

代码

//获取目标input元素
let user = document.querySelector("input#userName");
//给目标input设置焦点
user.focus();
//模拟粘贴操作
document.execcommand('inserttext', false, 'username');
# 等待 input 元素可交互(推荐使用显式等待) wait = WebDriverWait(driver, 10) input_box = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='colvalue'].Wdate"))) # 使用 JS 设置 value 和 realvalue,并触发 change 和 blur 事件 driver.execute_script(""" var element = arguments[0]; var initialValue = element.value; // 设置新的显示(yyyyMMdd 格式) element.value = '20250927'; // 更新 realvalue 属性(如果业务逻辑依赖它) element.setAttribute('realvalue', '2025-09-27'); // 创建并触发 input 事件(用于双向绑定或监听) var inputEvent = new Event('input', { bubbles: true }); element.dispatchEvent(inputEvent); // 创建并触发 change 事件 var changeEvent = new Event('change', { bubbles: true }); element.dispatchEvent(changeEvent); // 创建并触发 blur 事件触发 onblur 中的 validator 校验 var blurEvent = new Event('blur', { bubbles: true }); element.dispatchEvent(blurEvent); console.log('✅ Input value updated to 20250927 and events fired.'); """, input_box) print("✅ 日期已通过 JS 成功更新并触发所有必要事件") # 等待 select 元素出现并可操作 wait = WebDriverWait(driver, 10) select_element = wait.until(EC.presence_of_element_located((By.NAME, "colvalue"))) # 使用 JavaScript 设置 value触发 change 事件 driver.execute_script(""" var select = arguments[0]; var value = '1268821'; // 想要选中的 value,例如 贵港市 // 查找匹配 value 的 option 并设置 selected for (var i = 0; i < select.options.length; i++) { if (select.options[i].value === value) { select.options[i].selected = true; select.value = value; break; } } // 创建并触发 change 事件(冒泡,确保监听器能捕获) var event = new Event('change', { bubbles: true }); select.dispatchEvent(event); console.log('✅ 已选中 value=' + value + ', 并触发 change 事件'); """, select_element) print("✅ 下拉框已通过 JS 成功设置为‘贵港市’,且 colrule(this) 应已被调用")
09-21
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值