跳转到主要内容

HTML/DOM检查器

项目描述

HTML/DOM检查器

当测试生成DOM节点(如小部件)的代码时,我们希望能够对重要的事项进行断言。我们想要忽略的一些示例

  • 属性顺序

  • 额外属性

  • 属性顺序

  • 额外类

  • 额外节点

zc.htmlchecker提供了一个可以单独使用或作为doctest输出检查器的检查器对象。

入门

让我们看看一些例子。

这是一个示例期望字符串

<body>
  <button class="mybutton">press me</button>
</body>

让我们创建一个检查器

>>> import zc.htmlchecker
>>> checker = zc.htmlchecker.HTMLChecker()

您可以使用期望和观察到的HTML调用其check方法

>>> checker.check(
... expected,
... """<html><body><button x='1' class="widget mybutton">press me</button>
...          </body></html>""")

如果匹配成功,则不返回任何内容。为了匹配成功,期望输出只需在观察输出中明确找到即可。在上面的示例中,只有一个body标签,因此它知道如何进行匹配。请注意,忽略了空白差异,以及额外的观察属性和额外的类。

doctest检查器

要将zc.htmlchecker用作doctest检查器,请在设置doctests时传递HTMLChecker实例作为输出检查器。

当用作doctest检查器时,不以<开头的期望文本将使用默认检查器进行检查,或者您传递的作为基的检查器。

您可能希望使用另一个检查器检查一些HTML示例。在这种情况下,您可以指定一个前缀。只有以该前缀开头示例才会用HTML检查器进行检查,并且将移除前缀。

期望多个节点

我们可以期望多个节点

<button>Cancel</button>
<button>Save</button>

此示例期望输出中有2个按钮节点。

>>> checker.check(expected,
... """<html><body>
...         <button id='cancel_button' class="button">Cancel</button>
...         <button id='save_button' class="button">Save</button>
...    </body></html>""")

但是如果没有匹配,则很难弄清楚出了什么问题

>>> checker.check(expected,
... """<html><body>
...         <button id='cancel_button' class="button">Cancel</button>
...         <button id='save_button' class="button">OK</button>
...    </body></html>""")
Traceback (most recent call last):
...
MatchError: Couldn't find wildcard match
Expected:
<button>
 Save
</button>
<BLANKLINE>
Observed:
<html>
 <body>
  <button class="button" id="cancel_button">
   Cancel
  </button>
  <button class="button" id="save_button">
   OK
  </button>
 </body>
</html>

我们将稍后回到通配符匹配。在这里,匹配器检测到它没有匹配到一个按钮,但无法具体说明哪个按钮是问题所在。我们可以通过使用id来简化它的任务。

<button id='cancel_button'>Cancel</button>
<button id='save_button'>Save</button>

现在我们正在寻找具有特定id的按钮节点。

>>> checker.check(expected,
... """<html><body>
...         <button id='cancel_button' class="button">Cancel</button>
...         <button id='save_button' class="button">OK</button>
...    </body></html>""")
Traceback (most recent call last):
...
MatchError: text nodes differ u'Save' != u'OK'
Expected:
<button id="save_button">
 Save
</button>
<BLANKLINE>
Observed:
<button class="button" id="save_button">
 OK
</button>
<BLANKLINE>

这要更有帮助。

通配符

说到通配符匹配,有时你想忽略中间节点。你可以通过在一个具有你想要忽略的中间节点的节点顶部使用省略号来实现这一点。

<form>
  ...
  <button id='cancel_button'>Cancel</button>
  <button id='save_button'>Save</button>
</form>

在这种情况下,我们想要找到表单节点内的按钮节点。我们不在乎是否有中间节点。

>>> checker.check(expected,
... """<html><body>
...    <form>
...      <div>
...         <button id='cancel_button' class="button">Cancel</button>
...         <button id='save_button' class="button">Save</button>
...      </div>
...    </form>
...    </body></html>""")

在查找期望的文本时,我们基本上在观察到的文本上执行通配符匹配。

有时,我们想要检查可能嵌入在我们无法控制的某些生成结构(如由库产生的网格)中的文本节点。要做到这一点,请包括一个以包含省略号的行开始的文本节点。例如,我们可能期望有一个包含一些数据的网格/表格。

<div id="mygrid" name="">
...
Name    Favorite Color
Sally   Red
Bill    Blue
</div>

我们不知道我们的库如何包裹数据,所以我们只是测试数据的出现。

>>> import sys
>>> try: checker.check(expected,
... """<html><body>
...      <div id='mygrid' name='' xid="1">
...        <table>
...          <tr><th>Name</th><th>Favorite Color</th></tr>
...          <tr><td>Sally</td><td>Red  </td></tr>
...          <tr><td>Bill </td><td>Green</td></tr>
...        </table>
...      </div>
...    </body></html>""")
... except zc.htmlchecker.MatchError:
...    error = sys.exc_info()[1]
... else: print 'oops'
>>> print error # doctest: +ELLIPSIS
Blue not found in text content.
...
>>> checker.check(expected,
... """<html><body>
...      <div id='mygrid' name='' xid="1">
...        <table>
...          <tr><th>Name</th><th>Favorite Color</th></tr>
...          <tr><td>Sally</td><td>Red  </td></tr>
...          <tr><td>Bill </td><td>Blue</td></tr>
...        </table>
...      </div>
...    </body></html>""")

您可以使用其他BeautifulSoup解析器

HTMLChecker使用BeautifulSoup。它默认使用'html5lib'解析器,但你也可以传递不同的解析器名称。你很可能想避免使用'html.parser'解析器,因为它存在bug。

>>> checker = zc.htmlchecker.HTMLChecker(parser='html.parser')
>>> checker.check('<input id="x">', '<input id="x"><input>')
Traceback (most recent call last):
...
MatchError: Wrong number of children 1!=0
Expected:
<input id="x"/>
<BLANKLINE>
Observed:
<input id="x">
 <input/>
</input>

在这里,'html.parser'决定输入标签需要关闭标签,即使HTML输入标签是空的。这可能是部分原因,因为底层解析器是一个XHTML解析器。

变更

0.1.0 2013-08-31

初始发布。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

zc.htmlchecker-0.1.0.tar.gz (9.3 kB 查看哈希值)

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面