对我的 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。这是正确的吗?
Geb 不打算用于与 HTTP API 端点交互,因为它构建在 WebDriver 之上,因此期望通过浏览器和 HTML 页面使用。
如果您想测试 HTTP API 端点,那么我建议使用 http 客户端来支持您的测试。其中有很多在野外,仅举几例(排名不分先后):
TestHttpClient
- 再次用于测试我能够使用 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 端点而不是使用浏览器,因此自签名证书可能会出现问题。我使用 this Stack Overflow 答案解决了这个问题。
我同意 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
您可以配置 Web 驱动程序以禁用 json 视图,以便浏览器将显示纯 json。这将使提取 json 变得更容易
在 GebConfig.groovy 中
FirefoxOptions firefoxOptions = new FirefoxOptions().addPreference('devtools.jsonview.enabled', false)
然后在Page中检索json
static Closure content = {
json { $().text() }
}