Please post your Web Driver questions in official Web Driver forum

Sunday, June 26, 2011

Selenium Tutorial: Selenium Grid 1.0 configuration

I must say I did not have an easy time trying to set up Selenium Grid 1.0 locally. Since I did not have access to multiple machines I was trying to setup hub as well as slave remote control and was following the doc available here. Though documentation is detailed it is tough to have it replicated with your set up. of late I posted about ant build file here and we need to add couple of target to it to be able to work with Selenium grid. I have taken these extra target from the Selenium Grid distribution, these are -












Target - "launch-hub" is used to launch grid hub while target "launch-remote-control" is used to launch remote controls along with set of parameters like - host, hubURL etc, which would be serving to hub.

Selenium Tutorial: Ant Build for Selenium Java project

Ant is a build tool which could be used to have your tests running either from command line or from Hudson CI tool. There is detailed documentation available for ant here but probably you need to know only a little part of it for you selenium tests. The essentials which are needed to know are:
  1. Project
  2. Target (ant execution point and collection of tasks)
  3. Tasks (could be as simple as compilation)
And there would usually be following targets for Selenium tools -
  1. setClassPath - so that ant knows where you jar files are
  2. loadTestNG - so that you could use testng task in ant and use it to execute testng tests from ant
  3. init - created the build file
  4. clean - delete the build file
  5. compile - compiles the selenium tests
  6. run - executes the selenium tests
Here is my project set up for ant -



Thursday, June 23, 2011

Selenium Tutorial: Get attribute of an element

With Selenium 1.0

Let us consider Google Search Box for example and its "max length"is to be retrieved.

Using xPath -
        String var = selenium.getAttribute("//input[@name='q']/@maxlength");
        System.out.println(var);

Using css locator -       
       
        String var = selenium.getAttribute("css=input[name='q']@maxlength");
        System.out.println(var);
      
With Selenium 2.0 (WebDriver)       

Using xPath -
        String var = webDriver.findElement(By.xpath("//input[@name='q']")).getAttribute("maxlength")
        System.out.println(var);

Using css locator -       
       
        String var = webDriver.findElement(By.cssSelector("input[name='q']")).getAttribute("maxlength")
        System.out.println(var);

Wednesday, June 22, 2011

Loving the UI of Google Groups

The new UI of Google Groups has been in existence from a while though I found it only today. I am just in love with how cleaner new UI is and yet Google gives you a chance to file your wish list here


Friday, June 17, 2011

Selenium Tutorial: Pattern Mathing using Selenium

I must confess I have never been admirer of Regular Expression but then there are times you can not escape from it, especially while working on a website which has dynamic contents appeared in static text and you want to validate it. like -

"Validate that this text appears and there is 123 here and 456 here"

And the test condition is 123 and 456 could be any three digits but number if digits should not be more than three.

In a crude way we can at least test this -

Assert.assertTrue(selenium.getText("elementLocator").contains("Validate that this text appears and there is"));
but what if text goes wrong after "and there is"... what if more than 3 digits appear in text.
This is where pattern matching/regular expression comes for our rescue and we can use matches method of String class to achieve same. So the assertion would be -

String text = selenium.getText("elementLocator"); 
Assert.assertTrue(text.matches("Validate that this text appears and there is [0-9]{1,3} here and [0-9]{1,3} here"));
Lets try to understand two strings side by side -

Validate that this text appears and there is 123 here and 456 here
Validate that this text appears and there is [0-9]{1,3} here and [0-9]{1,3} here 

Herein 123 has been replaced with [0-9]{1,3} and 456 has been replaced with [0-9]{1,3} (well, the same set)
[0-9] means matching digit should be from 0 to 9 hence all the digits in 123 would fall in this category and so as all digits available.
{1,3} means number of digits should be at most 3
Now if application text contains more than three characters then AssertionError would be thrown.

Consider you want to tests that number of digits should be exactly three, then you could use following -

Validate that this text appears and there is 123 here and 456 here
Validate that this text appears and there is [0-9]{3} here and [0-9]{3} here 
And if you did not want to keep any constraint on number of digits then use -

Validate that this text appears and there is 123 here and 456 here
Validate that this text appears and there is [0-9]{1,} here and [0-9]{1,} here 
Here syntax {1,} is to match any number of digits

Lets see some text matching now

Validate text and dynamic text 
Validate text and [A-Za-z]{1,} text

Here [A-Za-z] means to match, small or capital letters and {1,} means to match any number of characters as discussed above. If we wanted to restrict match to only small characters then we could have used -


Validate text and dynamic text 
Validate text and [a-z]{1,} text


Examples -
("this is 123 and 2 and this is more garbage text".matches(
               "this is \\d{1,3} and \\d and this is more \\w{1,10} text")
or
"this is 123 and 2 and this is more garbage text".matches(
               "this is \\d{3} and \\d{1} and this is more \\w{1} text")
or
("this is 123 and 2 and this is more garbage text".matches(
               "this is \\d{1,} and \\d{1} and this is more \\w{1,} text")
or
"this is 123 and 2 and this is more garbage text".matches(
               "this is \\d+ and \\d and this is more \\w+ text")
or
"this is 123 and 2 and this is more garbage text".matches(
               "this is \\d{0,} and \\d and this is more \\w{0,} text")
or
"this is 123 and 2 and this is more garbage text".matches(
               "this is \\d* and \\d and this is more \\w* text")
or
"this is 123 and 2 and this is more garbage text".matches(
               "this is \\d* and \\d{0,1} and this is more \\w* text")
or
"this is 123 and 2 and this is more garbage text".matches(
               "this is \\d* and \\d? and this is more \\w* text")
or
"this is 123 and 2 and this is more garbage text".matches(".*")
To revise, important shortcuts are -
           \d is shortcut for [0-9]
    \w is shortcut for [A-Za-z0-9_]
*  is shortcut for occurs 0 or more times, that is {0, }
+ is shortcut for occurs 1 or more times, that is  {1, }
? is shortcut for occurs 0 or once, that is {0, 1}
.* matched any character sequence
"true".matches("[t]rue")
or
"true".matches("[tuv]rue")
or
"true or false".matches("[tuv]rue or [fgh][abc]lse")
subexpression and alteration -
selenium vs qtp".matches("selenium (vs|as) \\w+")

So this was some pattern matching with Selenium tests, I would add on more to this post when I encounter new scenarios for testing.

Friday, June 10, 2011

Beginner to Selenium Java Library, How much java to learn?

You have decided to learn Selenium to automate your web application. But not sure where to begin from. There is already one awesome document available on SeleniumHQ to learn Selenium. But what if you have least or no programming experience. And if you are going to use java client driver of Selenium then how much java knowledge you need?

Herein I have jotted down some java essentials which are needed in order to used java client library of Selenium.
    • OOPS - Encapsulation, Abstraction, Inheritance, Polymorphism. 
      Needless to emphasize on their importance in programming.
      • Introduction to Class, instance variable, instance methods, class variable, class method, Object
      • Constructor, Abstract Class, Interface, method overloading, method overriding, Package
      You definitely need to know when to create a class or interface, how to initialize your instance variables, create methods for test scenarios and bundle your test classes in packages

        • Ctrl Statment. To be able make to make decision in test methods. Should I continue test execution if login fails?
        • Loops. To execute same statements time and again, for example logging in for 5 different accounts using same method.
        • Arrays. You don't want to keep writing variables all overs you test scripts. Wish you could create a large place holder for similar types of variables.
        • Exception Handling. How would you continue with test execution if some thing unexpected happens during test execution?
        • Files and streams. So you want to keep test data out of your java source file, but how would you access them with in your test scripts?
        • Java Generics. Want to work with objects and not primitive data types and at the same time want type safety also.

        • Collection Framework. ArrayList and HashMap is a must to know
        • Multi Threading. How many threads to run for faster execution?
        • JDBC. Because we all love database testing, don't we?

        You can watch Java Training Videos to learn all of these topics

      Saturday, June 4, 2011

      Most cliched Selenium questions...

      I see following Selenium questions time and again on multiple Selenium forums (StackOverflow, Google Groups, QAForums) -

      1. Does Selenium IDE work with IE?
      2. How do I read data from excel using Selenium?
      3. Should I use selenium 1 or 2?
      4. How do I handle js error using Selenium?
      5. How do I handle pop up window using Selenium?
      6. Does Selenium support Window application?
      7. How do I upload a file using Selenium?
      Well I am am not posting solution for any of these problems as net is filled with all possible solutions for these scenarios.


      Fork me on GitHub