Why does Nightwatch start a Selenium server? - selenium

The Selenium docs say:
If your browser and tests will all run on the same machine, and your
tests only use the WebDriver API, then you do not need to run the
Selenium-Server; WebDriver will run the browser directly.
So why does Nightwatch even use the server? Whenever I try to run my tests they first say Starting Selenium Server.
I imagine my tests would be faster without starting a server for each. Is there a way to turn it off? Currently Selenium isn't even working for me: Why does Nightwatch / Selenium give me a 'Connection reset' error?

Nightwatch will send a http request to the webdriver server to run your tests on a web browser. You can go over the way Nightwatch.js works in detail here:
http://nightwatchjs.org/getingstarted
Nightwatch is just a task runner. You still need a server along with the task runner to actually execute your tasks. That's where Webdriver comes in. Selenium is one of the most popular Webdriver out there and is stable when paired with Nightwatch tasks. Whether to use a standalone server or not is optional and up to you.

Related

i want to run my jmeter web driver script for 100 user without open browser

when i was run jmeter webdriver script multiple browser is open and this condition not get accurate load testing report so how i get proper load testing report without open Browser?
As per WebDriver Tutorial
Note: It is NOT the intention of this project to replace the HTTP Samplers included in JMeter. Rather it is meant to compliment them by measuring the end user load time.
So you should not be using WebDriver Samplers to create the main load as browsers are very resource intensive and most probably you won't be able to kick off more than 5-10 browsers on a single machine.
If your requirement is to conduct the load testing using 100 real browsers - you will have to go for Distributed Testing
If you want to use existing Selenium tests as a basis for a protocol-based load test you should record them using JMeter's HTTP(S) Test Script Recorder. You can set the proxy for your WebDriver tests as follows:
So we have an option to run webdriver smaplers without opening the browsers if you are using chrome browser for this. You add jp#gc - Chrome Driver Config config element and there are 3 tabs in that those are "proxy", "chrome" and "Experimental". So you click on "chrome" tab and check the check box of Use Chrome headless mode. See the screenshot below.
In reality if you want to run webdriver samplers for more than 100 browser then I would suggest you that u use distributed test. Because browsers are resource consuming if you run around 4 browsers then your system starts hanging. so you cannot run 100 browsers. So go with Distributed testing in jmeter.

How to run headless browser in jmeter for WebDriver Samplers,

Detailed steps please, tried to use both HTMLUnit Driver Config and PhantomJs config, but no luck
How to run headless browser in jmeter for WebDriver Samplers, detailed steps please, tried to use both HTMLUnit Driver Config and PhantomJs config, but no luck. My requirement is I need to convert selenium script into jmeter script, I have created Webdriver script in jmeter, I need to run it with 100 users, as I donot want to launch 100 instances of browser, I want to run it as headless browser, directly creating jmeter load script is not an option as request is using a dynamic valuse which is not available in server response.
You will launch 100 instances of browser in any case, no matter whether browser is headless or not and most probably your JMeter system will not be able to handle that many browser instances and you will have to go for distributed testing
Your "no luck" statement doesn't make sense as information is not sufficient to come up with solution.
For HTMLUnit it is enough to add HtmlUnit Driver Config and WebDriver Sampler itself
For PhantomJS Driver Config you need to download PhantomJS binary and specify location under PhantomJS -> Path to PhantomJS executable input. Of course add WebDriver Sampler with your code
In both cases you will need to have Selenium client libraries somewhere in JMeter Classpath so make sure to install WebDriver Sampler using JMeter Plugins Manager - it will automatically take care of the dependencies.
If JMeter doesn't work as expected first of all check jmeter.log file for any suspicious entries - in 99% of cases it contains enough information to get to the bottom of the issue.
Also be aware that dynamic value is not a showstopper, in the absolute majority of cases it is somewhere in response (either in body, or in URL or in cookies, or in headers), in remaining cases it can be calculated or generated.

Jmeter recording in NON GUI mode for Selenium testing

I would like to record the network requests of a Selenium test. Rather than using jmeter GUI, I would like to automate this process in a script. The idea would be to run a selenium test and record it simultaneously. Is there a built in way to do this?
GUI Jmeter is ideally for development of scripts, which are then run headless to get true performance figures.
You can develop selenium webdriver tests as junit tests, which integrate to JMeter very easily.
Running a recorded Selenium IDE test would not be so straightforward, better to export it as Java Webdriver.
Make sure you follow junit naming conventions and annotations (depending which version you use). Write the test class, including junit 'test' methods, then create a jmeter test plan with a junit sampler, and configure the junit sampler to run your test method[s].
maven and plugins can be used to make it all run seamlessly in headless mode on any host.
Once you have developed one of these, it will be easy to review the jmx test script and automate the process of creating more jmeter tests, if that is what you meant by automating the process.
Start JMeter's Proxy Server
Configure your Selenium script to use JMeter as a proxy. See Using a Proxy guide for configuration details for each driver
Run Selenium test - all requests should be recorded by JMeter.
Add the next test elements to JMeter test plan:
HTTP Cookie Manager - to represent browser cookies
HTTP Cache Manager - to represent browser cache
follow recommendations from How to make JMeter behave more like a real browser to properly configure embedded resources retrieval, user agent, request defaults, etc.
Configure Thread Group parameters according to your load scenario.
Replay the test.
I expect that you will need to apply some correlation, but it may be not required.

What's difference between protractor (Selenium webdriver) VS ghostdriver (phantomjs webdriver)?

I would like to make it clear about the difference between protractor VS ghostdriver.
With protractor:
start selenium web server for testing.
multiple browser testing.
whenever it start testing, it open the browser.
With ghostdriver:
start phantomjs web server.
can be config multiple browser too.
can run separate with selenium or integrate with selenium.
My question is PhantomJS webdriver can run alone without selenium webdriver, multiple browsers and good for CI. Why do we need to run selenium and integrate selenium with phantomjs using ghostdriver?
While I'm not entirely sure I understand your question, I'll take a stab at answering it. With WebDriver, driving a browser is done via a standardized JSON-over-HTTP wire protocol. This means that you need a "server" component that understands the wire protocol to drive any particular browser. For each of the major desktop browsers (Internet Explorer, Chrome, and Firefox), there is a server component that your WebDriver code talks to (IEDriverServer.exe, chromedriver.exe, or a Firefox browser extension, respectively). PhantomJS also implements a server component that understands the WebDriver wire protocol, so the same high-level WebDriver code can be used with PhantomJS that is used with other browsers. Note that the Selenium server is not required to drive any of the browsers on the local machine.
Now, since the protocol used is simply transmitted over HTTP, that gives WebDriver the opportunity to run the WebDriver code on one machine, while driving a browser located on an entirely different machine. That's where the Selenium server comes in. The Selenium server starts an HTTP server that understands the WebDriver JSON wire protocol. When that server receives a WebDriver command, it can forward that command to another "server" component, either running on that machine (as a standalone remote server), or on yet another machine running another instance of the Selenium server (in a "grid" configuration).
So to answer your question, yes, WebDriver code can be executed against PhantomJS without using the Selenium server. It can likewise be executed against Internet Explorer, Firefox, Chrome, Safari, and some versions of Opera, all without using the Selenium server. Notice that all of this is true without mentioning Protractor at all. Since Protractor is based on WebDriverJS, as long as there's a "server" component running, whether that's a Selenium server, chromedriver.exe, IEDriverServer.exe, or PhantomJS, the driver should be able to communicate with and drive that browser. Looking at the code, it appears that WebDriverJS (and, by extension, Protractor), should be able to execute against Chrome and PhantomJS without requiring the Selenium server, but I don't know enough about Protractor's wrapping of WebDriverJS to speak with authority.

What is the difference between Selenium's Remote Control vs WebDriver?

I'm not sure I quite understand the difference. WebDriver API also directly controls the browser of choice. When should you use selenium remote control (selenium RC) instead ?
Right now, my current situation is I am testing a web application by writing a suite with Selenium WebDriver API and letting it run on my computer. The tests are taking longer and longer to complete, so I have been searching for ways to run the tests on a Linux server.
If I use Selenium Remote Control, does this mean I have to rewrite everything I wrote with WebDriver API?
I am getting confused with Selenium Grid, Hudson, Selenium RC. I found a Selenium Grid plugin for Hudson, but not sure if this includes Selenium RC.
Am I taking the correct route? I envision the following architecture:
Hudson running on few Ubuntu dedicated servers.
Hudson running with Xvnc & Selenium Grid plugin. (Do I need to install Firefox separately ?)
Selenium grid running selenium RC test suites.
I think this is far more time efficient than running test on my current working desktop computer with WebDriver API.
WebDriver is now Selenium 2. The Selenium and WebDriver code bases are being merged. WebDriver gets over a number of issues that Selenium has and Selenium gets over a number of issues that Webdriver has.
If you have written your tests in Selenium one you don't have to rewrite them to work with Selenium 2. We, the core developers, have written it so that you create a browser instance and inject that into Selenium and your Selenium 1 tests will work in Selenium 2. I have put an example below for you.
// You may use any WebDriver implementation. Firefox is used here as an example
WebDriver driver = new FirefoxDriver();
// A "base url", used by selenium to resolve relative URLs
String baseUrl = "http://www.google.com";
// Create the Selenium implementation
Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
// Perform actions with selenium
selenium.open("http://www.google.com");
selenium.type("name=q", "cheese");
selenium.click("name=btnG");
Selenium 2 unfortunately has not been put into Selenium 2 but it shouldn't be too long until it has been added since we are hoping to reach beta in the next couple of months.
As far as I understand, Webdriver implementation started little later than Selenium RC. From my point of view, WebDriver is more flexible solution, which fixed some annoying problems of SeleniumRC.
WebDriver provides standard interface for testing web GUI. There are several implementations of this interface (HTTP, browser-specific and based on Selenium). Since you already have some WebDriver tests, you must be familiar with basic docs like this
The tests are getting longer and longer to complete, so I have been searching for ways to run the tests on a linux server.
Did you try to find actual bottlenecks? I'm not sure, that elimination of WebDriver layer will help. I think, most time is spent on Selenium commands sending and HTTP requests to system-under-test.
If I use sleneium remote control, does
this mean I have to rewrite everything
I wrote with WebDriver API ?
Generally, yes. If you did not implement some additional layer between tests code and WebDriver.
As for Selenium Grid:
You may start several Selenium RC instances on several different [virtual] nodes, then register them in Selenium Grid. Your tests connect to Selenium Grid, and it redirects all commands to SeleniumRC instances, coordinating them in accordance with required browsers.
For details of hudson plugin you may find more info here