0
votes

I have to capture the values of options in the <select name="fromPort"> and <select name="toPort"> separately for correlation using loadrunner.

I have written the regular expression as

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

for capturing from first but it shows that there is no match.

<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>

When I try with notepad++, there is a checkbox to select when there are multiple lines of response to be captured. When I check it, the same regular expression is working.enter code here

3
Which protocol are you using? - Buzzy

3 Answers

0
votes

My answer is less elegant, considering you have multiple similar tags involved on the from/to side of the house. I am going to suggest backing up, capturing with a LB condition of either \"fromPort" class=\"form-inline\"\n" or \"toPort" class=\"form-inline\"\n" to an end tag of "\n"

You will wind up with two string variables, such as "Correlated_from" and "Correlated_to" which contain the option values. Next is conversion to an array structure.

There are likely a dozen ways that you can take the string apart, but I would recommend a function that breaks on the newline character, jumps the first "\t\t" Character in the substring, saving out the value between that and the next "<" character. As noted previously, there are likely a dozen ways to break up this string with a defined pattern to get to the substring which interests you.

By adhering to the standard LoadRunner pseudo array structure, this opens up the use of the standard LoadRunner functions for assignment of a variable from a pseudo array - The lr_paramarr_* function set.

0
votes

You can try this

Well what i have done is.

  • Extracted all the options from the select matching select tag using this

    (?:<select name="(fromPort|toPort)" class="form-inline">\s+)([\w\W]+?)(?=\s+<\/select>)

  • Than split each option as single element into an array.

  • Than extracted value from each option using this regex.

    (?<=\s*?<option value=")(.*?)(?=">.*?<\/option>)

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);
0
votes

I extract the select using LB="select id="xxxx"" and RB="</select"

Then use something like the following to get either all options (if I want to randomize which one is submitted the script, or I pick the already selected one, if I want to submit what the default selection is. Whenever I need to use complex regular expressions I usually hardcode a test case into a temporary test action to test the logic out before hitting the actual application.

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
}