有没有办法验证里面的html标签有一个带有几个li对象的ul(我正在使用groovy)。我需要这样才能检查html是否在单元测试中生成了有效值。
我想:
<div class="example">...<ul><li>Element1</li><li>Element2</li><ul>...</div>
我尝试过最简单的方法:<li>.+?</li>
,我可以提取li元素,但是我需要检查有效的ul div结构。
为什么这不起作用? <div class='example'>.+?<ul>(<li>.+?</li>)*<ul>.+?</div>
怎么会这样?
任何提示?
非常感谢
答案 0 :(得分:4)
使用像jsoup这样的HTML抓取库比使用普通正则表达式更容易,更有趣。由于jsoup是一个java库,你应该能够使用groovy。
答案 1 :(得分:1)
您可以像XML一样解析它并计算元素:
def html = '''
<html>
<ul>
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
</ul>
</html>'''
def htmlNode = new XmlParser().parseText html
assert htmlNode.ul.li.size() == 4
如果html没有正确关闭标签和内容,您可以使用像NekoHTML这样的库来规范化HTML
答案 2 :(得分:1)
使用jsoup,请考虑此测试(如下)。
注意:
verifyHtml()
方法接受HTML片段。示例:
import groovy.util.*
import org.jsoup.*
import org.jsoup.nodes.*
import org.jsoup.select.*
class HtmlTester extends GroovyTestCase {
// returns true if fragment has:
// <div class='list'> <ul> <li> ... </li> </ul> </div>
def verifyHtml(String htmlFragment) {
Document doc = Jsoup.parse(htmlFragment)
Elements divs = doc.select("div.list ul li")
boolean result = (divs.size() > 0)
return result
}
void testDivNoClass() {
def htmlDivNoClass = "<div><ul><li>list 1</li></ul></div>"
assertFalse verifyHtml(htmlDivNoClass)
}
void testDivNoUl() {
def htmlDivNoUl = "<div class='list'></div>"
assertFalse verifyHtml(htmlDivNoUl)
}
void testDivUlNoLi() {
def htmlDivUlNoLi = "<div class='list'><ul></ul></div>"
assertFalse verifyHtml(htmlDivUlNoLi)
}
void testWithGoodHtml() {
def html = """
<div class='list'>
<ul>
<li>list 1</li>
<li>list 2</li>
</ul>
</div>
"""
assertTrue verifyHtml(html)
}
}