JMeter does not execute the Javascript found in HTML pages? Confused - jmeter

JMeter User Manual says: JMeter is not a browser. JMeter does not execute the Javascript found in HTML pages.
I wanted to know exact meaning of this statement.
Most perhaps every webpage have javascripts included.
I am taking an example of testing single page (say home page), and as usual this page have number of js, css, images.
During recording, I recorded all embedded resources.
As far my knowledge, before running a test in jmeter, we have following three options
1. Take only top level request (homepage.html) without selecting embedded resources check-box
2. Take top level request (homepage.html) along with selecting embedded resources check-box
3. Keep top level request along with all other components recorded
Which among 3 is the best option to check page load time (I am assuming 1st option, as it tries to replicate close to browser)
and otherwise, if JMeter do not execute javascript, how am I getting response of js file?

JMeter won't execute JavaScript and won't render the page, but it will download the .js file and record and replay any AJAX call which is driven by JavaScript.
So I would suggest going for option 2, but:
tick "Use concurrent pool" and provide number of threads in interval of 3-8
filter "external" resources via "URLs must match" input
add HTTP Cache Manager to ensure that embedded resources are downloaded only once per thread (this is what well-behaved browsers do)
See How to make JMeter behave more like a real browser article for other tips on how to make your load test more realistic

you can get a response of js file with browser automation tools like selenium or testIT Webtester (a fork of selenium)

Related

Retrieve all Embedded resources is not working in JMeter

I am using "Retrieve all Embedded resources" advanced option to retrieve all static content.
It work fine but does not retrieve below .js. Is there any Filter or option in JMeter to get below files ?
I don't see any "below .js", just in case be aware of the following limitation:
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 if an "embedded resource" is being triggered by the client-side JavaScript - JMeter won't be able to process the JavaScript hence won't download the associated piece of content. If this is your case - you will need to download it using a separate HTTP Request sampler and put both "main" HTTP Request and the second one under the Transaction Controller to get the cumulative time. If there are multiple occurrences of such assets - put them under a Parallel Controller

Test autocomplete in jmeter

I have a search form which would open a list when 2 characters are typed. I would like to measure that time it takes to open and load the list in jmeter. How can I do it?
If you look into your "Network" tab of your favourite browser developer tools you will see that each time you type a letter or digit in the search field the browser sends a HTTP request to the backend server and it responds with search suggestions:
So all you need to do is to simulate these requests using JMeter and measure the response time.
You can even record these requests using HTTP(S) Test Script Recorder, Badboy, JMeter Chrome Extension, whatever
There are two things, I would like to quote:
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).
From JMeter Wiki
JMeter does not process Javascript or applets embedded in HTML pages.
JMeter can download the relevant resources (some embedded resources
are downloaded automatically if the correct options are set), but it
does not process the HTML and execute any Javascript functions.
If the page uses Javascript to build up a URL or submit a form, you
can use the Proxy Recording facility to create the necessary sampler.
If this is not possible, then manual inspection of the code may be
needed to determine what the Javascript is doing.
Solution #1
Whenever you type each character, check any service call to the server. This can be captured using browser developer tools > Network tab.
E.g.
If you type iPhone, there will be six service calls to the server. By measuring each call individually, you will be able to understand, how your application behaves under the load.
Again this is a service call, not the UI rendering.
https://example.com?q=i
https://example.com?q=iP
https://example.com?q=iPh
https://example.com?q=iPho
https://example.com?q=iPhon
https://example.com?q=iPhone
Solution #2
By leveraging Selenium WebDriver in your JMeter Test plan, you can measure the end-to-end response time.
Please refer this Blazemeter article and this blog for more details.
Visit JMeter Plugins website and search for Selenium to read more details about Selenium WebDriver.

In j meter test script why we exclude java script,cascade style sheet and include only html to check response time in performance test?

While checking performance of public website why we exclude java scripts, style sheets and include only basic request which returns HTML file(host "www.test.com" and "/" in path.
You need to exclude these scripts, styles and images only during recording of your test scenario with the HTTP(S) Test Script Recorder as if you record these calls they will be captured, but when you replay them it will have nothing in common with that happens in the reality.
Real browsers act as follows:
They download these scripts, images and styles when requesting the main page, but do it in parallel using several concurrent threads to speed up the process. So the main request forks into several sub-requests which are downloading all this stuff. In JMeter you can mimic this behaviour using "Retrieve All Embedded Resources" switch either in HTTP Request or in HTTP Request Defaults
As you already know, browsers download scripts, images and styles and do it using several concurrent threads. The next point is that well-behaved browsers do it only once, on subsequent requests this stuff is being returned from the browser's cache. So you need to add a HTTP Cache Manager to your Test Plan to simulate this functionality representing browser cache and not overload the server
Regarding 3-rd party content. If your web site uses scripts, images, videos, etc. from other domains - it is recommended to exclude these requests from your load testing scope as most likely you don't have any control of these 3-rd party content providers and won't be able to do anything even if the bottleneck is due to external server, your load test should focus solely on your application.
See How To Make JMeter Behave More Like A Real Browser guide for more information on above hints and few more recommendations.
Because JMeter is only retrieving page elements, and does not execute javascript or render these components like real browsers do. Personally i like to retrieve all embedded resources to give myself a better understanding of the total load time, even if javascript is not executed/rendered.
You can also do a selective retrieval, or a full retrieval if you wish.
Use the checkbox named "retrieve embedded resources", or specify which elements should be retrieved. Getting full retrieval is also handy to see whether there are broken links to components in the page.

Load time of a page in Jmeter

I understand that the primary use of Jmeter is not finding the load time of a page. However, I'd like to know if there's any tool for the below scenario to calculate the approximate load time of a page (barring the rendering time):
Calculate the response time of various web requests for a particular page P1 using JMeter
Record and save the web request pattern of the page P1 in the desired browser
A tool replaces every web request in the pattern with the response time recorded in Step 1 and based on the timeline slice in Step 2, gives us the load time of the given page P1
Hope I'm making sense
Actually the answer lives at JMeter Home Page
JMeter is not a browser. 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 viewed at a time)
You don't need to do anything as JMeter doesn't actually render page. You may want to perform some tweaks to make it behave more like a real browser, especially HTTP Cache Manager matters.
In regards to saving browser traffic - for Chromium and derivatives you can do it right from Developer Tools by right-clicking a request in Network tab

JMeter and JavaScript

When I make HTTP Request in JMeter I get Response data like "This page uses JavaScript and requires a JavaScript enabled browser." How is it possible to fix this problem.
JMeter is not a browser, and does not interpret the JavaScript in downloaded pages.
From the JMeter wiki:
JMeter does not process Javascript or applets embedded in HTML pages.
JMeter can download the relevant resources (some embedded resources
are downloaded automatically if the correct options are set), but it
does not process the HTML and execute any Javascript functions.
If the page uses Javascript to build up a URL or submit a form, you
can use the Proxy Recording facility to create the necessary sampler.
If this is not possible, then manual inspection of the code may be
needed to determine what the Javascript is doing.
Depending on what you are doing, you could create an execution test using Selenium IDE for Firefox. The test will run in your browser so the JavaScript will also run. Note though that I never used Selenium as a substitute for JMeter and don't know about common features to both the tools.
I suppose you can use the WebDriver plugin to run real browser tests (IE/Firefox/Chrome/Selenium).
There is good documentation here
You can add WebDriver to JMeter test to fully evaluate the page rendering.
Web Driver Sampler automates the execution and collection of
Performance metrics on the Browser (client-side). A large part of
performance testing, up to this point, has been on the server side of
things. However, with the advancement of technology, HTML5, JS and CSS
improvements, more and more logic and behaviour have been pushed down
to the client. This adds to the overall perceived performance of
website/webapp, but this metric is not available in JMeter. Things
that add to the overall browser execution time may include:
Client-side Javascript execution - eg. AJAX, JS templates
CSS transforms - eg. 3D matrix transforms, animations
3rd party plugins - eg. Facebook like, Double click ads, site analytics, etc
All these things add to the overall browser execution time, and this
project aims to measure the time it takes to complete rendering all
this content.
Official guide: https://jmeter-plugins.org/wiki/WebDriverTutorial/
You need to add HTTP Cookie/Cache Manager to your thread in order to solve this.

Resources