Browsermob-proxy 项目地址:https://github.com/lightbody/browsermob-proxy
测试场景说明:
场景A:
在报表界面,类型选择“日报”,日期选“2016-08-03”,点“下载”,下载一份 csv 格式的文件。
请求:
GET /report?type=day&date=2016-08-03 HTTP/1.1
Host: testerhome.com
...
响应:
HTTP/1.1 200 OK
Content-Type: text/csv
日期,销售额
2016-08-03,3210.40
对于Content-Type: text/csv,把 body 保存为 csv 文件是浏览器行为,所以在对被测系统,可以把点“下载”后的请求作为验证点。
场景B:
统计网页中推荐位的展示量。
1、打开网页,获取推荐位内容:
GET /recommend HTTP/1.1
Host: testerhome.com
...
HTTP/1.1 200 OK
Content-Type: application/json
{
"content-id": 508,
"content": "TestHome",
"url": "http://testerhome.com/"
}
2、生成推荐位部分的 HTML 如下:
<div id="recommend">
<a href="http://testerhome.com/" content-id="508">TestHome</a></div>
3、推荐位被展示时,发出包含统计信息的异步请求:
POST /statistics HTTP/1.1
Host: testerhome.com
Content-Type: application/json
{
"content-id": 508,
"event": "show"
}
HTTP/1.1 200 OK
Content-Type: application/json
{
"status": "success"
}
这里把滚动到id="recommend"元素后发出的请求作为验证点。
代码示例:
1、这里用了 Selenide 和 AssertJ。
2、Browsermob-proxy 可以将捕获的 HTTP 内容保存为 HAR 格式,也是 Json ,就用 JsonPath 查找需要的内容了。
下载报表:
public class Report {
BrowserMobProxy proxy;
@BeforeMethod
public void beforeMethod() {
com.codeborne.selenide.Configuration.browser="chrome";
proxy = new BrowserMobProxyServer();
proxy.start(0);
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
WebDriverRunner.closeWebDriver(); //注意,需要在开启 Driver 前设置代理,需要根据自己用例组织情况决定是否重启 Driver
WebDriverRunner.setProxy(seleniumProxy);
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.REQUEST_HEADERS);
open("http://testerhome.com/report/");
}
@AfterMethod
public void afterMethod() {
WebDriverRunner.closeWebDriver(); //注意,防止代理影响其他用例,结束后关闭 Driver
}
@Test
public void downloadReport() {
$("#report-type").selectOptionContainingText("日报");
$("#report-date").setValue("2016-08-03");
proxy.newHar("report");
$("#report-download").click();
sleep(1000);
StringWriter writer = new StringWriter();
try {
proxy.getHar().writeTo(writer);
} catch (IOException e) {
e.printStackTrace();
}
String harAsString = writer.toString();
Object document = com.jayway.jsonpath.Configuration.defaultConfiguration().jsonProvider().parse(harAsString);
JSONArray reqUrl = JsonPath.read(document, "$..url");
assertThat(reqUrl.get(0)).isEqualTo("http://testerhome.com/report?type=day&date=2016-08-03");
}}
埋点:
public class Recommend {
BrowserMobProxy proxy;
@BeforeMethod
public void beforeMethod() {
com.codeborne.selenide.Configuration.browser="chrome";
proxy = new BrowserMobProxyServer();
proxy.start(0);
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
WebDriverRunner.closeWebDriver(); //注意,需要在开启 Driver 前设置代理,需要根据自己用例组织情况决定是否重启 Driver
WebDriverRunner.setProxy(seleniumProxy);
proxy.enableHarCaptureTypes(CaptureType.RESPONSE_HEADERS, CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT, CaptureType.REQUEST_HEADERS);
}
@AfterMethod
public void afterMethod() {
WebDriverRunner.closeWebDriver(); //注意,防止代理影响其他用例,结束后关闭 Driver
}
@Test
public void recommendStatistics() {
String recommend = "{\n" +
" \"content-id\": 508,\n" +
" \"content\": \"TestHome\",\n" +
" \"url\": \"http://testerhome.com/\"\n" +
"}";
// mock 推荐位内容
proxy.addResponseFilter(new ResponseFilter() {
@Override
public void filterResponse(HttpResponse response, HttpMessageContents contents, HttpMessageInfo messageInfo) {
String url = messageInfo.getUrl();
if (url.contains("/recommend")) {
contents.setTextContents(recommend);
}
}
});
proxy.newHar("report");
open("http://testerhome.com/");
$("#recommend").scrollTo().shouldBe(Condition.visible);
assertShow(Integer.valueOf(508));
}
private void assertShow(Integer expectContentId) {
StringWriter writer = new StringWriter();
try {
Thread.sleep(2000);
proxy.getHar().writeTo(writer);
} catch (IOException e) {
e.printStackTrace();
} catch 声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com
支持全球约2.4万个城市地区天气查询,如:天气实况、逐日天气预报、24小时历史天气等
支持识别各类商场、超市及药店的购物小票,包括店名、单号、总金额、消费时间、明细商品名称、单价、数量、金额等信息,可用于商品售卖信息统计、购物中心用户积分兑换及企业内部报销等场景
涉农贷款地址识别,支持对私和对公两种方式。输入地址的行政区划越完整,识别准确度越高。
根据给定的手机号、姓名、身份证、人像图片核验是否一致
通过企业关键词查询企业涉讼详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。