掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

使用 Selenium 执行测试时,配合 Browsermob-proxy 验证埋点和下载功能

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

  • 个人/企业涉诉查询

    通过企业关键词查询企业涉松详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

    通过企业关键词查询企业涉松详情,如裁判文书、开庭公告、执行公告、失信公告、案件流程等等。

  • 账号黑产风险识别

    根据手机号来查询是否命中黑产风险

    根据手机号来查询是否命中黑产风险

  • IP反查域名

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

    IP反查域名是通过IP查询相关联的域名信息的功能,它提供IP地址历史上绑定过的域名信息。

  • 人脸卫士

    结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。

    结合权威身份认证的精准人脸风险查询服务,提升人脸应用及身份认证生态的安全性。人脸风险情报库,覆盖范围广、准确性高,数据权威可靠。

  • 全国城市空气质量

    全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。

    全国城市和站点空气质量查询,污染物浓度及空气质量分指数、空气质量指数、首要污染物及空气质量级别、健康指引及建议采取的措施等。

0512-88869195
数 据 驱 动 未 来
Data Drives The Future