Automate web application testing with Sahi

QTP, Rational Functional tester (RFT), Selenium, and Webdrive are a few examples of the many commercial tools and open source frameworks for automated testing of web applications. In this article, learn about Sahi, a tool that's gaining popularity in the realm of automated testing. Sahi is an open source tool that provides: powerful abilities for recording and replaying across browsers; different language drivers for writing test scripts (Java, Ruby); and support for AJAX and highly dynamic web applications. Sahi also supports https and NTLM authentications. Figure 1 shows how Sahi fits in a simulated user operation.

Figure 1. Simulated user operation
Sahi working as proxy server, which passes the user request to real application and gets response
Sahi working as proxy server, which passes the user request to real application and gets response

About Sahi

Sahi has several powerful features:

Sahi controller (IDE)
Works across browsers and records scripts in two modes: Sahi or Java format.
Robust object identification
Is independent of HTML structure. Its intuitive APIs, such as near and in method, can help locate browser elements even if the page has only a minor change, eliminating the requirement of XPaths (which can be hard to understand).
Implicit waits
Eliminates dealing with wait implementation, even for AJAX and page loads. Testers don't need to know the internals of an application.

Testing with Sahi

The rest of this article walks through a sample application to show you how to use Sahi for testing. You can download the sample application and test case to follow along.

Installation and configuration

To install and configure Sahi:

  1. Download the latest build (see Related topics), and unzip the file. Sahi requires Java 1.5 or later.
  2. Start Sahi's proxy server. The startup scripts are in <sahi_root>\userdata\bin.
    • For Windows: start_dashboard.bat
    • For Linux:
    As shown in Figure 2, you can select a browser icon to start the browser you want to use.
    Figure 2. Sahi Dashboard
    Sahi Dashboard: you can modify the configuration with it
    For this example, we don't need to be concerned about the browser configuration. Alternatively, Sahi provides GUI tools for you to start browsers. Run start_sahi.bat/ to start it, then click a browser icon to start the proxy server and browser process.
  3. Enter start_sahi.bat/, which is required for silent execution with the assistance of build tools such as Ant.

    Note: For Internet Explorer (IE) only, you have to manually configure the browser to use Sahi's proxy. Or, you can use the tools provided by Sahi to set the browser's proxy while starting the Sahi proxy server. The proxy host and port are localhost:9999. (The port can be modified through <sahi_root>\config\

Recording testing scripts in Java format

Sahi provides two out-of-the-box script formats: Sahi and Java. You can modify the default option, which is Sahi, in <sahi_root>\config\ The Sahi format is a Java script-like format, running only within the Sahi Java script engine. The example in this article uses the more common Java format because the scripts can easily integrate with other testing tools and frameworks for large testing projects. The Java format involves a common Java code snippet that can be integrated with tools such as Junit and TestNG.

To run a brief test:

  1. Open the web application that you want to test. Press the ALT key and double-click on the page. (Firefox 3 was used for demonstration.)
  2. Select Record, ss shown in Figure 3:
    Figure 3. Sahi controller for recording
    Screen shot of Sahi Controller to record all executions
    Screen shot of Sahi Controller to record all executions

    After selection, it will change to the Stop button.
  3. Do some operations in the web application, and then select Stop. All the steps you executed in the application are recorded, as shown in Figure 4:
    Figure 4. Recorded scripts by controller
    Screen shot of Sahi Controller recording the scripts
    Screen shot of Sahi Controller recording the scripts

    While your operations are recording, you can insert some assertions if you want. The tools also provide some options for insertions, but it is suggested you add them manually.

Integration with Junit

JUnit, the unit testing framework, is very important in establishing your test-driven development. In many cases, you can create test scripts in Junit format for convenience and reporting. The previous example recorded test scripts in Java format.

To format the above scripts in Junit style, create a Java project in Eclipse, and then add the junit4 library and sahi.jar located in <sahi_root>\lib. When creating a junit4 format test script, you have to initiate some variables required for the Sahi environment. The example in this article extends so that all others test cases can be executed by extending this class.

The demo4sahi class extends the BaseTestCase class to implement all initiating tasks related to the Sahi proxy and then verifies two points:

  • If the email format is OK, you will get OK.
  • If the email format is incorrect, you will get Error.

Listing 1 shows a typical test script in Junit4 format.

Listing 1. Test script in Junit4 format
public class test4demo extends BaseTestCase {

    public void setUp() {
    public void tearDown() {
    public void testDemo1() {
        browser.textbox("email").setValue("demo for sahi");
    public void testDemo2() {

To run the test scripts unattended, you need to implement all initialization and finalization for the Sahi runtime. There are four basic initialization parts, as outlined in Table 1:

Table 1. Initialization of the Sahi environment
Method in BaseTestCaseDescription
createConn()Initiates SAHI_BASE_PATH, USER_DATA_PATH, and browser type, and creates a browser process.
delConn()Cleans the browser process and reverts the system back to the initial status.
setIEProxy()Sets the IE proxy before executing the test. Use only for IE.
login(), logout(), and other commonly used high-level utilitiesPublic methods for all scripts.

BaseTestCase, as the parent class of all test scripts, will invoke the createConn method during runtime, ahead of all other methods, so it can open the browser to simulate the user's operations. Listing 2 shows some of the code for BaseTestCase.

Listing 2. BaseTestCase
public class BaseTestCase {
	protected Browser browser;
	protected Proxy proxy;
	protected boolean isProxyInSameProcess = false;
	protected String browserType = "firefox";
	public void createConn() throws Exception {
		Configuration.initJava("f://Program/sahi", "f://Program/sahi/userdata/");
		if (isProxyInSameProcess) {
			proxy = new Proxy();
		browser = new Browser(this.browserType);;
	public void delConn() throws Exception {
		if (isProxyInSameProcess) {
	public void login(){
	 * Setting IE's proxy during testing environment initialization
	 * @param enable
	public void setIEProxy(boolean enable) {
		try {
			new String[] {
					+ "\\tools\\toggle_IE_proxy.exe",
				(enable ? "enable" : "disable") });
		} catch (Exception e) {

Testing with Ant

Apache Ant, a common build tool, is used especially for Java-based projects. The Sahi framework includes a JAR file for Ant that you can use in the build.xml file. However, this out-of-the-box component is designed for Sahi's structure. Though you might want to use Junit to set up the whole infrastructure, it is not flexible or strong enough. For the regression testing of the example project, a build.xml was written that includes:

  • Starting and stopping the Sahi proxy server, as shown in Listings 3 and 4:
    Listing 3. Start Sahi proxy server
    <target name="start_sahiserver">
    	<echo message="starting sahi server" />
    		<java fork="true" spawn="true" classname="net.sf.sahi.Proxy">
    				<fileset dir="${sahi.dir}">
    					<include name="**/*.jar" />       
                <arg value="${sahihome.dir}" />
                <arg value="${sahiuser.dir}" />
            <antcall target="proxyon" />
    Listing 4. Stop Sahi proxy server
    <target name="stop_sahiserver">
    	<echo message="going to stop Sahi server" />
    	<sahi stop="true" sahihost="localhost" sahiport="9999" /v
    	<antcall target="proxyoff" />
  • Opening and closing the IE proxy setting, as shown in Listing 5:
    Listing 5. Open/close IE proxy
    <target name="proxyon">
    	<exec executable="${sahihome.dir}/tools/toggle_IE_proxy.exe">
    		<arg value="enable" />
    <target name="proxyoff">
    	<exec executable="${sahihome.dir}/tools/toggle_IE_proxy.exe">
    		<arg value="disable" />
  • Reporting.

The actions can be executed separately for easy debugging in the Eclipse IDE.

Advanced topics

In web application testing, it's very important to effectively identify an object. Unlike many other testing tools, Sahi has some powerful APIs to locate objects in a web page. Table 2 outlines a few examples. Refer to the Related topics section for a link to online documentation with a complete list.

Table 2. Special locating methods
FeatureMethodSample code
Support regular expressionsAlmost all elements to .*/)
Locating based on DOM relationsnear, inbrowser.button("delete").in(browser.cell("item1")).click()


Locating based on positional relationsunderbrowser.button("delete").under(browser.cell("item1"))


This article has explored Sahi, a tool for automating web application testing. Sahi is an open source tool that allows recording and replaying across browsers. In this article, you learned about different language drivers for writing test scripts. A sample application and test case showed how to format scripts for Junit and how to test with Apache Ant. Sahi's advanced APIs were also outlined.

Downloadable resources

Related topics

  • Sahi: Learn all about Sahi, a business-ready tool for automation of web application testing. Access documentation, tutorials, and support forums.
  • Sahi: Read more about Sahi.
  • Sahi: Download Sahi.
Zone=Web development
ArticleTitle=Automate web application testing with Sahi