如何用Geb检查NON-html响应?

时间:2016-01-07 20:00:22

标签: json selenium-webdriver groovy geb chrome-web-driver

对我的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,因为该页面根据查询具有不同的网址。这是对的吗?

3 个答案:

答案 0 :(得分:3)

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

如果您想测试HTTP API端点,那么我建议使用http客户端来支持您的测试。其中有许多是野外出现的,仅举几例,没有特别的顺序:

答案 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