【问题标题】:How to get Ajax response in HTML Unit (it renders the HTML of the web page)如何在 HTML 单元中获取 Ajax 响应(它呈现网页的 HTML)
【发布时间】:2013-08-28 09:13:55
【问题描述】:

当我向服务器发出 AJAX 请求以进行 CRUD 操作时,我有一个 Web 应用程序返回 JSON。这样做的原因是因为我使用 jQuery 来处理数据而不刷新页面(MVC),所以如果我在系统中创建一个新条目,服务器将返回一个响应,其中包含创建的 JSON 格式的条目。 jQuery 管理接收到的数据并将条目呈现在列表中(与之前创建的条目一起)。

现在我正在使用 HTML 单元对其进行测试,但如果我尝试

WebResponse response = page.getWebResponse()

我得到 200 个状态和消息“OK”。但我期待的是我创建的条目的 JSON 数据。

如果我尝试

page.asText()

我得到了当前页面的 HTML(条目已经在列表中,但不是我想要的数据)。

这是一个与此类似的问题,没有回应:Json ajax call returning response 200 ok

PD:jQuery 表单有两个字段,一个是名称的文本输入,另一个是汽车设置的选择。我将要选择的设置列表传递给此函数。该名称是使用时间戳和静态 int 种子自动生成的。这是我正在使用的代码:

public void create(List<Settings> settings) throws FailingHttpStatusCodeException, MalformedURLException, IOException
{
    page = webClient.getPage("localhost:8080/cars/list");

    int elementsCount = getEntitiesCount();
    creationSeed = elementsCount+1;

    HtmlAnchor anchor = (HtmlAnchor) page.getFirstByXPath("//a[@class='action-createCar']");
    page = (HtmlPage) anchor.click();

    HtmlForm form = page.getFirstByXPath("//form[@class='CarsForm']");
    form = page.getForms().get(0);
    HtmlTextInput nameField = form.getInputByName("CarsForm-name");
    nameField.setText("Test " + creationSeed + " - " + new Date().getTime());

    HtmlSelect columnSelectList = (HtmlSelect) form.getSelectByName("CarsForm-settings");
    if (settings != null && settings.size() > 0)
        for (Settings setting : settings)
        {
            HtmlOption htmlOption = columnSelectList.getOptionByValue(setting.name());
            htmlOption.setSelected(true);
        }

    //looking for the button to submit the form
    HtmlDivision buttonSet = page.getFirstByXPath("//div[@class='ui-dialog-buttonset']");
    HtmlButton okButton = (HtmlButton) buttonSet.getFirstElementChild();

    page = okButton.click();

    assertEquals(elementsCount + 1, getEntitiesCount());

    //Here is where I want to get the server response to check the data which is returned by the server
    //And neither page.getWebResponse() or page.asText() contains it
}

}

【问题讨论】:

  • 发布您尝试过的内容
  • "如果我尝试 WebResponse response = page.getWebResponse() 我得到 200 状态和消息“OK”。但我期待我创建的条目的 JSON 数据。如果我尝试 page.asText () 我得到了当前页面的 HTML(条目已经在列表中,但不是我想要的数据)。”
  • 请发布您的代码
  • 我已经包含了测试用例的代码
  • 显然,如果没有 HTML 代码,就不可能知道发生了什么。 EG:你说你希望page 得到回应……但是okButton.click() 做了什么?

标签: jquery ajax json testing htmlunit


【解决方案1】:

我遇到了类似的问题,并使用HtmlUnit FAQ page找到了解决方案:

您可以继承 HttpWebConnection 并将 getResponse() 重写为:

   new WebConnectionWrapper(webClient) {

       public WebResponse getResponse(WebRequest request) throws IOException {
           WebResponse response = super.getResponse(request);
           if (request.getUrl().toExternalForm().contains("my_url")) {
               String content = response.getContentAsString("UTF-8");

               //change content

               WebResponseData data = new WebResponseData(content.getBytes("UTF-8"),
                       response.getStatusCode(), response.getStatusMessage(), >response.getResponseHeaders());
               response = new WebResponse(data, request, response.getLoadTime());
           }
           return response;
       }
   };

这意味着我们可以包装我们的 webClient 对象,拦截我们需要的任何请求和响应,提取它们或进行更改。


我创建了一个扩展 WebConnectionWrapper 的内部类,并且有一个我需要的 JSON 字段:

private class JsonResponseWebWrapper extends WebConnectionWrapper{

    public JsonResponseWebWrapper(WebClient webClient){
        super(webClient);           
    }
    
    String jsonResponse;
    
    @Override
    public WebResponse getResponse(WebRequest request) throws IOException {;
        WebResponse response = super.getResponse(request);
        //extract JSON from response
        jsonResponse = response.getContentAsString();
        return response;
    }

    public String getJsonResponse() {
        return jsonResponse;
    }
};

这样我们将拦截每一个响应。但首先我们需要包装 webClient。我在请求 JSON 响应之前这样做了,所以我不必向我的包装器添加条件:

JsonResponseWebWrapper jrww = new JsonResponseWebWrapper(webClient);
page = button.click();
String rawJSON = jrww.getJsonResponse();

之后,您可以使用您最喜欢的 JSON 解析器对其进行解析。 希望这会有所帮助!

【讨论】:

  • 我不得不让 JsonResponseWebWrapper 扩展 HttpWebConnection 并通过执行 webClient.setWebConnection(jsonResponseWebWrapper); 其中 jsonResponseWebWrapper = new JsonResponseWebWrapper(webClient);
猜你喜欢
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2011-05-19
  • 2015-09-03
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多