在使用httpclient作接口测试的时候,遇到了一个重定向的接口,因为框架缘由致使的必需得重定向到另一个域名的接口完成功能。在以前未遇到这个的状况,通过修改请求方法解决了这个问题。大体思路是:若是发现是HTTP code是302,就会去header数组里面找location的字段,把字段的结果放到响应体里面,个人响应体是json格式的。java
代码以下:编程
/** * 获取响应实体 * <p>会自动设置cookie,可是须要各个项目再自行实现cookie管理</p> * <p>该方法只会处理文本信息,对于文件处理能够调用两个过时的方法解决</p> * * @param request 请求对象 * @return 返回json类型的对象 */ public static JSONObject getHttpResponse(HttpRequestBase request) { if (!isRightRequest(request)) return new JSONObject(); beforeRequest(request); JSONObject res = new JSONObject(); RequestInfo requestInfo = new RequestInfo(request); if (HEADER_KEY) output("===========request header===========", Arrays.asList(request.getAllHeaders())); long start = Time.getTimeStamp(); try (CloseableHttpResponse response = ClientManage.httpsClient.execute(request)) { long end = Time.getTimeStamp(); long elapsed_time = end - start; if (HEADER_KEY) output("===========response header===========", Arrays.asList(response.getAllHeaders())); int status = getStatus(response, res); JSONObject setCookies = afterResponse(response); String content = getContent(response); int data_size = content.length(); res.putAll(getJsonResponse(content, setCookies)); int code = iBase == null ? -2 : iBase.checkCode(res, requestInfo); // if (!iBase.isRight(res)) // new AlertOver("响应状态码错误:" + status, "状态码错误:" + status, requestInfo.getUrl(), requestInfo).sendSystemMessage(); MySqlTest.saveApiTestDate(requestInfo, data_size, elapsed_time, status, getMark(), code, LOCAL_IP, COMPUTER_USER_NAME); } catch (Exception e) { logger.warn("获取请求相应失败!", e); if (!SysInit.isBlack(requestInfo.getHost())) new AlertOver("接口请求失败", requestInfo.toString(), requestInfo.getUrl(), requestInfo).sendSystemMessage(); } finally { HEADER_KEY = false; if (!SysInit.isBlack(requestInfo.getHost())) { if (requests.size() > 9) requests.removeFirst(); boolean add = requests.add(request); } } return res; } /** * 获取响应状态,处理重定向的url * * @param response * @param res * @return */ public static int getStatus(CloseableHttpResponse response, JSONObject res) { int status = response.getStatusLine().getStatusCode(); if (status != HttpStatus.SC_OK) logger.warn("响应状态码错误:{}", status); if (status == HttpStatus.SC_MOVED_TEMPORARILY) res.put("location", response.getFirstHeader("Location").getValue()); return status; }
下面是配置:json
/** * 获取请求超时控制器 * <p> * cookieSpec:即cookie策略。参数为cookiespecs的一些字段。做用: * 一、若是网站header中有set-cookie字段时,采用默认方式可能会被cookie reject,没法写入cookie。将此属性设置成CookieSpecs.STANDARD_STRICT可避免此状况。 * 二、若是要想忽略cookie访问,则将此属性设置成CookieSpecs.IGNORE_COOKIES。 * </p> * * @return */ private static RequestConfig getRequestConfig() { return RequestConfig.custom().setConnectionRequestTimeout(HttpClientConstant.CONNECT_REQUEST_TIMEOUT).setConnectTimeout(HttpClientConstant.CONNECT_TIMEOUT).setSocketTimeout(HttpClientConstant.SOCKET_TIMEOUT).setCookieSpec(CookieSpecs.IGNORE_COOKIES).setRedirectsEnabled(false).build(); }
requestconfig既能够在建立httpclient链接池的时候设置,也能够在对HTTPrequestbase进行设置,这里我采起了第一种方式。数组
在学习selenium2java的时候,在写收货地址相关用例的时候碰到了下拉框,恰好练习了一下select的使用,如今分享,供你们参考。cookie
//删除添加收货地址 public static void deleteAndAddUserAdress(WebDriver driver) throws InterruptedException { clickUser(driver); findElementByTextAndClick(driver, "我的信息"); findElementByTextAndClick(driver, "收货地址"); clickDeleteAdress(driver); sleep(0); clickSure(driver); AddAddress(driver); String name = getTextByXpath(driver, ".//*[@id='main']/div[2]/div/div/div[1]/p[1]"); assertTrue("添加收获地址失败!", name.equals("收货人:测试收货人")); }
下面是具体的添加收货地址的方法:框架
//添加收货地址 public static void AddAdress(WebDriver driver) { findElementByIdAndClick(driver, "add-address-btn");//点击添加地址 findElementByXpathAndClearSendkeys(driver, ".//*[@id='LAY_layuipro1a']/div/div[1]/table/tbody/tr[1]/td[2]/div/input", "测试收货人");//添加收货人 findElementByXpathAndClearSendkeys(driver, ".//*[@id='LAY_layuipro1a']/div/div[1]/table/tbody/tr[2]/td[2]/div/input", "13120454218");//输入手机号 //选择省市县,以及详细地址 Select province = new Select(findElementByid(driver, "province-select")); province.selectByIndex(1); Select city = new Select(findElementByid(driver, "city-select")); city.selectByIndex(1); Select area = new Select(findElementByid(driver, "area-select")); area.selectByIndex(1); findElementByClassnameAndClearSendkeys(driver, "textarea", "我是测试地址。"); clickSave(driver); }