我采用WebDriver觉得Web界面点击的方式,对于该需求并不怎么合适的。因此,再次考虑了一下,这种方案只适合自动化测试,不适合用来做功能。因此有了第二套方式。
二.模拟HTTP报文
就跟我们平时用httpwatch截取的一个个链接及参数一样,HTTP请求本质上就是报文的发送与接收。因此直接用模拟HTTP报文的方式,可以不打开浏览器,直接发送请求,避免各种页面异常情况的发生。
由于不是从页面登陆,我们就不用去考虑那些页面操作的部分,分析一下,其实整个流程只要发送两次报文就可以了:签到登陆以及发送签到信息部分。
1.登陆部分:
登陆请求时,通过看页面源码中的form或者用httpwatch截参数,我们会发现有三个参数:userId、userPwd、action,其中action中隐藏参数,在页面上是不需要修改的,但在发送请求时还是要带上的,服务端会根据这个action进行相应操作。源码如下:
01 | WebConversation wc =newWebConversation(); |
03 | req.setParameter("userId", paramsLoader.getValue("userId")); |
04 | req.setParameter("userPwd", paramsLoader.getValue("userPwd")); |
05 | req.setParameter("action","login"); |
08 | WebResponse resp = wc.getResponse(req); |
09 | if(resp.getResponseCode() ==200&& !resp.getText().contains("用户密码错误")) |
10 | logger.info("...登陆成功... "+ resp.getText()); |
12 | logger.info("...网络问题...返回码:"+ resp.getResponseCode() +"返回信息为:"+ resp.getText()); |
13 | }catch(IOException e) { |
14 | logger.info(e.toString()); |
15 | }catch(SAXException e) { |
16 | logger.info(e.toString()); |
2.签到请求部分:
01 | String date =newSimpleDateFormat("yyyy-MM-dd").format(newDate()); |
04 | req =newPostMethodWebRequest(signAction); |
05 | req.setParameter("remark","签到"); |
06 | req.setParameter("beginDate", date); |
07 | req.setParameter("endDate", date); |
10 | WebResponse resp = wc.getResponse(req); |
11 | logger.info(Calendar.getInstance().getTime().toString() +" : "+ resp.getResponseCode() +" "+ resp.getResponseMessage()); |
12 | if(resp.getText().contains("签到成功!")) |
13 | logger.info("...签到成功..."); |
15 | logger.info("...签到不成功,以下为返回信息:"+ resp.getText()); |
17 | logger.info(e.toString()); |
签到部分,要注意红色部分的WebConversation对象要与登陆时的WebConversation对象保持同一样,否则无法成功,因为Session必须保持一致。
签到部分有两个参数:beginDate与endDate,实际上是没有作用的,但服务端处理时逻辑有些问题,必须要这两个参数,由于咱看不到服务端的代码,因此还是传上去得了。
通过HTTP请求的方式,我们可以避免过多的异常,成功与失败,只要看返回的报文就可以了。然而这仍然不能满足签到脚本的需求,这个脚本不可能是由人每天执行,这样是没有意义的。我们需要每天早上晚上固定某个时刻执行一下,因此我们需要一个计划任务执行工具。
http://blog.xjl.me/?p=338