我尝试使用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
的类,并且超时异常非常令人费解......
答案 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);
}