Thursday, July 21, 2011

Execute a suite file using Ant

Ant file for running a suite file

For running a suite file provide the ant script with the task "testng". The "testng" task will only be executed if a task definition for testng is specified.

    <property name="xml" value=""/>


    <taskdef name="testng" classname="com.beust.testng.TestNGAntTask" classpathref="classpath"/>


    <target name="run_tests" depends="compile the code">
       <echo message="running tests" />
       <testng classpathref="classpath of jars and other classes used" haltOnfailure="true">
               <xmlfileset file="${xml}" />
       </testng>
    </target>

A xml suite file can be used to specify the test to be run. The parameters to be passed to the test etc.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
 <suite name="Suite1" verbose="1" >
  <test name="Regression1" preserve-order="true">
  <parameter name="env" value="test"/>
  <parameter name="driver" value="ie"/>
    <classes>
   <class name="mytests.First">
    </class>
    </classes>
    </test>
</suite>

Save the above suite as Sample.xml. It contains the class to be executed, the parameters to be passed to the test etc.

Ant Command
   ant -Dxml = Sample.xml

Yaml as config file

One of the best options to specify a config file for java based selenium project is by using a yaml file. In the yaml file the commonly changing config values or values which are used in all tests can be given. There are number of parsers available. I am using snakeyaml.

Jar File

snakeyaml-1.6.jar

Sample yaml file

base: &base                                  # defines anchor label base
  location_username: 'xpath'
  location_password: 'xpath'
  location_submit: 'xpath'
  page: 'http://xxxxxxxxxxx'

test:
  <<: *base                                 #  merges key : value from base anchor
  username: 'testtest'
  password: '123456'
  page: 'http://xxxxxxxxxxx'

prod:
  <<: *base
  username: 'testprod'
  password: '123456'
  page: 'http://xxxxxxxxxxx'

I have saved the above as sample.yaml in my config folder. The use of  "*" and "&" is the inherit the values defined in "base" to "test" and "prod"

Sample java program

import org.yaml.snakeyaml.Yaml;

public class xxx{
 protected Map<String, Map<String,Object>> fullConf;
 protected Map<String,Object> conf;

             Yaml yaml = new Yaml();
             InputStream input = new FileInputStream(new File(System.getProperty("user.dir") + "/config/sample.yaml"));
                this.fullConf = ((Map<String, Map<String,Object>>) yaml.load(input));
                System.out.println("values of fullConf "+fullConf);
                if (fullConf.containsKey("test")) {
                    this.conf = fullConf.get("test");
                    System.out.println("values of test env "+conf);
                    System.out.println("Username "+conf.get("username"));
                    System.out.println("Passowrd "+conf.get("password"));
                    System.out.println("Page "+conf.get("page"));
                    System.out.println("location_username "+fullConf.get("location_username"));
                    System.out.println("location_password "+fullConf.get("location_password"));
                }

}

This program prints the contents of yaml. The variable "fullConf " contains all data of the yaml file as a "key, Map". The variable "conf " will have data of any specific node.


Project home
   src
      test.com
  one/two/three
      config/config.yaml


         InputStream in = this.getClass().getClassLoader().getResourceAsStream("config/config.yaml");
        System.out.println("Hello1 : "+in);

        in = this.getClass().getResourceAsStream("/config/config.yaml");
        System.out.println("Hello3 : "+in);

http://viralpatel.net/blogs/2009/10/loading-java-properties-files.html

Sunday, July 17, 2011

Execute a java class using Ant

Sample Ant Script

<project name="selenium-demo" default="compile" basedir=".">

    <property name="build.dir" value="build" />
    <property name="src.dir" value="src"/>
    <property name="lib.dir" value="lib"/>
    <property name="reports.dir" value="report"/>
    <property name="xml" value="Sample.xml"/>
    <property name="main-class"  value="mytests.Sample"/>
 
    <path id="classpath">
        <pathelement location="${build.dir}/classes"/>
        <fileset dir="${lib.dir}" includes="**/*.jar"/>
    </path>

    <target name="compile">
        <delete dir="${build.dir}"/>
        <mkdir dir="${build.dir}/classes"/>
        <javac srcdir="${src.dir}" destdir="${build.dir}/classes"  executable="javac">
            <classpath refid="classpath"/>
        </javac>
    </target>

    <target name="run_tests" depends="compile">
        <java classname="${main-class}">
             <classpath refid="classpath"/>
        </java>
    </target>

</project>

Save the above file as ant.xml.

Sample Java File


package mytests;

import java.io.IOException;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.Test;


public class Sample{
 
    public static void main(String str[]){
         WebDriver driver = new FirefoxDriver();
         driver.get("http://www.addthis.com");
         try {
            Thread.sleep(5);
        } catch (InterruptedException e) {
        }
        driver.close();
    }

}

Save the java file as Sample.java and put it into a folder named "src" . Create a new folder and name it "lib" and paste the jar files to be used in the project. For above project only "selenium-server-standalone" will be enough. From the CMD go to the project location and excute the command ant run_tests. Now a new folder called build will be created and it will have all compiled classes.

Thursday, June 30, 2011

RemoteWebDriver

We can run the tests in a remote machine by using remotewebdriver. For this user needs to start a server in the remote machine where he intends to run the test. More details are here    .

Once the server is started execute the below code.

   DesiredCapabilities desiredCapabilities = DesiredCapabilities.firefox();
//        URL remoteAddress = new URL("http://127.0.0.1:4444/wd/hub");
      HttpCommandExecutor executor = new HttpCommandExecutor(new URL("http://Remote address:4444/wd/hub"));
        WebDriver driver = new RemoteWebDriver(executor, desiredCapabilities);
          driver.get("http://www.google.com/");
          driver.quit();

We can see the firefox browser getting invoked in remote machine.

Friday, May 13, 2011

Fucking Railways

I recently had to travel from alleppy to nagercoil. It was the worst experience i ever had. I don't remember the name of that fucking thing. Anyway it started from Alleppey by around 11:50 am. So i thought to have lunch from the train itself. I have heard that the food served by irctc is really tasty. Why i opted for this specific train bcoz was actually a super fast train.So from Alleppey the next stop will be Kayamkulam , followed by Kollam and Trivandrum.

After a half hour journey it reached some where and waited for a crossing. From there starts the worst part. As it was a really hot day i thought of drinking some water and searched the entire train for person supplying water. It was then i realized that the train had no pantry car. We waited for the crossing for about an hour. No food no water, i was really tired. Same condition for the other passengers. Finally the train started again and before another half hour journey halted for another crossing. Luckily this time it was in a railway station. So i thought of buying some water plus food from the  station. But to my surprise that station had only a ticket counter and a small waiting shed. I searched outside of station but no luck. Same condition. Not even a small shop anyway near. I cursed the whole railways and i got into train. Finally out of exhaustion i slept.

Wednesday, May 11, 2011

Select new window using selenium

Selecting a newly opened window using selenium will me a nightmare for all who are trying to automate using selenium.

 Selenium provides selectWindow(windowID) method for handling this situation. In most cases we wont get the window id. So we are forced to go with other parameters like "title= Title of newly opened page" or "name = Name of Window" etc. Most often window.open method will be provided with a window name. If so we can go for selectWindow("name=window_Name").


If both the above cases cannot be applied go for the code snippet given below.

        Selenium selenium;
        String new_Window = this.driver.getWindowHandle();

        Set<String> wh1 = driver.getWindowHandles();
        selenium.click("Link of window");
        Set<String> wh2 = driver.getWindowHandles();
        wh2.removeAll(wh1);
        new_Window = (String) wh2.toArray()[0];
        selenium.selectWindow(new_Window);

Measure it!

Did you ever wonder or check out for a tool which can be used to measure the length/width of page elements in pixels. Yes, Mozilla has got an addon "Measure it" which does the exact purpose. Just install the addon. Now a icon of  "Measure it" will be rendered in the bottom left corner of  status bar. Just click on it and measure the length of any page element.

Measure it is also available as a Chrome pluigin.