在使用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); }