我采用WebDriver觉得Web界面点击的方式,对于该需求并不怎么合适的。因此,再次考虑了一下,这种方案只适合自动化测试,不适合用来做功能。因此有了第二套方式。
二.模拟HTTP报文
就跟我们平时用httpwatch截取的一个个链接及参数一样,HTTP请求本质上就是报文的发送与接收。因此直接用模拟HTTP报文的方式,可以不打开浏览器,直接发送请求,避免各种页面异常情况的发生。
由于不是从页面登陆,我们就不用去考虑那些页面操作的部分,分析一下,其实整个流程只要发送两次报文就可以了:签到登陆以及发送签到信息部分。
1.登陆部分:
登陆请求时,通过看页面源码中的form或者用httpwatch截参数,我们会发现有三个参数:userId、userPwd、action,其中action中隐藏参数,在页面上是不需要修改的,但在发送请求时还是要带上的,服务端会根据这个action进行相应操作。源码如下:
01 | WebConversation wc = new WebConversation(); |
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 = new SimpleDateFormat( "yyyy-MM-dd" ).format( new Date()); |
04 | req = new PostMethodWebRequest(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