我在“放心”方面的经验有限。我们有很多测试,我通常可以在google中找到示例,或者失败,但当我尝试匹配匿名数组中元素的嵌套属性,并验证属性上下(堂兄弟?)时,我会陷入困境。
示例 JSON:
[
{
"id":1,
"type":{
"typeId":3,
"name":"LPM"
},
"status":{
"id":1,
"price":1.20,
"source":172,
"valid":0
}
},
{
"id":2,
"type":{
"typeId":2,
"name":"ST"
},
"status":{
"id":10,
"price":1.20,
"source":172,
"valid":0
}
}
]
我正在使用放心,我想在列表中找到type.name
等于LPM的元素,然后仅验证该元素的status.price
、status.source
和status.id
。
当我最初开始验证响应时,数组中只能有一个项目,因此我使用了:
response.then()
.assertThat()
.body("size", greaterThan(0))
.body("[0].type.name", equalToIgnoringCase("LPM"))
.body("[0].status.id", equalTo(statusId))
.body("[0].status.source", equalTo(sourceId))
.body("[0].status.price", equalTo(price));
但是,这不再保证工作,因为数组中可能有多个元素,并且顺序不保证。
我已将我的身体检查修改为:
response.then()
.assertThat()
.body("size", greaterThan(0))
.body("type.name", hasItem("LPM"))
.body("status.id", hasItem(statusId))
.body("status.source", hasItem(sourceId))
.body("status.price", hasItem(price));
这足以使测试通过,但这会带来风险,即具有 type.name LPM 的元素的 status.id
、status.source
和 status.price
可能不正确,但这不会被检测到,因为它们将与具有 type.name
ST 的元素进行匹配。
所以我希望能够找到具有LPM的元素,因为它是type.name
,我可以保证只有一个,然后对于status.id
、status.source
和status.price
,只检查该元素,即不是ST元素。
我试图修改我的正文匹配器以找到我需要的type.name
的元素,但我无法让它工作,因为我不知道如何返回树,穿过和向下,检查同一元素中的其他属性:
response.then()
.assertThat()
.body("size", greaterThan(0))
.body("$.findAll (it.type.name = LPM}.status.id ", hasItem(statusId))
.body("$.findAll (it.type.name = LPM}.status.source", hasItem(sourceId))
.body("$.findAll (it.type.name = LPM}.status.price", hasItem(price));
此外,即使这样做有效,它也要搜索树3次,而实际上一次就可以完成。
我的中间匹配现在已经通过了这个测试,但是我想把它做好。我知道我可以将元素放入List
中并从那里解决它,但是为了与我们的其他示例保持一致,我宁愿不这样做,尽管我目前看不到其他选择。
我已经尝试在留档中找到我正在尝试做的事情的例子,多个放心的教程和例子,但是我没有,所以总是有可能这实际上是不可能的。如果没有,我很乐意教育Don它背后的理论。
感谢任何帮助。
有一种方法可以做到这一点:
...
then().
root("find {it.type.name == '%s'}.status").
body("id", withArgs("LPM"), is(1)).
body("price", withArgs("LPM"), is(1.20f)).
body("source", withArgs("LPM"), is(172)).
body("id", withArgs("ST"), is(10));
(显然,您也可以将Args
提取到变量中,以避免重复)。
find
是 Groovy 查找与谓词匹配的第一个元素的方法({it.type.name == '%s'}
),findAll
将始终返回一个列表。
root
指示 REST 放心使用后续期望中使用的“根路径”(参见文档)。
问题内容: 屏幕上有很多单选按钮。选择单选按钮时,其属性为选中。如果未选择单选按钮,则不存在选中的属性。我想创建一个方法,如果该元素不存在,它将通过。 我正在使用Selenium WebDriver和Java。我知道我可以使用来检索属性。我只是不确定如何验证属性不存在,以及如何在不存在属性时通过测试(如果存在则失败)。 选中单选按钮时 未选中单选按钮时 我要在不存在选中属性的情况下通过测试 问题答
问题内容: 这是使用PHP生成的json 这样做显然行不通。我在其他文章中读到,需要为这种数据结构创建一个orderBy函数。我无法创建该功能。谁能告诉我解决此问题的正确方法是什么? 问题答案: 这些类型的数据操作我希望将它们保留在适当的角度对象中,因此,我将创建自定义过滤器,如下所示: 重要提示: 我建议您使用自定义过滤器,因为出于个人喜好,我不喜欢在控制器或其他对象上加载我可以在其他对象上分离
样本数据 我使用AJV 6.10.0来验证我的数据,但我认为我有一个错误的模式定义。带Ajv选项: 实际上,我有6个错误,警告每个属性的其他属性 在验证allOf(姓名和电话)中的第一个对象时,验证在(地址、邮政编码、城市和州)中发现错误 如果我删除了第一个allOf对象(姓名、电话)的附加属性,在验证地址架构的过程中,验证会在(姓名和电话)上发现错误 如何解决模式定义
问题内容: 在Python Selenium模块中,一旦有了对象,我可以使用以下命令获取其任何属性的值: 如果命名的属性不存在,则返回。 我的问题是,如何获取元素具有的所有属性的列表?似乎没有或方法。 我正在为Python使用Selenium模块的2.44.0版本。 问题答案: 这是 不可能的 使用硒webdriver的API,但你可以_执行JavaScript代码_来获取所有属性: 演示: 为了
问题内容: 我正在尝试查找具有Attribute的元素。好吧,我可以在Selenium中找到具有Id,tagName,Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一种方法,该方法将给定属性名称和值作为输入专门返回WebElement。 假设XPath不是一个选择,还有其他更好的方法吗? 问题答案: 您可以使用CSS轻松完成此任务。 公式为: 所以如果有的话 您可以使用以下方法找到它:
我正在尝试查找具有属性的元素。我可以在Selenium中找到Id、tagName、Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一个方法,专门返回WebElement,给定属性名和值作为输入。 假设XPath不是一个选项,还有其他更好的方法吗?