如何使用 Geb 检查非 html 响应?

问题描述 投票:0回答:4

对我的 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。这是正确的吗?

json selenium-webdriver groovy geb chrome-web-driver
4个回答
3
投票

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

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


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 端点而不是使用浏览器,因此自签名证书可能会出现问题。我使用 this Stack Overflow 答案解决了这个问题。


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

0
投票

您可以配置 Web 驱动程序以禁用 json 视图,以便浏览器将显示纯 json。这将使提取 json 变得更容易

在 GebConfig.groovy 中

FirefoxOptions firefoxOptions = new FirefoxOptions().addPreference('devtools.jsonview.enabled', false)

然后在Page中检索json

static Closure content = {
    json { $().text() }
}
© www.soinside.com 2019 - 2024. All rights reserved.