Extracting string from jmeter response using regular expression extractor - regex

I'm trying to extract the string (201 & 202) from the html response code below.
So far I have tried the following regex
punumber=(.+)
but the problem is that there are many instances of the punumber on the page and gets me stuff that I dont need.
The string i need are inside the <h3 class="content-title">.
So can someone please help me write a regex to extract the punumber within the h3 class only?
<h3 class="content-title">
<!-- change when this is completed -->
<a href="/container/recentIssue.jsp?punumber=201">
Title 1
</a>
</h3>
<h3 class="content-title">
<!-- change when this is completed -->
<a href="/container/mostRecentIssue.jsp?punumber=202">
Title 1
</a>
</h3>

This works for me:
Reference Name : test
Regexp : punumber=([^"]+?)"
Template : $1$
Match No : -1
(this will get all values)
NV_punumber
With -1, JMeter will create:
${test_1} => 201
${test_2} => 202

Here is the regex that works for me :
punumber=(\d+)
If you're parsing html you should consider using something else other than regex to extract info like jsoup.
Anyways here is the jmeter test file attached with dummy sampler(with regex post processor) simulating your case and debug sampler that gets the result you want.
http://pastebin.com/Uti8Pv9E

You can possibly combine in this case XPath Extractor with structured query (to get all href values with punumber from ONLY instances inside <h3> tags) together with extracting then punumber value from href in ForEach Controller loop.
. . .
YOUR HTTP REQUEST
XPath Extractor
Use Tidy = true
Reference Name = punum
XPath Query = //h3[#class="content-title"]/a[text()="Title 1"]/#href
Default value = NOT_FOUND
ForEach Controller
Input variable prefix = punum
Output variable name = pnum
Add "_" before number = true
User Parameters
cnt = ${__counter(FALSE,)}
Regular Expression Extractor
Apply to = Jmeter Variable = pnum
Reference Name = punumber_${cnt}
Regular Expression = punumber=(\d+)
Template = $1$
Match No. = 1
Default value = NOT_FOUND
...
. . .
XPath Extractor will give you hrefs values of all the <a> items under <h3> tag as punum_1,punum_2,...,punum_N vars.
Foreach Controller takes one after another punum_X var, refers it as pnum, applies to it RegEx Extractor to get punumber value and stores extracted value as punumber_1, punumber_2,...,punumber_N (using counter defined in User Parameters and incremented each step).
NOTE: Since here XPath Extractor is used to parse HTML (not XML) response ensure that Use Tidy (tolerant parser) option is CHECKED (in XPath Extractor's control panel).
Same test-plan available here: http://db.tt/dnACZtGL (I've used #ant's one from his answer, thank him).

Related

Extract a value from actionlink html response body - JMeter

I have a response body from one http request and I have to extract all the values and as input to another http request
<a class="action-link"
regionName="region name"
jName="a country"
alertID="179"
onclick="showDetail(this)"> Snapshot- v4 (Active)
</a>
i tried with regex like
created a post processors -> regular expression extractors
Apply to -> Main Sample Only
Field to check -> Body
Name of created variable -> regionNameVariable
Regular Expression -> <a class="action-link" regionName=(.*?)
and passed the value as ${regionNameVariable} in the next request.
But It is not working.
Can someone suggest the correct way of doing this.
Be aware that using regular expressions for parsing HTML is not a very good idea, consider using CSS Selector Extractor instead, the relevant configuration would be:
Name of created variable: regionNameVariable
CSS Selector Expression: a[class=action-link]
Attribute: regionName
Demo:
More information:
CSS Selector Reference
How to Use the CSS/JQuery Extractor in JMeter
Add multiple Regular expression extractor to extract each values
For example to extract the 3rd group in regex of Region Name(You can write better Regx if you have better idea)
Like Wise Add Regex for jName and alertID
(jName)(=)\"(.+)\"
(alertID)(=)\"(.+)\"
Then Pass on the Reference name as user variable in your next http request.as ${regionName} and so on.
If you want to do it in the same Regex post Processor. Please refer How to extract multiple values with a regular expression in Jmeter

Jmeter Regular Expression Extraction

Could someone help me in getting the value "1237857346" from the following using regex or any other way I could get the value "1237857346" in from HTML in JMeter.
<select class="card_account" name="existing__account">
<option value="" disabled="disabled">Card Number</option>
<option value="1237857346" selected="selected">************4567</option>
</select>
Little bit of background. I am using JMeter and trying to extra the value "1237857346" to pass it in the next request.
It is not very good idea to parse HTML using Regular Expressions as it evidenced by the famous Stack Overflow answer
I would suggest switching to XPath Extractor instead. Add the XPath Extractor as a child of HTTP Request sampler which returns that select and configure it as follows:
XML Parsing Options: tick Use Tidy box. It may not be necessary but if your server response is not XML/XHTML compliant you'll get nothing
Reference Name: anything meaningful, i.e. value - it will be the name of the variable holding extracted data
XPath Expression: //select[#class='card_account']/option[#selected='selected']/#value - it will take
select having class = card_account
option with selected = "selected"
value attribute of the above option
and store it to "value" variable. You will be able to refer to it as ${value} where required.
See following material for further reference:
XPath Tutorial
XPath Language Specification
Using the XPath Extractor in JMeter
You can use the following regex:
<option[^<]*>Card Number</option>\s*<option[^<]*?value="(\d+)"
The value will be in group 1 ($1$), which is exactly what you need.
See demo
In case the are always 12 asterisks (that can be matched with \*{12}) in the <option> node value, you'd can use:
<option[^<]*value="(\d+)"[^<]*>\*{12}\d+</option>
See another demo.

How to extract data from HREF attribute in jmeter

I recorded steps in jmeter and it requires 3 parameters to be passed to a url in GET method. In currently loaded page these values are in href attribute and I need to extract those values from that href attibute and then populate parameters Reference, QReference, PartId, type.
<a data-bind="attr: { href: DisplayUrl() }" target="_blank" href="/Display/GetDisplayView?Reference=URamI5yhouguHKqx86RFXA**&QReference=THhfW04ZpJxC1D0AVX14pw**&PartId=jze7XeL_fIM5L5lcGQCv53jUFe8yRvKV_aUQCJ4dJRzAI0s3grkfM9qxgyTgSts3&type=ebayDi49bY2kXrAQdf64wg**&_=sK8FCsmYiq6YKLOnGu_s34CFScum6KwX5m_7v_7glbc*">
<img data-bind="attr: { src: OpenInNewWindowIcon() }" style="border:0;float:left;padding-left:8px;" src="../../Content/Themes/Images/Summary/icon-new-small-window.gif">
</a>
How can I extract http value with Regular Expression Extractor?
You should add Regular Expression Extractor after GET Sampler.
Patterns will look like:
QReference=(.+?);
PartId=(.+?);
type=(.+?);

How to properly use xpath & regexp extractor in jmeter?

I have the following text in the HTML response:
<input type="hidden" name="test" value="testValue">
I need to extract the value from the above input tag.
I've tried both regexp and xpath extractor, but neither is working for me:
regexp pattern
input\s*type="hidden"\s*name="test"\s*value="(.+)"\s*>
xpath query
//input[#name="test"]/#value
The above xpath gives an error at the Xpath Assertion Listener .. "No node matched".
I tried a lot and concluded that the xpath works only if I use it as //input[#name].
At the moment I'm trying to add an actual name it gives the error .. "No node matched".
Could anyone please suggest me how to resolve the above issue?
Please take a look at my previous answer :
https://stackoverflow.com/a/11452267/169277
The relevant part for you would be step 3:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Element;
String html = prev.getResponseDataAsString(); // get response from your sampler
Document doc = Jsoup.parse(html);
Element inputElement = doc.select("input[name=test]").first();
String inputValue = inputElement.attr("value");
vars.put("inputTextValue", inputValue);
Update
So you don't get tangled with the code I've created jMeter post processor called Html Extractor here is the github url :
https://github.com/c0mrade/Html-Extractor
Since you are using XPath Extractor to parse HTML (not XML) response ensure that Use Tidy (tolerant parser) option is CHECKED (in XPath Extractor's control panel).
Your xpath query looks fine, check the option mentioned above and try again.

The regular expression for finding the image url in <img> tag in HTML using VB .Net code

I want to extract the image url from any website. I am reading the source info through webRequest. I want a regular expression which will fetch the Image url from this content i.e the Src value in the <img> tag.
I'd recommend using an HTML parser to read the html and pull the image tags out of it, as regexes don't mesh well with data structures like xml and html.
In C#: (from this SO question)
var web = new HtmlWeb();
var doc = web.Load("http://www.stackoverflow.com");
var nodes = doc.DocumentNode.SelectNodes("//img[#src]");
foreach (var node in nodes)
{
Console.WriteLine(node.src);
}
/(?:\"|')[^\\x22*<>|\\\\]+?\.(?:jpg|bmp|gif|png)(?:\"|')/i
is a decent one I have used before. This gets any reference to an image file within an html document. I didn't strip " or ' around the match, so you will need to do that.
Try this*:
<img .*?src=["']?([^'">]+)["']?.*?>
Tested here with:
<img class="test" src="/content/img/so/logo.png" alt="logo homepage">
Gives
$1 = /content/img/so/logo.png
The $1 (you have to mouseover the match to see it) corresponds to the part of the regex between (). How you access that value will depend on what implementation of regex you are using.
*If you want to know how this works, leave a comment
EDIT
As nearly always with regexp, there are edge cases:
<img title="src=hack" src="/content/img/so/logo.png" alt="logo homepage">
This would be matched as 'hack'.