Jmeter WebDriver Sampler run in browser without incognito mode - jmeter

I have webdriver script for WEB UI testing but Response time getting from WebDriver Sampler is more than real browser by manually.
I ran the script in headless mode and still getting high response time.
I want to ask if there is any way to Open chrome in normal window without incognito mode, Because incognito mode already load fresh page along with css/images/styles, it does not use cached loaded images/css/styles.
Thanks in Advance

For the current version of the WebDriver Sampler 3.1 manipulating browser profile is not possible unless you want to patch the code of the relevant Config Element yourself.
You can consider switching from the WebDriver Sampler to the JSR223 Sampler and Groovy language where you will have the full freedom when it comes to the browser instantiation, for example you will be able to:
Start Firefox with the given profile
Specify user-data-dir for Chrome
However my expectation is that you should be starting "clean" session for each user, just add more iterations in the Thread Group, first opening of your application will be slow, but on subsequent requests the heavy content like images, scripts, styles, fonts, sounds, etc. will be returned from browser cache and will be fast.

Related

alternate option for window object in jmeter

When we try to encrypt and decrypt the application for front end request and response data,
Window object is not getting support in Jmeter.
As it generate 2 session id .
Kindly let us know any method in Groovy to support .
Window object is specific to the browser
As per JMeter project main page:
JMeter is not a browser, it works at protocol level. As far as web-services and remote services are concerned, JMeter looks like a browser (or rather, multiple browsers); however JMeter does not perform all the actions supported by browsers. In particular, JMeter does not execute the Javascript found in HTML pages. Nor does it render the HTML pages as a browser does (it's possible to view the response as HTML etc., but the timings are not included in any samples, and only one sample in one thread is ever displayed at a time).
So there is no equivalent in any language supported by JMeter's JSR223 Test Elements
The options are in:
Use WebDriver Sampler for getting the session IDs you're looking for, they can be passed later on to "normal" HTTP Request samplers (but this way each JMeter virtual user will kick off a real browser instance)
Extract the code responsible for request encryption and session ID generation using browser developer tools and convert it to something JMeter could execute (remove the browser context), preferably in Groovy as it's the most performing scripting option

Can JMeter do automation testing like Selenium can do?

i am still new to JMeter and i was assigned to a work that I will need to use JMeter to perform automation testing. The idea is to write script using JMeter and run the script to fill in the forms in the website. I was curious that can JMeter use different data from the database to fill in the form of the website everytime it execute?(unique data for every user)
I have followed this tutorial (https://www.blazemeter.com/blog/fill-forms-and-submit-with-jmeter-made-easy/ ) and it succeed, however, when i try to change the parameter name (to some other names that do not matches the field name found in the inpect mode), it still works. So i was wondering how JMeter knows where to put in the parameter even i have change to a wrong field name?
As per JMeter Project main page:
JMeter is not a browser, it works at protocol level. As far as web-services and remote services are concerned, JMeter looks like a browser (or rather, multiple browsers); however JMeter does not perform all the actions supported by browsers. In particular, JMeter does not execute the Javascript found in HTML pages. Nor does it render the HTML pages as a browser does (it's possible to view the response as HTML etc., but the timings are not included in any samples, and only one sample in one thread is ever displayed at a time).
Browsers don't do any magic, they execute HTTP Requests, wait for response and render it. JMeter in its turn can execute the same HTTP requests so traffic would be the same, however it will not render the response, but rather measure the time and collect some more metrics.
If you change the names of the inputs in the form most probably the request will be successful, to wit you will get HTTP Status Code below 400 hence JMeter will mark the result as "green", however if you inspect the response using View Results Tree listener you will see that the form is not filled and/or you still at the same page.
If you want to use JMeter for checking the data returned by the application you're testing consider using JMeter Assertions to test presence of expected values, absence of errors, set response time thresholds, etc.
You can automate the form submission or order placement usin JMeter. You can JMeter for API testing as well by adding assertions. But the main purpose of the JMeter is to test the performance of the application. Its not like selenium which performs actions on the browser whereas JMeter sends the request in various protocols to relevant server and can also simulate many users at the same time.
If you want to do extensive automation testing,JMeter isnt the ideal tool for that.
You can use webdriver sampler to run the selenium with jmeter. It requires to configure sampler and browser config which are plugin and can be downloaded using plugin manager.
For more info:-https://www.blazemeter.com/blog/jmeter-webdriver-sampler/
Now, without the plugin it is working on protocol level and not on the frontend as pointed out in the above comments.
So, yes it can depend on which layer you want to work. It can work on frontend like selenium using the webdriver plugin and can submit the form with different data as a direct request to the server without using the frontend/GUI.
Hope this helps.
It depends on what you are trying to automate. If you plan to automate API invocation where there are some pre-requisites like grabbing tokens, cookies, session IDs from the browser, then JMeter can probably be used where existing JMeter capabilities can be leveraged using BeanShell scripting and other plugins.
But if you plan to have a full blown UI automation framework then JMeter might not be an ideal choice.

Performance - how to capture all the Request in the Network tab of chrome in an automated way

I am in a process to capture all the request when an HTML page is loaded. My end goal is to create a report with the time taken for each individual request and also for the total time taken to load the entire page. I have tried to use the performance.getEntries() but it is limited to store only 150 request in the buffer. To overcome this I tried to set the performance.setResourceTimingBufferSize(size) but this buffer size is reset to default 150 when i refresh the page.
I would like to know the solution for below few things,
how to set the performance.setResourceTimingBufferSize(size) before loading any page (if I set it when the page is loading it misses to capture some of the request). Few suggested to set this in HTML head tag, but this is not possible in my case because i need to use selenium and i cant modify anything in source file.
I also found that we can save all the request as HAR file in chrome console. is there any way to do it in automated way?
Is there any other way to capture all the request ?
PS: I a using Jmeter (to simulate multiple users) to run the selenium scripts using web driver sampler. The automated way in the sense it should be done using selenium.
You can use BrowserMob proxy in order to create and start a proxy server which will capture data and save it in form of .har
Download BrowserMob proxy and put .jar files somewhere into JMeter Classpath
Restart JMeter to pick the .jars put
In setUp Thread Group add JSR223 Sampler and put the following code into "Script" area
import net.lightbody.bmp.BrowserMobProxy
import net.lightbody.bmp.BrowserMobProxyServer
import net.lightbody.bmp.proxy.CaptureType
def proxy = new BrowserMobProxyServer()
def captureTypes = new HashSet<>();
captureTypes.addAll(CaptureType.getAllContentCaptureTypes());
captureTypes.addAll(CaptureType.getHeaderCaptureTypes());
captureTypes.addAll(CaptureType.getCookieCaptureTypes());
proxy.setHarCaptureTypes(captureTypes);
proxy.start(8080)
proxy.newHar()
props.put('proxy', proxy)
Set up your Chrome Driver Config to use proxy from the step 3
Add tearDown Thread Group to your Test Plan and in another JSR223 Sampler use the following code to store requests made by the WebDriver Sampler(s) into a .har file:
def proxy = props.get('proxy')
proxy.getHar().writeTo(new File('some.har'))
proxy.stop()
That's it, now you should have .har file generated during test execution.
References:
BrowserMob Proxy: Embedded Mode
Apache Groovy - Why and How You Should Use It
For your goal, you can try https://gtmetrix.com/. This will give you a report for the load time and all the requests in waterfall model like in browser. Moreover, you can download the full report in pdf and can do compare and retest.
There you can also download the HAR file.
Though, it is not related to selenium but may fit your goal and It can be automated.

Wait until option JMeter

I wanted to know if JMeter has a option where you wait until some element disappears.
Example a loading bar only once that has completed or no longer visible then to carry on. (Also being able to monitor the length of time taken)
I have through about writing it as a webdriver test and then running it as a Junit test in JMeter but wanted to know if there is a simpler solution.
Any ideas welcome :)
First of all you need to realize that JMeter is not a browser
JMeter is not a browser, it works at protocol level. As far as web-services and remote services are concerned, JMeter looks like a browser (or rather, multiple browsers); however JMeter does not perform all the actions supported by browsers. In particular, JMeter does not execute the Javascript found in HTML pages. Nor does it render the HTML pages as a browser does (it's possible to view the response as HTML etc., but the timings are not included in any samples, and only one sample in one thread is ever displayed at a time).
So JMeter doesn't execute any client-side JavaScript, the only way of implementing "wait until" option is using While Controller in order to re-execute the same request again and again until response data will contain (or stop containing) the element you're looking for.
If you need to evaluate client-side JavaScript the only option would be going for Selenium. I would recommend using WebDriver Sampler instead of going for JUnit as this way you won't have to recompile your script for any change, it will be inlined into .jmx
You can use Transaction Controller to monitor the time taken by the whole process and to wait for a change , have a look at this:
http://www.sourcepole.ch/2011/1/4/waiting-for-a-page-change-in-jmeter

How to use JavaScript global function in Jmeter

How can i use global javaScript function sellerInterface.addBidOnline() in JMeter?
I can use this function in browser, but I do not know how to call it in JMeter.
Use in console
I try using this function in BSF Sampler, but it did not work
enter image description here
As per JMeter Project main page:
JMeter is not a browser, it works at protocol level. As far as web-services and remote services are concerned, JMeter looks like a browser (or rather, multiple browsers); however JMeter does not perform all the actions supported by browsers. In particular, JMeter does not execute the Javascript found in HTML pages. Nor does it render the HTML pages as a browser does (it's possible to view the response as HTML etc., but the timings are not included in any samples, and only one sample in one thread is ever displayed at a time).
If the JavaScript call generates a HTTP Request - you can record it using HTTP(S) Test Script Recorder and replay as HTTP Request sampler. For the time being it is not possible to execute JavaScript from JMeter tests.
You can take a look at WebDriver Sampler which provides JMeter integration with Selenium so each JMeter Thread (virtual user) will have its own real browser so you will be able to execute JavaScript like
WDS.browser.executeScript('your_script')
however real browsers are very resource intensive and the number of browsers you will be able to kick off will be very limited.

Resources