在 .check 中正确使用 IF 以动态提取值
Proper using of IF in .check for dynamically extracting values
我正在尝试制作具有随机值的 .formParam 独立场景。到目前为止,我在尝试从请求中动态提取属性时遇到了麻烦。
所以首先我需要检查产品是否有任何属性(需要填写)。通过
提取它们
regex("""\b(product_attribute_\d)(?![\s\S]*?\b)""").findAll.optional.saveAs("prod_attributes")
prod_attributes -> List(product_attribute_1, product_attribute_2, product_attribute_3, product_attribute_4, product_attribute_5)
然后,如果属性不为空 (checkIf(!"prod_attributes".isEmpty)),我会尝试提取 Seq("prod_attributes") 中每个属性的值:
(for (i <- 0 to "${prod_attributes}".size - 1) {
css("dd[id='product_attribute_input_" + i + 1 + "'][value]").findAll.saveAs("attribute_input_" + i + 1))
}
现在我想创建新的 Map 并将其作为 key = product_attribute_n 和 value 相关属性的值列表。例如:
val atrib_map= Map(
product_attribute_1-> List(1, 2),
product_attribute_2-> List(3, 4, 5),
...... etc
)
或者只是为每个属性提取随机值。
然后将此列表用于 .formParamSeq。
请分享您对我的方法的想法,并帮助我找出是否有可能通过。 (或者我只是挖错了方向,应该通过简单的"hardcoded"交易来执行)
这部分不起作用,但我想使用类似这样的东西。
val goToProduct = http("""Go_to_product""")
.get("/product")
.headers(headers_0)
.check(
regex("""\b(product_attribute_\d)(?![\s\S]*\b)""").findAll.optional.saveAs("prod_attributes"),
checkIf(!"prod_attributes".isEmpty){
for (i <- 0 to "${prod_attributes}".size - 1) {
css("dd[id='product_attribute_input_" + i + 1 + "'] [value]").findAll.saveAs("attribute_input_" + i + 1)
}
})
我有这部分body(这是要填写的属性最多的项目)。
没有硬编码值的主要想法,可以从任何产品(具有 2、3、4,任何属性)中解析。
<!--attributes-->
<div class="attributes">
<dl>
<dt id="product_attribute_label_1">
<label class="text-prompt">
Processor
</label>
<span class="required">*</span>
</dt>
<dd id="product_attribute_input_1">
<select name="product_attribute_1" id="product_attribute_1">
<option value="1">2.2 GHz Intel Pentium Dual-Core E2200</option>
<option selected="selected" value="2">2.5 GHz Intel Pentium Dual-Core E2200 [+.00]</option>
</select>
</dd>
<dt id="product_attribute_label_2">
<label class="text-prompt">
RAM
</label>
<span class="required">*</span>
</dt>
<dd id="product_attribute_input_2">
<select name="product_attribute_2" id="product_attribute_2">
<option value="3">2 GB</option>
<option value="4">4GB [+.00]</option>
<option value="5">8GB [+.00]</option>
</select>
</dd>
<dt id="product_attribute_label_3">
<label class="text-prompt">
HDD
</label>
<span class="required">*</span>
</dt>
<dd id="product_attribute_input_3">
<ul class="option-list">
<li>
<input id="product_attribute_3_6" type="radio" name="product_attribute_3" value="6">
<label for="product_attribute_3_6">320 GB</label>
</li>
<li>
<input id="product_attribute_3_7" type="radio" name="product_attribute_3" value="7">
<label for="product_attribute_3_7">400 GB [+0.00]</label>
</li>
</ul>
</dd>
<dt id="product_attribute_label_4">
<label class="text-prompt">
OS
</label>
<span class="required">*</span>
</dt>
<dd id="product_attribute_input_4">
<ul class="option-list">
<li>
<input id="product_attribute_4_8" type="radio" name="product_attribute_4" value="8" checked="checked">
<label for="product_attribute_4_8">Vista Home [+.00]</label>
</li>
<li>
<input id="product_attribute_4_9" type="radio" name="product_attribute_4" value="9">
<label for="product_attribute_4_9">Vista Premium [+.00]</label>
</li>
</ul>
</dd>
<dt id="product_attribute_label_5">
<label class="text-prompt">
Software
</label>
</dt>
<dd id="product_attribute_input_5">
<ul class="option-list">
<li>
<input id="product_attribute_5_10" type="checkbox" name="product_attribute_5" value="10" checked="checked">
<label for="product_attribute_5_10">Microsoft Office [+.00]</label>
</li>
<li>
<input id="product_attribute_5_11" type="checkbox" name="product_attribute_5" value="11">
<label for="product_attribute_5_11">Acrobat Reader [+.00]</label>
</li>
<li>
<input id="product_attribute_5_12" type="checkbox" name="product_attribute_5" value="12">
<label for="product_attribute_5_12">Total Commander [+.00]</label>
</li>
</ul>
</dd>
</dl>
</div>
好像不能动态添加检查。
我的解决方案获取节点并 transform
s 它们。注意 ^=
选择以 "product_attribute_input_".
开头的所有节点
.check(
css("""dd[id^="product_attribute_input_"]""").ofType[jodd.lagarto.dom.Node].findAll
.transform{ nodes =>
nodes.map { node =>
val name = node.getAttribute("id")
val valuesInSelect = Option(node.getFirstChildElement("select")).map {
_.getChildElements().flatMap { child =>
Option(child.getAttribute("value"))
}
.toList
}
val valuesInList = Option(node.getFirstChildElement("ul")).map {
_.getChildElements()
.filter { _.getNodeName() == "li" }
.flatMap { child =>
Option(child.getFirstChildElement("input")).flatMap { i =>
Option(i.getAttribute("value"))
}
}
.toList
}
name -> valuesInSelect.orElse(valuesInList).getOrElse(List())
}.toMap
}
.saveAs("atrib_map")
)
打印session的时候可以看到属性为atrib_map -> Map(product_attribute_input_3 -> List(6, 7), product_attribute_input_5 -> List(10, 11, 12), product_attribute_input_2 -> List(3, 4, 5), product_attribute_input_4 -> List(8, 9), product_attribute_input_1 -> List(1, 2))
这种从 XML 节点提取数据的方式并不是很高效或优雅,但感觉是声明式的。
我正在尝试制作具有随机值的 .formParam 独立场景。到目前为止,我在尝试从请求中动态提取属性时遇到了麻烦。
所以首先我需要检查产品是否有任何属性(需要填写)。通过
提取它们regex("""\b(product_attribute_\d)(?![\s\S]*?\b)""").findAll.optional.saveAs("prod_attributes")
prod_attributes -> List(product_attribute_1, product_attribute_2, product_attribute_3, product_attribute_4, product_attribute_5)
然后,如果属性不为空 (checkIf(!"prod_attributes".isEmpty)),我会尝试提取 Seq("prod_attributes") 中每个属性的值:
(for (i <- 0 to "${prod_attributes}".size - 1) {
css("dd[id='product_attribute_input_" + i + 1 + "'][value]").findAll.saveAs("attribute_input_" + i + 1))
}
现在我想创建新的 Map 并将其作为 key = product_attribute_n 和 value 相关属性的值列表。例如:
val atrib_map= Map(
product_attribute_1-> List(1, 2),
product_attribute_2-> List(3, 4, 5),
...... etc
)
或者只是为每个属性提取随机值。 然后将此列表用于 .formParamSeq。
请分享您对我的方法的想法,并帮助我找出是否有可能通过。 (或者我只是挖错了方向,应该通过简单的"hardcoded"交易来执行)
这部分不起作用,但我想使用类似这样的东西。
val goToProduct = http("""Go_to_product""")
.get("/product")
.headers(headers_0)
.check(
regex("""\b(product_attribute_\d)(?![\s\S]*\b)""").findAll.optional.saveAs("prod_attributes"),
checkIf(!"prod_attributes".isEmpty){
for (i <- 0 to "${prod_attributes}".size - 1) {
css("dd[id='product_attribute_input_" + i + 1 + "'] [value]").findAll.saveAs("attribute_input_" + i + 1)
}
})
我有这部分body(这是要填写的属性最多的项目)。
没有硬编码值的主要想法,可以从任何产品(具有 2、3、4,任何属性)中解析。
<!--attributes-->
<div class="attributes">
<dl>
<dt id="product_attribute_label_1">
<label class="text-prompt">
Processor
</label>
<span class="required">*</span>
</dt>
<dd id="product_attribute_input_1">
<select name="product_attribute_1" id="product_attribute_1">
<option value="1">2.2 GHz Intel Pentium Dual-Core E2200</option>
<option selected="selected" value="2">2.5 GHz Intel Pentium Dual-Core E2200 [+.00]</option>
</select>
</dd>
<dt id="product_attribute_label_2">
<label class="text-prompt">
RAM
</label>
<span class="required">*</span>
</dt>
<dd id="product_attribute_input_2">
<select name="product_attribute_2" id="product_attribute_2">
<option value="3">2 GB</option>
<option value="4">4GB [+.00]</option>
<option value="5">8GB [+.00]</option>
</select>
</dd>
<dt id="product_attribute_label_3">
<label class="text-prompt">
HDD
</label>
<span class="required">*</span>
</dt>
<dd id="product_attribute_input_3">
<ul class="option-list">
<li>
<input id="product_attribute_3_6" type="radio" name="product_attribute_3" value="6">
<label for="product_attribute_3_6">320 GB</label>
</li>
<li>
<input id="product_attribute_3_7" type="radio" name="product_attribute_3" value="7">
<label for="product_attribute_3_7">400 GB [+0.00]</label>
</li>
</ul>
</dd>
<dt id="product_attribute_label_4">
<label class="text-prompt">
OS
</label>
<span class="required">*</span>
</dt>
<dd id="product_attribute_input_4">
<ul class="option-list">
<li>
<input id="product_attribute_4_8" type="radio" name="product_attribute_4" value="8" checked="checked">
<label for="product_attribute_4_8">Vista Home [+.00]</label>
</li>
<li>
<input id="product_attribute_4_9" type="radio" name="product_attribute_4" value="9">
<label for="product_attribute_4_9">Vista Premium [+.00]</label>
</li>
</ul>
</dd>
<dt id="product_attribute_label_5">
<label class="text-prompt">
Software
</label>
</dt>
<dd id="product_attribute_input_5">
<ul class="option-list">
<li>
<input id="product_attribute_5_10" type="checkbox" name="product_attribute_5" value="10" checked="checked">
<label for="product_attribute_5_10">Microsoft Office [+.00]</label>
</li>
<li>
<input id="product_attribute_5_11" type="checkbox" name="product_attribute_5" value="11">
<label for="product_attribute_5_11">Acrobat Reader [+.00]</label>
</li>
<li>
<input id="product_attribute_5_12" type="checkbox" name="product_attribute_5" value="12">
<label for="product_attribute_5_12">Total Commander [+.00]</label>
</li>
</ul>
</dd>
</dl>
</div>
好像不能动态添加检查。
我的解决方案获取节点并 transform
s 它们。注意 ^=
选择以 "product_attribute_input_".
.check(
css("""dd[id^="product_attribute_input_"]""").ofType[jodd.lagarto.dom.Node].findAll
.transform{ nodes =>
nodes.map { node =>
val name = node.getAttribute("id")
val valuesInSelect = Option(node.getFirstChildElement("select")).map {
_.getChildElements().flatMap { child =>
Option(child.getAttribute("value"))
}
.toList
}
val valuesInList = Option(node.getFirstChildElement("ul")).map {
_.getChildElements()
.filter { _.getNodeName() == "li" }
.flatMap { child =>
Option(child.getFirstChildElement("input")).flatMap { i =>
Option(i.getAttribute("value"))
}
}
.toList
}
name -> valuesInSelect.orElse(valuesInList).getOrElse(List())
}.toMap
}
.saveAs("atrib_map")
)
打印session的时候可以看到属性为atrib_map -> Map(product_attribute_input_3 -> List(6, 7), product_attribute_input_5 -> List(10, 11, 12), product_attribute_input_2 -> List(3, 4, 5), product_attribute_input_4 -> List(8, 9), product_attribute_input_1 -> List(1, 2))
这种从 XML 节点提取数据的方式并不是很高效或优雅,但感觉是声明式的。