def check_html(runner, html, key=None, app=None, check_html=True, check_classes=True):
caller = stack()[1]
filepos = '{}:{:d}'.format(caller.filename.rpartition('/')[2], caller.lineno)
app = app or filepos.partition('_')[2].partition('.')[0]
if key:
filepos += '-{}'.format(key)
store = []
soup = BeautifulSoup(html, 'html.parser')
for desc in soup.descendants:
if isinstance(desc, Tag):
name = desc.name
attrs = desc.attrs
store.append(name)
for attr in sorted(attrs):
tag = str(attrs.get('name'))
if name == 'input' and tag == 'csrfmiddlewaretoken' and attr == 'value':
continue
store.append(attr)
val = attrs[attr]
if check_classes and attr == 'class':
for cls in val:
if cls:
runner.assertIn(cls, CLASS_ARRAY[app], msg=filepos)
if isinstance(val, list):
store.extend(sorted(val))
elif (isinstance(val, str)
and not (val.startswith(STATIC_URL) or ('date' in tag and attr == 'value'))):
if '?' in val:
part = val.rpartition('?')
store.append(part[0])
for arg in sorted(part[2].split('&')):
store.append(arg)
else:
store.append(val)
elif isinstance(desc, NavigableString):
store.append(str(desc))
string = ' '.join(' '.join(store).split())
hsh = md5(string.encode()).hexdigest()[:HASH_LEN]
if check_html:
if WRITE_CHECKFILE:
print(filepos, hsh, file=CHECKFILE)
elif CHECK_HTML:
runner.assertIn(filepos, CHECK_ARRAY, msg=filepos)
runner.assertEqual(CHECK_ARRAY[filepos][:HASH_LEN], hsh, msg=filepos)
评论列表
文章目录