【问题标题】:xml.etree.ElementTree >> Python >> How to access child element and make assertionsxml.etree.ElementTree >> Python >> 如何访问子元素并进行断言
【发布时间】:2020-07-16 14:39:25
【问题描述】:

我正在使用 PyTest 来验证 xml api 响应。 从 api 请求获取以下响应(response.content)

b'<?xml version="1.0" encoding="UTF-8"?>
<Result0>
<Result1>
<Result3>
<Id>2</Id>
<ItemId>https://purchanse.com/62/E00036415</ItemId>
<Place>kpi:62_CS415-TEN-1080p25-ABC</Place>
<Marks>12</Marks>
<SubId>9, 8</SubId>
<Description>https://purchanse.com/62/E00036416</Description>
</Result3>
<Result4>
<Id>2</Id>
<ItemId>https://purchanse.com/64/E00036417</ItemId>
<Place>kpi:63_CS415-TEN-1080p25-XYZ</Place>
<Marks>12</Marks>
<SubId>9</SubId>
<Description>https://purchanse.com/64/E00036416</Description>
</Result4>
</Result1>
</Result0>'

在测试函数中我有这个代码

def test_CheckResponseContent():
    element = et.fromstring(response.content)
    print("element", element)  # Getting <Element 'Result0' at 0x04A88C58> as output
    links = element.find("Result0/Result1")
    print("L:", links)  # Returns 'None'

element = et.fromstring(response.content)
    for child in element.iter('*'):
        print(child.tag)

我想做这样的断言

Marks == 12
Id == 2
ItemId != "https://purchanse.com/62/E00036416"

我怎样才能为此解析 XML?
有人可以帮忙吗

【问题讨论】:

  • 使用 XPath 查询,例如assert element.find('.//Result1/Result3/Marks').text == '12' 等。您从 Result0 开始,所以所有查询都是相对于 Result0 节点进行的。
  • @stackoverflow.com/users/2650249/hoefling 非常感谢。如果在任何节点中不满足条件,是否有任何方法可以在循环中检查并将断言标记为“失败”。就像,我想在所有子节点中检查 SubId == 9。所以它应该失败,因为在第一个子节点中我们有 9, 8
  • element.findall('.//Result1//SubId') 将为您提供位于Result1 子树中的所有SubId 元素的列表。从那里,你可以在一个循环中断言或做类似assert all(el.text == '9' for el in element.findall('.//Result1//SubId'))

标签: python-3.x xml pytest elementtree


【解决方案1】:

您有 多个 带有提及名称的标签,因此相应的 应单独为每个父级执行一组检查 这些标签。

要做到这一点,试试下面的代码,也许没有 print 语句:

for it in element.findall('Result1/*'):
    print(it.tag)
    mrks = it.findtext('Marks')
    id = it.findtext('Id')
    itmId = it.findtext('ItemId')
    print(mrks, id, itmId)
    assert mrks == '12'
    assert id == '2'
    assert itmId != 'https://purchanse.com/62/E00036416'

【讨论】:

  • stackoverflow.com/users/7388477/valdi-bo 谢谢。其实这就是我一直在寻找的。但不知何故,我无法打印那些声明(我想看到)。除此之外,还有任何方法可以使用包含或使用 OR 来检查列表中存在的 itemId。像 ``assert itmId != purchanse.com/62/E00036416 或 purchanse.com/62/E00036417 或 purchanse.com/62/E00036416`` 断言 itmId 包含 purchanse.com/62/E00036416purchanse.com/62/E00036417purchanse.com/62/E00036416
  • 首先在您的帖子中包含的相同输入数据示例上尝试我的代码。如果我的代码打印出所需的数据,您就有证据证明它是可以的。如果此代码未在 other 输入数据上打印预期结果,则可能此(其他)数据在某些方面有所不同,您应该识别这种差异。就其他条件而言:我的代码首先读取每个元素的内容。然后,在各个变量中包含内容,您可以检查您想要的任何内容,包括特定条件的 OR。
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多