在我的测试中,我检查:
assertEquals("<div class=\"action-button\" title=\"actionButton\">"</div>", result);
如果有人更改了html(result
),放置SPACE,HTML仍然有效,但我的测试会失败。
有没有办法比较两个html片段,如果它们与HTML相同。与assertHTMLEquals
XML UNIT说这两行是相同的:
字符串1:
<ldapConfigurations>
<ldap tenantid="" active="false">
</ldap>
</ldapConfigurations>
字符串2:
<ldapConfigurations>
<ldapdd tenantid="" active="false">
</ldap>
</ldapConfigurations>
但是他们不是,你可以看到。 (见:ldapdd
)
答案 0 :(得分:4)
这不一定适用于您的情况,但如果您的HTML恰好是有效的XML,它将会。您可以使用名为xmlunit的此工具。有了它,你可以编写一个如下所示的断言方法:
public static void assertXMLEqual(Reader reader, String xml) {
try {
XMLAssert.assertXMLEqual(reader, new StringReader(xml));
} catch (Exception ex) {
ex.printStackTrace();
XMLAssert.fail();
}
}
如果这对您不起作用,可能还有一些其他工具可用于HTML比较。如果这不起作用,您可能希望最终使用像jtagsoup(或其他)这样的库,并比较它解析的所有字段是否相等。
答案 1 :(得分:3)
您可以通过XMLUnit的TolerantSaxDocumentBuilder
实用程序实现格式错误的HTML断言。
TolerantSaxDocumentBuilder tolerantSaxDocumentBuilder =
new TolerantSaxDocumentBuilder(XMLUnit.newTestParser());
HTMLDocumentBuilder htmlDocumentBuilder =
new HTMLDocumentBuilder(tolerantSaxDocumentBuilder);
XMLAssert.assertXMLEqual(htmlDocumentBuilder.parse(expectedHTML),
htmlDocumentBuilder.parse(actualHTML));
为了支持格式错误的HTML(例如没有关闭标记的元素 - 在XML中无法想象),您必须使用其他文档构建器TolerantSaxDocumentBuilder
以及HTMLDocumentBuilder
(这个将允许在网页上断言)。之后,像往常一样断言文件。
public class TestHTML {
public static void main(String[] args) throws Exception {
String result = "<div class=\"action-button\" title=\"actionButton\"> </div>";
assertHTMLEquals("<div class=\"action-button\" title=\"actionButton\"></div>", result); // ok!
// notice it is badly formed
String expectedHtml = "<html><title>Page Title</title>"
+ "<body><h1>Heads<ul>"
+ "<li id='1'>Some Item<li id='2'>Another item";
String actualMalformedHTML = expectedHtml.replace(" ", " "); // just added some spaces, wont matter
assertHTMLEquals(expectedHtml, actualMalformedHTML); // ok!
actualMalformedHTML = actualMalformedHTML.replace("Heads", "Tails");
assertHTMLEquals(expectedHtml, actualMalformedHTML); // assertion fails
}
public static void assertHTMLEquals(String expectedHTML, String actualHTML) throws Exception {
TolerantSaxDocumentBuilder tolerantSaxDocumentBuilder = new TolerantSaxDocumentBuilder(XMLUnit.newTestParser());
HTMLDocumentBuilder htmlDocumentBuilder = new HTMLDocumentBuilder(tolerantSaxDocumentBuilder);
XMLAssert.assertXMLEqual(htmlDocumentBuilder.parse(expectedHTML), htmlDocumentBuilder.parse(actualHTML));
}
}
请注意,HTML函数也可以使用XML函数,例如XPath。
如果使用Maven,请将其添加到pom.xml
:
<dependency>
<groupId>xmlunit</groupId>
<artifactId>xmlunit</artifactId>
<version>1.4</version>
</dependency>