当前位置: 首页 > 知识库问答 >
问题:

用REST检查超文本标记语言文档

李兴为
2023-03-14

我正在尝试使用放心来检查服务器返回的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"));
  }
}

现在,此尝试以.xml以下方式结束:无法解析 XML 文档,这是由所有可能的错误引起的,即 java.net.Connect 异常:连接在大约 30 秒左右后超时!

如果我用< code>xmlPathConfig()删除这一行。用()。功能(...)当特性“http://Apache . org/XML/features/disallow-DOCTYPE-decl”设置为true时,由于< code>DOCTYPE被禁止,测试立即失败。。

如果我从文档中删除doctype行,解析会成功,但测试会因断言错误而失败," < code >应为:是" Hello world ",但:是

所以,问题是:如何使用REST Assured检查具有doctype的HTML文档的属性?文档中说“REST Assured providers预定义了HTML、XML和JSON等解析器”,但我似乎找不到任何关于如何确切激活和使用该HTML解析器的示例!例如,没有类似于XmlPath的“HtmlPath”类,超时异常非常令人费解。。。

共有3个答案

孔和风
2023-03-14

以下是带有最新放心APIs的示例代码,即io.restased而不是旧的jayway.restasureed。代码的说明位于代码注释中。

//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);
}
燕寒
2023-03-14

如果您使用的是DSL(给定/何时/然后),那么XmlPath带有CompatibilityMode。如果响应内容类型标头包含兼容的媒体类型(如text/HTML),则会自动使用HTML。例如,如果/index。html包含以下html页面:

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

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

when().
        get("/index.html").
then().
        statusCode(200).
        body("html.title", equalTo("My page"), 
             "html.body",  equalTo("Something"));
夏季萌
2023-03-14

我检查了你的代码。问题是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);
    }
}
 类似资料:
  • 这就是HTML代码。到目前为止,我已经进行了以下xpath查询: 这让我找到了

  • 我试图在HTML的pre标签中包装文本,但它不起作用。我使用下面的CSS作为我的标签。 我从如何在pre标记中换行文本? 我已添加

  • 对于上面的html内容,我如何使用Jsoup解析并获取文本 当我使用 我得到了这样的东西

  • 我是新来的。我想解析html,但问题是我们必须在中指定的URL,我将在运行时从其他页面响应此URL。有没有办法将收到的网址传递到中?我读过这样的东西: 但是我不知道如何使用它。我很想知道是否有其他方法比jsoup更好。

  • 我正在尝试使用BeautifulSoup转换HTML文本块。以下是一个示例: 我试着做了这样的事情: ...但是这样我的span元素总是在新行上。这当然是一个简单的例子。有没有办法在超文本标记语言页面中获取文本,就像它在浏览器中呈现的方式一样(不需要css规则,只是div、spans、li等元素呈现的常规方式)在Python中?

  • 我正在工作的工具提示和从后端我将获得数据与html标记。我需要在工具提示中显示相应的标签中的相应数据。例如,我将从后端获得Hello用户单击此处。我必须显示为你好用户在h1格式,点击这里应该是一个锚。我尝试了这两个功能,并取代其不工作。 具有以下功能: 替换: https://codesandbox.io/s/serene-fast-u8fie?file=/App.svelte