How can I get name of HTTP Request from field Name with BeanShell? - jmeter

I Need to get to variable field from http request which is called Name.
If anyone could give my examples how can I get other fields such as : Path, Server name or IP using beanshell?
Thank you in advance

Add Beanshell PreProcessor as a child of the request
Use following code lines to get the required values:
String name = sampler.getName(); // get parent sampler name
String path = sampler.getUrl().getPath(); // get path
String url = sampler.getUrl().getHost(); // get IP or hostname
you can also store values into JMeter Variables if required like
vars.put("name", name);
See How to Use BeanShell: JMeter's Favorite Built-in Component guide for comprehensive information on using Beanshell scripting in your JMeter test.

Below code can give you the HTTP Request Name field value
ctx.getCurrentSampler().getName()

I think you can do it without beanshell. Just use inside your sampler
${__samplerName()}
https://jmeter.apache.org/usermanual/functions.html#__samplerName

Related

JMeter how to select randomely from a extracted set of values

I have a requirement to use randome url from a url list I extract from a json response.
Say I extract them in this mannser
imageUrls_1=https://blah01.com
imageUrls_2=https://blah02.com
imageUrls_3=https://blah03.com
imageUrls_4=https://blah04.com
imageURLs_matchNr=4
In a following JSSR223 sampler I was able to generate a variable called "url" with one of the url names selected randomely
("imageUrls_1","imageUrls_2",etc)
I was thinking to use them in my HTTP request to get the correcponding url as follows. ${${url}}. But soon found out its not giving me anything other than "${${url}}" :(.
JMeter Is it possible to place a varibale inside a varible name?
Basically I need to use one of the extracted urls randomely in my HTTP request.
The easiest way is going for __V() and __Random() functions combination like:
${__V(imageUrls_${__Random(1,${imageURLs_matchNr},)},)}
Demo:
More information: Here’s What to Do to Combine Multiple JMeter Variables
Use __V function
${__V(url)}
The V (variable) function returns the result of evaluating a variable name expression.

How to modify HTTP request before sending in JMeter through Beanshell pre processor?

I have test case in my csv file. The request URL has a custom variable.
Sample URL : .../abc/$id
I need to replace this id by the id that we get in response from the previous request. I used json extractor to fetch the id from the response. Now I need to update this id in the next test case request. Fetched the Request URL from jmeter context using below code:
String path = ctx.getCurrentSampler().toString();
path.replaceAll("$id", id);
I am not able to set this updated URL in jmeter context (ctx)
You need to assign new path value to path variable
You need to set sampler path to the new value using sampler.setPath() method
So you need to amend your code like:
String path = ctx.getCurrentSampler().toString();
path = path.replaceAll("$id", id);
sampler.setPath(path);
Demo:
Also consider switching to JSR223 PreProcessor and Groovy language as Groovy performance is much higher, it better supports new Java features and provides some extra "syntax sugar" on top. See Groovy is the New Black article for details.
Try to avoid the pre / post processors if possible.
Your requirement is very simple and straight forward.
Directly use this in the path - assuming id is the name of variable which has the value.
/abc/${id}

Extracting value from jmeter post request

I want to extract value of the parameter sent through post request in jmeter.
I know the use of regular expression for extracting response value or request URL but here I would like to extract the value of post request.
I've been thorough how to extract value from request in Jmeter but it didn't worked.
Not sure why do you need it as given you sending "something" you should already have that "something" hence you don't need to extract it, however here you go:
In order to save 1st parameter value (or the whole post data if you use "Body Data" mode):
Add Beanshell PostProcessor as a child of the HTTP Request.
Put the following code into the PostProcessor's "Script" area:
String request = ctx.getCurrentSampler().getArguments().getArgument(0).getValue();
vars.put("request", request);
You will be able to access extracted value as ${request} where required.
Clarifications:
ctx - shorthand for JMeterContext class instance
getCurrentSampler() - in case of HTTP Request sampler stands for HTTPSamplerProxy
See How to Use BeanShell: JMeter's Favorite Built-in Component guide for more information on using JMeter and Java API from Beanshell test elements in your JMeter test.
I added a Beanshell PostProcessor in my http request with following code.
import org.apache.jmeter.config.Argument;
import org.apache.jmeter.config.Arguments;
Arguments argz = ctx.getCurrentSampler().getArguments();
for (int i = 0; i < argz.getArgumentCount(); i++) {
Argument arg = argz.getArgument(i);
String a = arg.getValue();
vars.put("EMAIL",a);
}
Explanation: I get a my request as a json and put it in EMAIL. Now I can use EMAIL as a variable in my other request.
Then, I added a jp#gc Json Path Extractor and I applied it to a Jmeter Varaible.
Now, Email will be used as variable, which contains my json request and I can extract using jsonPath Extractor.
An easy way to do this is using the JSON Path Extractor.
There are just
For the example you gave
{ "data" : { "name" : "john_doe", } }
'Variable Name: YourNewVar'
'JSON Path: $.data.name'
Should work, but you may need to do some experimenting.
You may want to add a "debug sampler" (its one of the standard samplers) and put in its title $YourNewVar so you can see what is being extracted.
Beanshell and "Regular Expression Extractor" will work, of course, but may be a little harder to use if you are not familiar with them.

how can i pass dynamic values to url in jmeter

I have to give dynamic values to url which takes number of users and their age , which can be selected though web page. but I want to give it in Jmeter using BeanShell PostProcessor.
Help me in this,since I'm new to Jmeter.
This is the path:
/destinations/packages?airports%5B%5D=LGW&units%5B%5D=000577%3ADESTINATION&when=29-05-2016&until=&flexibility=true&flexibleDays=3&noOfAdults=2&noOfSeniors=0&noOfChildren=1&childrenAge=3&duration=7114&first=0&searchType=search&searchRequestType=ins&sp=true&multiSelect=true
from what I've got looks like you can use CSV Data Set Config.
Create .txt file with the data you want to feed your test with;
Place the above .txt file to the folder where your .jmx file lies;
In your Test plan: Under your request sampler - place CSV Data set Config;
Then if you need to use your dynamic values within one threadgroup => refer these data as ${quanity}, ${age} in you url.
If you need to pass these values across the threadgroups => add BeanShell Assertion
Then (in the other Tread group) refer those as ${__property(_quantity)},${__property(_age)}.
Hope, it helps.
First of all you need Beanshell PreProcessor, not Beanshell PostProcessor.
All this parameters are basically name/value pairs which can be defined via HTTPSamplerBase class. HTTPSamplerBase class instance is available to Beanshell PreProcessor as sampler pre-defined variable so if you add the following code into the Beanshell PreProcessor "Script" area
sampler.addEncodedArgument("airports[]","LGW");
sampler.addEncodedArgument("units[]","000577:DESTINATION");
sampler.addEncodedArgument("when","29-05-2016");
sampler.addEncodedArgument("until","");
sampler.addEncodedArgument("flexibility", "true");
sampler.addEncodedArgument("flexibleDays","3");
sampler.addEncodedArgument("noOfAdults","2");
//etc
Your HTTP request will be populated with the values, you set via Beanshell.
JMeter Variables can be accessed via vars shorthand which stands for JMeterVariables class instance.
String airport = vars.get("airport");
sampler.addEncodedArgument("airports[]", airport);
//etc
See How to Use BeanShell: JMeter's Favorite Built-in Component article for comprehensive information on how to use Beanshell Test Elements in Jmeter.
Remember that it is recommended to avoid scripting where possible so if there is another way of implementing your task - go for it.

How to Get, Assign the Span Id value in JMeter Beanshell?

I have created a User Defined Variable with name as "Status" and a default value as "Started".
I got a HTML Response, with following content:
<SPAN id="ApplicationStatus"> Interrupted</SPAN>
I want to get the Span Id value and use in beanshell samplers to process further either in If Controller or Switch Controller.
I used Regular Expression extractor to extract the value needed and its working too.
But when i say vars.get("Status") will always return me the default value "Started".
Is there a way where i can extract the required value "Interrupted" and substitute that to the user defined variable "Status"?
Yes you can get that value of #ApplicationStatus into your User Defined Variable (UDV).
You can use regex but really you shouldn't for this type of parsing I'm not going to get into many reasons why.
Here is how you can do it using alternative (better solution IMHO) :
String html = "<SPAN id=\"ApplicationStatus\"> Interrupted</SPAN>";
Document doc = Jsoup.parse(html);
String value = doc.select("#ApplicationStatus").first().text();
//Put value in UDV Status
vars.put("Status", value);
You can add this to your sampler that does this kind of parsing i.e Beanshell sampler, here are the imports (which go above this code) :
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
Please note that this code is Jsoup dependent so you will need to download jsoup jar and put it in your $JMETER_HOME/lib directory.
Hope this sheds some light on your issue.
Update
If you want to avoid Java, I've written small jmeter post processor component that extracts text value from HTML element. Take a look at :
https://github.com/c0mrade/Html-Extractor
If you go over the steps how to install the post processor from the page above, you would use it as follows :
Right click on your sampler. Add a Post Processors -> Html Extractor , in the jquery selector field write #ApplicationStatus and store result in variable of your choice (Status). Following this add Debug Sampler, if in your Debug sampler there is variable Status with the value Html Extractor is working! you're done!
I can't reproduce your issue.
Here is my plan:
- User defined variables with variable Status
- Thread Group
- HTTP Request
- Regular expression extractor with reference name = Status
- Beanshell Sampler that logs Status variable
Beanshell sampler logs value that was received in Regular Expression Extractor

Resources