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 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
nearandin 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.
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:
- Download the latest build (see Resources), and unzip the file. Sahi requires Java 1.5 or later.
- Start Sahi's proxy server. The startup scripts are in
<sahi_root>\userdata\bin.
- For Windows: start_dashboard.bat
- For Linux: start_dashboad.sh
Figure 2. Sahi Dashboard
For this example, we don't need to be concerned about the browser configuration. Alternatively, Sahi provides GUI tools for you to start browsers. Runstart_sahi.bat/start_sahi.shto start it, then click a browser icon to start the proxy server and browser process. - Enter
start_sahi.bat/start_sahi.sh, 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\sahi.properties.)
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\sahi.properties. 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:
- 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.)
- Select Record, ss shown in Figure 3:
Figure 3. Sahi controller for recording
After selection, it will change to the Stop button. - 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
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.
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 BaseTestCase.java 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 {
@Before
public void setUp() {
login();
}
@After
public void tearDown() {
logout();
}
@Test
public void testDemo1() {
browser.textbox("email").setValue("demo for sahi");
browser.submit("Submit").click();
assertTrue(browser.label("error").exists());
}
@Test
public void testDemo2() {
browser.textbox("email").setValue("demo@sahi.com");
browser.submit("Submit").click();
assertTrue(browser.label("ok").exists());
}
}
|
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 BaseTestCase | Description |
|---|---|
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 utilities | Public 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";
@Before
public void createConn() throws Exception {
Configuration.initJava("f://Program/sahi", "f://Program/sahi/userdata/");
if (isProxyInSameProcess) {
proxy = new Proxy();
proxy.start(true);
}
browser = new Browser(this.browserType);
browser.open();
}
@After
public void delConn() throws Exception {
browser.setSpeed(100);
browser.close();
if (isProxyInSameProcess) {
proxy.stop();
}
}
public void login(){
browser.navigateTo("http://localhost:8080/demo");
browser.textbox("username").setValue("ligang");
browser.password("password").setValue("welcome");
browser.submit("Login").click();
}
/**
* Setting IE's proxy during testing environment initialization
*
* @param enable
*/
public void setIEProxy(boolean enable) {
try {
Runtime.getRuntime().exec(
new String[] {
SetEnv.sahiBasePath
+ "\\tools\\toggle_IE_proxy.exe",
(enable ? "enable" : "disable") });
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
......
}
|
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"> <classpath> <fileset dir="${sahi.dir}"> <include name="**/*.jar" /> </fileset> </classpath> <arg value="${sahihome.dir}" /> <arg value="${sahiuser.dir}" /> </java> <antcall target="proxyon" /> </target>
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" /> </target>
- 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" /> </exec> </target> <target name="proxyoff"> <exec executable="${sahihome.dir}/tools/toggle_IE_proxy.exe"> <arg value="disable" /> </exec> </target>
- Reporting.
The actions can be executed separately for easy debugging in the Eclipse IDE.
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 Resources section for a link to online documentation with a complete list.
Table 2. Special locating methods
| Feature | Method | Sample code |
|---|---|---|
| Support regular expressions | Almost all elements identifier | browser.link(/Link to .*/) |
| Locating based on DOM relations | near, in |
browser.button("delete").in(browser.cell("item1")).click()
|
| Locating based on positional relations | under | browser.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.
| Description | Name | Size | Download method |
|---|---|---|---|
| Sample web application | webapp4sahi.zip | 7KB | HTTP |
| A Sahi test example | Demo4SahiTest.zip | 287KB | HTTP |
Information about download methods
Learn
- 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.
- developerWorks Web
development zone: Find articles covering various Web-based solutions.
-
developerWorks technical events and webcasts: Stay current with
developerWorks technical events and webcasts.
Get products and technologies
- Sahi: Download Sahi.
- IBM trial
software: Innovate your
next development project with IBM trial software, available for download or on DVD.
Discuss
- Participate in the discussion forum.
- Create your developerWorks profile today and setup a watchlist on Sahi. Get connected and stay connected with
developerWorks community.
- Find other developerWorks members interested in Web development.
- Join one of our developerWorks groups focused on Web
topics: Share what you know.
- Roland Barcia talks about Web 2.0 and middleware in his blog.
- Follow developerWorks' members' shared bookmarks on Web topics.
- Visit the Web 2.0 Apps forum: Get answers quickly.
- Visit the Ajax forum: Get answers quickly.





