【问题标题】:Capturing response values from multiple dropdowns in Loadrunner从 Loadrunner 中的多个下拉列表中捕获响应值
【发布时间】:2018-12-10 06:50:51
【问题描述】:

我必须分别捕获 <select name="fromPort"><select name="toPort"> 中的选项值,以便使用 loadrunner 进行关联。

我把正则表达式写成

<select name="fromPort" class="form-inline">(.+?)</select>

从第一个开始捕获,但它显示没有匹配。

<form action="reserve.php" method="post">
        <select name="fromPort" class="form-inline">
            <option value="Paris">Paris</option>
            <option value="Philadelphia">Philadelphia</option>
            <option value="Boston">Boston</option>
            <option value="Portland">Portland</option>
            <option value="San Diego">San Diego</option>
            <option value="Mexico City">Mexico City</option>
            <option value="São Paolo">São Paolo</option>
        </select>
        <p>
        <h2>Choose your destination city:</h2>
        <select name="toPort" class="form-inline">
            <option value="Buenos Aires">Buenos Aires</option>
            <option value="Rome">Rome</option>
            <option value="London">London</option>
            <option value="Berlin">Berlin</option>
            <option value="New York">New York</option>
            <option value="Dublin">Dublin</option>
            <option value="Cairo">Cairo</option>
        </select>
        <p></p>
        <div class="container">
            <input type="submit" class="btn btn-primary" value="Find Flights"/>
        </div>
    </form>

当我尝试使用 notepad++ 时,当需要捕获多行响应时,有一个复选框可供选择。当我检查它时,相同的正则表达式正在工作。enter code here

【问题讨论】:

  • 您使用的是哪种协议?

标签: regex performance-testing loadrunner


【解决方案1】:

考虑到您在房子的从/到侧涉及多个类似的标签,我的回答不太优雅。我将建议备份,使用 \"fromPort" class=\"form-inline\"\n" 或 \"toPort" class=\"form-inline\"\n" 的 LB 条件捕获到“\n”的结束标记

您将得到两个字符串变量,例如“Correlated_from”和“Correlated_to”,其中包含选项值。接下来是转换为数组结构。

可能有十几种方法可以将字符串分开,但我会推荐一个函数,它会在换行符处中断,跳转子字符串中的第一个“\t\t”字符,并保存它之间的值和下一个“

通过遵循标准的 LoadRunner 伪数组结构,可以使用标准的 LoadRunner 函数从伪数组中分配变量 - lr_paramarr_* 函数集。

【讨论】:

    【解决方案2】:

    你可以试试这个

    好吧,我所做的是。

    • 使用这个从选择匹配的选择标签中提取所有选项

      (?:&lt;select name="(fromPort|toPort)" class="form-inline"&gt;\s+)([\w\W]+?)(?=\s+&lt;\/select&gt;)

    • 比将每个选项作为单个元素拆分为一个数组。

    • 比使用此正则表达式从每个选项中提取的值。

      (?&lt;=\s*?&lt;option value=")(.*?)(?="&gt;.*?&lt;\/option&gt;)

    let str =`<form action="reserve.php" method="post">
            <select name="fromPort" class="form-inline">
                <option value="Paris">Paris</option>
                <option value="Philadelphia">Philadelphia</option>
                <option value="Boston">Boston</option>
                <option value="Portland">Portland</option>
                <option value="San Diego">San Diego</option>
                <option value="Mexico City">Mexico City</option>
                <option value="São Paolo">São Paolo</option>
            </select>
            <p>
            <h2>Choose your destination city:</h2>
            <select name="toPort" class="form-inline">
                <option value="Buenos Aires">Buenos Aires</option>
                <option value="Rome">Rome</option>
                <option value="London">London</option>
                <option value="Berlin">Berlin</option>
                <option value="New York">New York</option>
                <option value="Dublin">Dublin</option>
                <option value="Cairo">Cairo</option>
            </select>
            <p></p>
            <div class="container">
                <input type="submit" class="btn btn-primary" value="Find Flights"/>
            </div>
        </form>`
        
    let selectAllOption = str.match(/(?<=<select name="(fromPort|toPort)" class="form-inline">\s+)[\w\W]+?(?=\s+<\/select>)/g);
    
    let splitedOptions = selectAllOption.map(e=>e.split('\n'))
    let finalValues = splitedOptions.map(e=>{
      return e.map(ele=>{
        return ele.match(/(?<=\s*?<option value=")(.*?)(?=">.*?<\/option>)/g)
      })
    })
    console.log(finalValues);

    【讨论】:

    • 此解决方案是否已在 LoadRunner 中测试过?
    【解决方案3】:

    我使用 LB="select id="xxxx"" 和 RB=""

    提取选择

    然后使用类似以下的内容来获取所有选项(如果我想随机提交哪个脚本,或者我选择已经选择的一个,如果我想提交默认选择是什么。每当我需要使用复杂的正则表达式 我通常将测试用例硬编码到一个临时的测试动作中,以便在实际应用之前测试出逻辑。

    TestExtract()
    {
        int matchCt, ord;
        
        char *arrayMemberValue; 
        
        char * bufferToSearch =
            "<option value=\"8183011816-1:USD\"";
        
        char * bufferToSearch2 =
            "  <option value=\"8171245851-1:USD\">xxxxxx5851 -  DDA 008171245851</option>"
            "  <option value=\"863006969-1:USD\">xxxxxx6969 - DDA 000863006969</option>"
            "   <option value=\"863006977-1:USD\">xxxxxx6977 - DDA 000863006977</option> ";
        
        
        char * bufferToSearch3 =
            "  <option value=\"125\">AIRLINE PILOT</option>  "
            "  <option value=\"008\" selected=\"selected\">SELF EMPLOYED</option>"
            "  <option value=\"232\">RECEPTIONIST</option>";
        
        
        char * bufferToSearch4 =
            "<select id=\"occupation\" name=\"occupation\" onchange='occupationChange();' class='form-control required' data-validate='dropdown'> "
            "    <option value=\"125\">AIRLINE PILOT</option>  "
            "    <option value=\"008\" selected=\"selected\">SELF EMPLOYED</option>"
            "    <option value=\"232\">RECEPTIONIST</option>"
            "</select>"
            "<select name=\"_address_state_pr\" id=\"_address_ state_p\" class=\"form-control\">"
            "   <option value=\"Adjuntas\" selected>Adjuntas</option>"
            "   <option value=\"Aguada\"> Aguada</option>"
            "   <option value=\"Aguadilla\">\tAguadilla\t</option>"
            "   <option value=\"Aguas Buenas\">\tAguas Buenas\t</option>"
            "</select>";
        
         lr_output_message ("Test Regexp Extract");
         
         lr_save_param_regexp (
            bufferToSearch,
                   strlen(bufferToSearch),
                   "RegExp=option value=\"(.*?)\"",               
                   "ResultParam=fromAccount",
                   LAST );
        
        lr_output_message ("Value of fromAccount in buffer1 = %s", lr_eval_string("{fromAccount}"));
         
         lr_save_param_regexp (
            bufferToSearch2,
            strlen(bufferToSearch2),
            "RegExp=option value=\"(.*?)\"",
            "Ordinal=All",
            "ResultParam=reMatchesParam",
            LAST );
    
        matchCt = lr_paramarr_len("reMatchesParam");
        
        lr_message("%d match(es) found in buffer2.", matchCt);
    
        for (ord=1; ord <= matchCt; ord++) 
        {
            arrayMemberValue = lr_paramarr_idx("reMatchesParam", ord);
            lr_message("Member %d value: %s", ord, arrayMemberValue);
        }
        
        
        // find selected option - use a non capturing group to skip the greedy RegExp for prior Option values
       
        
        // https://regex101.com/
        // PCRE (?:value=".*").*value=(.*?) selected
        
         lr_save_param_regexp (
            bufferToSearch3,
            strlen(bufferToSearch3),
            "RegExp=(?:value=\".*\").*value=\"(.*?)\" selected",
            "Ordinal=1",
            "ResultParam=reSelectedOption",
            LAST );
    
        lr_output_message ("Value of selected option in buffer3 = %s", lr_eval_string("{reSelectedOption}"));
        
        // normally will use web_reg_save_param_ex with LB and RB to extract the specific select statement 
        
        lr_save_param_regexp (
            bufferToSearch4,
            strlen(bufferToSearch4),
            "RegExp=select id=\"occupation\"(.*?)</select>",
            "Ordinal=1",
            "ResultParam=reOptionGroupOccupation",
            LAST );
        
         lr_output_message ("Value of option group occupation in buffer4 is = %s", lr_eval_string("{reOptionGroupOccupation}"));
         
          lr_save_param_regexp (
            lr_eval_string("{reOptionGroupOccupation}"),
            strlen( lr_eval_string("{reOptionGroupOccupation}")),
            "RegExp=(?:value=\".*\").*value=\"(.*?)\" selected",
            "Ordinal=1",
            "ResultParam=reSelectedOption",
            LAST );
    
        lr_output_message ("Value of selected occupation option in buffer4 = %s", lr_eval_string("{reSelectedOption}"));
        
        return -1;  // iterate no further
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-28
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2021-05-23
      • 1970-01-01
      相关资源
      最近更新 更多