Sunday, November 25, 2012

Selenium - java.lang.IllegalStateException: The path to the driver executable must be set by the system property;

Selenium - java.lang.IllegalStateException: The path to the driver executable must be set by the system property;

IE browser will fail with the above mentioned exception if we upgrade the Selenium webdriver with 2.26.

From 2.26 vesrion, IE driver got decoupled from selenium jar file and entire IE driver software is stored in a separate exe file, there are 32 and 64 bit versions.
You need to download the exe file similar to chrome driver and use the following code to run the test.

Sample code Java/TestNG

  WebDriver driver;
@BeforeMethod public void StartDriver() { File file = new File("C:/Seleniumjars/IEDriverServer.exe"); System.setProperty("", file.getAbsolutePath()); driver = new InternetExplorerDriver(); } @AfterMethod(alwaysRun = true) public void StopDriver() throws Exception { driver.quit(); } @Test(groups = { "GoogleTest" }, enabled = true,timeOut = 90000) public void Test_TC_01_1() throws Exception { driver.get(""); }

Technical Reason?
IE driver original implementation was in dll using native C++. As per the client language bindings .dll was extracted during run-time.
For Java extracting from the .jar file.
For .NET extracting it from resource package into WebDriver.dll assembly.
Ruby and Python directly relied on the files, no extraction is required, just reference to the path.
The language bindings would use following method to load the dll and expose the API
JNI for Java
P/Invoke for .NET
ctypes for Python
FFI for Ruby
It works fine for simple scenarios, but due to above differences, IEdriver was showing different behavior between language bindings.
The way .NET bindings loading and managing the .dll, it was able to support multiple instances of IE.
Java bindings was not able to support multiple instances.

In order to unify the experience across all the languages, separate process was created IEDriverServer.exe because now the process management is defined my the operating system (Different version of Windows) and client bindings can interact directly with the process API.

As there is windows limitation where 32 bit process can't be loaded with 64 bit dll, separate 32 and 64 bit process are created.

As the IE driver got decoupled from the selenium release, it is possible to ship the fixes of IE driver without having to wait for complete selenium release.

It is easy to debug a standalone dll then dll loaded by the laungage binding.

Thanks a lot to Jim Evans (IE driver and .NET bindings project lead) for sharing the details and contributing to the open source community.


Sunday, November 18, 2012

VS2012 - Web Performance Test - Virtual Users Limit

VS2012 - Web Performance Test - Virtual Users Limit.

I was surprised to see there is no virtual users restrictions (Number of users) for conducting load test using Visual Studio 2012 Ultimate. Generally any commercial load test tool fix the tool cost based on the number of virtual users, technologies (AJAX, Flex, Silver-light..) and monitoring agents, now the trend got changed, need to see how other commercial load test tools like HP loadrunner, Neoload change the licence structure.


Friday, November 16, 2012

Visual Studio 2012 - Versions for GUI and Performance Testing

Visual Studio 2012 - Versions for GUI and Performance Testing

Recently I started working with CodedUI and Performance testing using Visual Studio. I have VS2012 Professional and didn't find any option to select CodedUI project, so started investigating which all versions of VS2012 support GUI testing and performance testing. Below screen shot helped me to understand the supported versions of VS2012.

Approx cost of VS2012.


Thursday, November 8, 2012

Selenium 2.26 is ready for download.

Selenium 2.26
Download from this link.
Following are the major bug fixes and enhancements.
Hats-off to the development team for frequent releases and you determination to enhance the tool.

* Updated OperaDriver to 0.15.
* Added transparency support to the Color class.
* Increased lock time a bit for the FirefoxDriver to make tests more
stable on Windows.
* Added the enablePersistenHover capability to allow the user to specify
whether to use the persistent hover thread in the IE driver. Defaults
to true for IE.
* Added support for native events for Firefox 15 and 16.
* Removed deprecation from ChromeDriver constructors that take a Capabilities
object. Also added a method to set experimental options in ChromeOptions
which may be used to set options that aren't exposed through the ChromeOptions
* Fixed SafariDriver to allow calling .quit() consecutively without error.
* Modified FirefoxDriver to use atoms to switch between frames.
* FIXED: 4535: Hover still does not work perfectly in IE.
* FIXED: 4676: Unable to fire javascript events into SVG's.
* FIXED: 4320: Impossible to IE run tests in parallel via TestNG.
* FIXED: 4309: 'Could not convert Native argument arg 0' error with Firefox.
* FIXED: 4593: Alert.accept() Cancels the Resend Alert/Dialog Box.
* FIXED: 4321: Upgrade HtmlUnitDriver to HtmlUnit 2.10.
* FIXED: 4639: Webdriver 2.25 fails to quit on Windows.
* FIXED: 3774: New SafariDriver sessions do not come with a clean profile.
* FIXED: 4375: Executing javascript hangs Firefox.
* FIXED: 4203: Java SafariDriver has limited websocket frame size.
* FIXED: 4165: WebDriver fails on a machine with no IP address.
* FIXED: 3969: SafariDriver should auto-dismiss alerts.

* FIXED: 4648: findElement errros not helpful.
* FIXED: 4687: webserverjs cannot find module in node.js.
* FIXED: 4649: Wrong Content-Length calculation in webdriverjs.
* FIXED: 4425: Webdriver.js regression: webdriver.By.* selectors defect when
using Node.js.

* FIXED: 4433: NPE at grid launch if invalid servlet class name is specified.
* FIXED: 4526: elenium node stop responding when there are 2 or more tests
waiting for a specific node.
* FIXED: 2549: "-role hub" doesn't allow Firefox to starts. ---

Thursday, November 1, 2012

Webdriver - Display Browser Version and Name

Webdriver - Display Browser Version and Name.

Tests are getting executed on different browsers, some time getting confused with the browser name and version of the test results, so I have implemented following code to make an entry in the log file.

  String script = "return navigator.appName;";
Temp = (String) ((JavascriptExecutor) driver).executeScript(script);
script = "return navigator.appVersion;";
Temp = (String) ((JavascriptExecutor) driver).executeScript(script);
  script = "return navigator.platform;";
  Print((String) ((JavascriptExecutor) driver).executeScript(script));

Print() is a user defined method created in our framework, to know more details select this link