对我的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
,因为该页面根据查询具有不同的网址。这是对的吗?
答案 0 :(得分:3)
Geb不打算用于与HTTP API端点交互,因为它建立在WebDriver之上,因此希望通过浏览器和HTML页面使用。
如果您想测试HTTP API端点,那么我建议使用http客户端来支持您的测试。其中有许多是野外出现的,仅举几例,没有特别的顺序:
TestHttpClient
- 再次打算用于测试答案 1 :(得分: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 docs。
由于geb使用HttpsURLConnection连接到https端点而不是使用浏览器,因此您可能会遇到自签名证书问题。我用this Stack Overflow answer解决了这个问题。
答案 2 :(得分: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