由于疫情,这几天每天都要上报出行记录。用的平台是金数据。表单设计挺糟糕,日期不能自动生成,并且每天都要重新填写身份相关的大量信息。考虑到疫情可能会持续几个月,因此很有必要自动填写来减少麻烦。
想了几个办法。首先想到用python的requests库,但由于不熟悉http协议怎么post,于是作罢。然后想到用selenium的webdriver,使用浏览器模拟人工操作,这个库的函数和js挺像,于是想起可以直接上js,最终就用了网页直接相关的脚本语言js。以下为js代码分析。为了防止错误提交,在测试时可以先把网页下载到本地,或者断开网络。
首先是网页分析。要处理的控件类型有日期、空格、下拉选框、地图、多级下拉选框、是否选框、按钮这些。一个一个处理之后把代码合并就得到了最后的脚本。主流浏览器都有调试工具,本文使用的是PC端的Chrome。调试完后也可以把脚本复制到手机端使用(使用的是X浏览器)。
1. 日期
手动填写时是给个日历选择日期,其实内容还是文本框,所以可以直接填写。先用getElement系列函数找到控件,然后设置value属性即可。
document.getElementById("entry_field_13").value="2020-02-"+Date()[8]+Date()[9];
代码中getElement函数的参数"entry_field_13"可以用浏览器工具得到,即在所在控件处右键->检查。填写的内容可以用Date()自动更新日期。Date()函数返回当前日期的字符串,可以打开浏览器的调试控制台输入Date()看一看。第8位加第9位就是年月日中的日所在的字符串。
2. 空格
统计表中有大量的空格要填,直接改value即可。
document.getElementById("entry_field_1").value="张三";
3. 下拉选框
同样右键检查找到控件。这个下拉选框是一个
经过尝试,把控件的value值改为"abcd"会把选项文本改为“可选文本”。这里之所以value和文本不同,大概是用一个函数把选项的文本映射到了四个字母上来方便计算。根据上面的尝试,仍然只要修改value即可。
document.getElementById("entry_field_11").value="yTW0";
4. 地图
地图比较复杂,但所幸提供了搜索功能,因此可以操作简化成按钮->文本框->按钮。
document.getElementsByClassName("gd-btn gd-btn-primary geo-field-chooser")[0].click();//打开地图
document.getElementsByClassName("map-search fixed-width-control")[0].value="我的地址";
document.getElementsByClassName("gd-icon-search")[0].click();//搜索
5. 多级下拉选框
这种多级选框在选好上一级之后才能有下一级。依然可以直接改value来越过选框直接修改文本,但下级选框没能显示出来。之后尝试用selectedIndex来选择,但下级选框不刷新。
6. 是否选框
document.getElementsByName("entry[field_16]")[1].checked=true;
7. 按钮
找到按钮并按下:
document.getElementsByClassName("submit gd-btn gd-btn-primary-solid with-shadow")[0].click();
把所有要填的内容一一写出。运行脚本可以把代码用分号隔开后全部复制到浏览器调试工具的控制台,可以用油猴,也可以简单点在收藏夹处新建网页,网址输入javascript:加上要运行的js代码,例如
javascript:alert("HelloWorld");
之后调用脚本时直接点收藏夹的网页即可。
手机X浏览器的脚本使用:
设置->浏览器脚本->添加脚本