使用REST Assured检查HTML文档

时间:2015-10-16 09:56:06

标签: rest-assured

我尝试使用REST Assured检查我的服务器返回的HTML文档的某些属性。证明问题的SSCCE如下:

import static com.jayway.restassured.path.xml.config.XmlPathConfig.xmlPathConfig;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Test;

import com.jayway.restassured.path.xml.XmlPath;

public class HtmlDocumentTest {

  @Test
  public void titleShouldBeHelloWorld() {
    final XmlPath xml = new XmlPath("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
      + "<html xmlns=\"http://www.w3.org/1999/xhtml\">"
      + "<head><title>Hello world</title></head><body></body></html>")
      .using(xmlPathConfig().with().feature("http://apache.org/xml/features/disallow-doctype-decl", false));
    assertThat(xml.get("//title[text()]"), is("Hello world"));
  }
}

现在,此尝试以com.jayway.restassured.path.xml.exception.XmlPathException: Failed to parse the XML document结束,在所有可能的错误导致java.net.ConnectException: Connection timed out造成约30秒左右!

如果我删除xmlPathConfig().with().feature(...)行,则由于DOCTYPE is disallowed when the feature "http://apache.org/xml/features/disallow-doctype-decl" set to true.,测试会立即失败。

如果从文档中删除doctype行,则解析成功,但测试在断言错误时失败,&#34; Expected: is "Hello world" but: was <Hello worldnull>&#34; - 然而,这显然是一个不同的问题(但也可以自由地给出关于那个问题的说明......)。无论如何,删除doctype不是一个选项。

所以,问题:如何使用REST Assured检查带有doctype的HTML文档的属性?它表示in the documentation&#34; REST保证提供商的预定义解析器,例如HTML,XML和JSON。&#34;,但我似乎无法找到有关如何激活和使用该HTML解析器的任何示例!没有&#34; HtmlPath&#34;例如,类似于XmlPath的类,并且超时异常非常令人费解......

3 个答案:

答案 0 :(得分:10)

如果您正在使用DSL(给定/当/然后),如果响应内容类型标头包含CompatibilityMode.HTML兼容的媒体类型(例如{{},则自动使用带有html的XmlPath 1}})。例如,如果text/html包含以下html页面:

/index.html

然后您可以像这样验证标题和正文:

<html>
    <title>My page</title>
    <body>Something</body>
</html>

答案 1 :(得分:7)

我检查了你的代码。问题是,Restassured的XmlPath不是Xpath,而是使用属性访问语法。如果您向示例HTML添加正文内容,您将看到您的XPath没有做太多。查询语言的实际名称是GPath。以下示例有效,请注意使用CompatibilityMode.HTML,它具有您需要的正确配置:

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import com.jayway.restassured.path.xml.XmlPath;
import com.jayway.restassured.path.xml.XmlPath.CompatibilityMode;

public class HtmlDocumentTest {

    @Test
    public void titleShouldBeHelloWorld() {
        XmlPath doc = new XmlPath(
                CompatibilityMode.HTML,
                "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">"
                        + "<html xmlns=\"http://www.w3.org/1999/xhtml\">"
                        + "<head><title>Hello world</title></head>"
                        + "<body>some body"
                        + "<div class=\"content\">wrapped</div>"
                        + "<div class=\"content\">wrapped2</div>"
                        + "</body></html>");

        String title = doc.getString("html.head.title");
        String content = doc.getString("html.body.div.find { it.@class == 'content' }");
        String content2 = doc.getString("**.findAll { it.@class == 'content' }[1]");

        assertEquals("Hello world", title);
        assertEquals("wrapped", content);
        assertEquals("wrapped2", content2);
    }
}

答案 2 :(得分:0)

这里是带有最新放心的api的示例代码,即io.restassured,而不是较旧的jayway.restassured。该代码的解释在代码注释中。

//Demo for an api which returns a json string inside html. The json string is just an array of objects.

import io.restassured.RestAssured;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;

import java.util.List;

import static io.restassured.RestAssured.*;

public void testMyApi() {
    Response response =
            when().
                    get("www.myapi.com/data").
            then().
                    extract().
                    response();
    
    String bodyTxt = response.htmlPath().getString("body");//Get the body element of the html response.
    JsonPath jsonObj = new JsonPath(bodyTxt);//helps us to find things in a json string.

    List<String> rootItems = jsonObj.getList("$");//get root element of the json part.

    System.out.println(rootItems);
}