wmde/hamcrest-html-matchers

一组用于HTML断言的Hamcrest匹配器


README

Build Status Scrutinizer Code Quality Code Coverage

用法示例

Hamcrest 允许您创建复杂且灵活的断言。只需记住

"你可以"并不意味着"你应该"。

以下示例展示了如何确保有一个HTML表单,并且其中输入的密码不是弱密码

$html = '<div>
            <form>
                <input name="password" value="strong password"/>
            </form>
         </div>';

assertThat($html, is(htmlPiece(
    havingChild(
        both(withTagName('form'))
        ->andAlso(
            havingDirectChild(
                allOf(
                    withTagName('input'),
                    withAttribute('name')->havingValue('password'),
                    withAttribute('value')->havingValue(not('weak password')))))))));

用法限制

  • 每个HTML断言都从 htmlPiece() 调用开始(可以使用 is() 来提高可读性)
  • 需要将 havingRootElement()havingDirectChild()havingChild() 之一作为参数传递给 htmlPiece()

文档

有关Hamcrest通用使用的信息可以在Hamcrest GitHub仓库找到。

可用匹配器

  • htmlPiece() - 检查字符串是否是有效的HTML,解析它并在存在的情况下传递给给定的匹配器

    assertThat('<p></p>', is(htmlPiece())); // Just checking that string is a valid piece of HTML
  • havingRootElement - 检查给定的约束与HTML的根元素。 注意:只能传递给 htmlPiece()

    assertThat('<p></p>', htmlPiece(havingRootElement(withTagName('p'))));
  • havingDirectChild - 检查给定的约束与直接子元素

    assertThat('<p><b></b></p>', htmlPiece(havingRootElement(havingDirectChild(withTagName('b')))));
  • havingChild - 检查给定的约束与所有子元素

    assertThat('<p><b></b></p>', htmlPiece(havingChild(withTagName('b'))));
  • withTagName - 检查给定的约束与标签名

    assertThat('<p><b></b></p>', htmlPiece(havingChild(withTagName(
        either(equalTo('i'))->orElse(equalTo('b'))
    ))));
  • withAttribute - 检查给定的约束与元素属性的比较(比较名称和值)

    assertThat('<p><input required></p>', htmlPiece(havingChild(withAttribute('required'))));
    assertThat('<p><input data-value="some data"></p>', htmlPiece(havingChild(
        withAttribute(startsWith('data-'))->havingValue('some data'))));
  • withClass - 检查给定的约束与元素的类列表

    assertThat('<p class="class1 class2 class3"></p>', htmlPiece(havingChild(
          withClass('class2'))));
  • havingTextContents - 检查给定的约束与元素的文本内容

    assertThat('<div><p>this is Some Text</p></div>', htmlPiece(havingChild(
        havingTextContents(containsString('some text')->ignoringCase()))));
  • tagMatchingOutline - 宽容地检查标签是否与给定的 大纲 匹配(大纲 - HTML格式中的标签表示)

    这意味着

    • 元素的标签名等于大纲的标签名
    • 元素具有与大纲相同的属性及其值。如果元素具有比大纲更多的属性,它仍然匹配。
      • 注意: 属性 class 以不同的方式处理(见下文)。
      • 注意: 如果属性大纲是布尔值,则不会检查元素中的值,只需检查是否存在。
    • 元素具有与大纲相同的所有HTML类。

    这将通过

    assertThat('<form><input id="id-pass" name="password" class="pretty green" required="required"></form>', 
        htmlPiece(havingChild(
            tagMatchingOutline('<input name="password" class="green" required>')
      )));