0

有没有办法验证在 html 标签内有一个带有几个 li 对象的 ul(我正在使用 groovy)。我需要它来检查 html 是否在单元测试中生成了它的有效性。

我想 :

  • 提取 li 元素的数量及其数据
  • 验证是否在指定类的指定内部,该 div 内部可能是不同的 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> 应该如何?

有小费吗?

非常感谢

4

3 回答 3

4

使用诸如jsoup之类的 HTML 抓取库比使用纯正则表达式更容易且有趣。由于 jsoup 是一个 java 库,因此您应该能够将它与 groovy 一起使用。

于 2012-09-29T19:15:08.193 回答
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

于 2012-09-30T01:11:29.553 回答
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)
    }    
}
于 2012-10-01T03:01:02.327 回答