使用Splash模拟登录时send_text方法失效POST请求被取消怎么办
Splash模拟登录send_text失效+POST请求被取消常见原因
- 表单元素未完成加载就调用
send_text方法:Splash执行脚本时如果没有加足够的等待逻辑,比如没等页面DOM渲染完成、表单input元素没挂载到DOM树就触发输入操作,内容自然不会被写入到对应控件中,后续表单提交时就会因为参数为空触发校验直接中断POST请求。
建议在调用
send_text前增加wait_for_selector逻辑,确认目标input元素可见且可交互后再执行输入操作,输入完成后可以额外加100-300ms的等待,确保输入值已经被表单监听器捕获。
- 目标网站表单有防模拟输入校验:很多站点的登录表单会监听真实键盘事件,Splash默认的
send_text是直接给input的value赋值,没有触发对应的keydown、keyup、input等原生事件,会被表单校验逻辑判定为无效输入,提交时会拦截请求触发取消。
这种情况可以改用
send_keys方法输入,或者输入完成后手动触发input元素的input、change事件,让表单感知到数值变化。
- 跨域请求或者请求校验不通过被拦截:如果登录请求的域名和当前页面域名不一致、缺少必要的csrf token、请求头参数不符合站点要求,浏览器内核会直接取消跨域请求,或者站点的前置校验逻辑发现参数缺失直接终止提交流程,最终HAR里就会显示POST请求被取消。
可以先手动登录一次对比请求头、表单参数的差异,确认是否缺少cookie、csrf token这类必填校验参数,同时确认Splash的跨域配置是否正确开启。
- 页面跳转逻辑触发时机早于请求发送:如果输入完成后立即调用了跳转方法、或者页面本身有自动跳转的逻辑,导致POST请求还没完成发送就被页面跳转中断,也会出现请求被取消的提示。
可以在提交表单后增加等待逻辑,确认请求发送完成或者登录成功的跳转页面加载完成后再执行后续操作。
内容的提问来源于stack exchange,提问作者Allen yu
相关产品推荐
相关产品推荐

