如何在LoadRunner中筛选含完整三值且Tag Id以71开头的产品
LoadRunner实现批次产品筛选移除方案
一、关联获取产品属性列表
首先通过web_reg_save_param系列函数,从产品列表响应中分别抓取三个属性的数组:
- 抓取所有Specification Id,设置
ORD=ALL保存为Spec_ID数组(共4个元素) - 抓取所有Serial No,设置
ORD=ALL保存为Serial_No数组(共4个元素) - 抓取所有非NA的Tag Id,设置
ORD=ALL保存为Tag_ID数组(共2个元素)
示例关联代码:
// 关联Specification Id web_reg_save_param("Spec_ID", "LB=<span class='spec'>", "RB=</span>", "ORD=ALL", LAST); // 关联Serial No web_reg_save_param("Serial_No", "LB=<span class='serial'>", "RB=</span>", "ORD=ALL", LAST); // 关联Tag Id(排除NA的情况) web_reg_save_param("Tag_ID", "LB=<span class='tag'>71", "RB=</span>", "ORD=ALL", LAST);
二、匹配属性对应关系并筛选
由于产品在UI和响应中的顺序一致,通过循环遍历产品数组,匹配每个产品的三个属性,并筛选出符合条件的产品:
- 循环遍历4个产品的Spec和Serial
- 对应匹配Tag数组的元素(前2个产品有Tag,后2个无)
- 筛选规则:同时存在三个属性,且Tag Id以
71开头
示例逻辑代码:
int i; int tag_count = atoi(lr_eval_string("{Tag_ID_count}")); for(i=1; i<=4; i++){ char *spec = lr_paramarr_idx("Spec_ID", i); char *serial = lr_paramarr_idx("Serial_No", i); char *tag = NULL; // 匹配当前产品的Tag Id(仅前2个产品有值) if(i <= tag_count){ tag = lr_paramarr_idx("Tag_ID", i); // 补全Tag的完整值(因为关联LB用了71,这里要加上前缀) char full_tag[20]; sprintf(full_tag, "71%s", tag); tag = full_tag; } // 执行筛选并移除 if(tag != NULL){ lr_output_message("找到目标产品:Spec=%s, Serial=%s, Tag=%s", spec, serial, tag); // 调用移除接口 web_submit_data("Remove_Target_Product", "Action=http://your-domain/product/remove", "Method=POST", ITEMDATA, "Name=batch_id", "Value=A102", ENDITEM, "Name=spec_id", "Value=%s", spec, ENDITEM, "Name=serial_no", "Value=%s", serial, ENDITEM, "Name=tag_id", "Value=%s", tag, ENDITEM, LAST); } }
三、优化方案:按产品组关联
如果响应中每个产品的三个属性在同一个HTML块内,可以直接按组关联,避免顺序匹配误差:
// 关联所有产品块 web_reg_save_param_ex( "ParamName=Product_Block", "LB=<div class='product-item'>", "RB=</div>", "ORD=ALL", LAST); // 遍历每个产品块提取属性 int block_count = atoi(lr_eval_string("{Product_Block_count}")); for(i=1; i<=block_count; i++){ char *block = lr_paramarr_idx("Product_Block", i); char spec[50], serial[50], tag[50]; // 从块中截取Spec strncpy(spec, strstr(block, "<span class='spec'>")+18, strstr(block, "</span>") - strstr(block, "<span class='spec'>")-18); spec[strstr(block, "</span>") - strstr(block, "<span class='spec'>")-18] = '\0'; // 截取Serial strncpy(serial, strstr(block, "<span class='serial'>")+19, strstr(block, "</span>") - strstr(block, "<span class='serial'>")-19); serial[strstr(block, "</span>") - strstr(block, "<span class='serial'>")-19] = '\0'; // 截取Tag并判断 char *tag_start = strstr(block, "<span class='tag'>"); strncpy(tag, tag_start+17, strstr(block, "</span>") - tag_start -17); tag[strstr(block, "</span>") - tag_start -17] = '\0'; if(strcmp(tag, "NA") != 0 && strstr(tag, "71") == tag){ // 执行移除操作 web_submit_data("Remove_Target_Product", "Action=http://your-domain/product/remove", "Method=POST", ITEMDATA, "Name=batch_id", "Value=A102", ENDITEM, "Name=spec_id", "Value=%s", spec, ENDITEM, "Name=serial_no", "Value=%s", serial, ENDITEM, "Name=tag_id", "Value=%s", tag, ENDITEM, LAST); } }
注意事项
- 关联的左右边界需根据实际响应内容调整,确保属性抓取准确
- 移除接口的参数需与前端实际提交的参数一致,包含批次ID等必要信息
- 循环中注意LoadRunner参数数组为1-based下标,避免越界
内容的提问来源于stack exchange,提问作者Mikey8997
相关产品推荐
相关产品推荐

