需求:类似 LastPass 这种可以自动填充用户名密码,点击提交
难点:很多现代化的页面前端做了表单校验,直接赋值 input 的 value 不能通过表单校验
关键在于没能触发人家框架的 event listener
查资料咯,发现了这个解答 https://stackoverflow.com/a/35807417 就是触发 input 、keyup 、change 事件,但实际测试仍然不行,甚至我把在开发人员工具能看到的 event listner 全触发了一边都没用 sad
function fireChangeEvents(element){
var changeEvent = null;
for(var i of ["keypress","focus", "input", "keydown", "keyup", "change", "blur", "click", "invalid", "mouseover", "popstate", "reset", "scroll", "selectionchange", "submit", "transitionend"]){
changeEvent = document.createEvent ("HTMLEvents");
changeEvent.initEvent (i, true, true);
element.dispatchEvent (changeEvent);
}
}
fireChangeEvents(document.querySelectorAll("input")[0])
然后接着找,发现一个能模拟用户交互的 npm 包: https://github.com/testing-library/user-event
然后折腾了一下 browserify 打包成浏览器可以用的 js 文件,实际测试可行:
userEvent.type(document.querySelectorAll("input")[0], USERNAME);
userEvent.type(document.querySelectorAll("input")[1], PASSWORD);
问题是解决了,但觉得为了一个触发 event 引入一个 500KB 的 js 文件有点蠢( uglify 之后也有 300KB ),问问大佬们有没有更好的方案,不需要引入这么重的 js 库的
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.