2

对我的 Web 应用程序的一些请求返回的数据不是 HTML 格式 (JSON)。

如何正确处理?

我写了以下页面定义:

import com.fasterxml.jackson.databind.ObjectMapper
import geb.Page

class JsonResponse extends Page {

    static url = null;

    static at = {
        true;
    }

    static ObjectMapper mapper = new ObjectMapper();

    static content = {

        readTree {
            def jsonString = $("pre").text();
            mapper.readTree(jsonString)
        }

    }

}

它显然有效。但问题是,它有多正确?

它从pre标签内部获取数据。这是因为我在里面看到了这个内容driver.pageSource。这个对吗?可能是依赖于驱动程序?

null输入url,因为页面根据查询有不同的 url。这个对吗?

4

3 回答 3

3

Geb 不打算用于与 HTTP API 端点交互,因为它构建在 WebDriver 之上,因此希望通过浏览器和 HTML 页面使用。

如果您想测试 HTTP API 端点,那么我建议您使用 http 客户端来支持您的测试。其中有很多在野外,仅举几例,排名不分先后:

于 2016-01-09T14:42:16.833 回答
1

我能够使用Direct Download API在 geb 单元测试中下载 PDF 的内容。它很方便,因为它从会话中获取所有 cookie,但与浏览器分开下载。

该文档中的示例:

Browser.drive {
    go "http://myapp.com/login"
 
    // login
    username = "me"
    password = "secret"
    login().click()
 
    // now find the pdf download link
    def downloadLink = $("a.pdf-download-link")
 
    // now get the pdf bytes
    def bytes = downloadBytes(downloadLink.@href)
}

下载不同类型的数据有不同的方法。请参阅DownloadSupport API 文档

因为 geb 使用 HttpsURLConnection 连接到 https 端点而不是使用浏览器,所以自签名证书可能会出现问题。我使用这个 Stack Overflow 答案解决了这个问题。

于 2017-09-28T03:21:52.293 回答
0

我同意 Geb 不打算用于与 HTTP API 端点交互,但在某些情况下这可能会有所帮助,因此在此处添加此代码段以供后代使用:

    when: 'I retrieve the JSON transaction list'
    go '/transaction/transactionList'

    then: 'Valid data is retrieved'
    JsonSlurper jsonSlurper = new JsonSlurper()
    Map<String, List> transactionList = jsonSlurper.parseText(driver.pageSource)
    assert transactionList.categories.class == ArrayList
于 2020-05-02T12:45:28.457 回答