Sunday, 10 July 2016

Object Repository in Selenium/Webdriver

From last 6 month or so, I am happily playing with Selenium API. Earlier, I invested more than 3 years in QTP/UFT. After spending that much of time in QTP, it’s very obvious that moving to selenium is not easy game and you cannot help yourself but compare this two things. You missed a lot of things from QTP when you move to Selenium, I can enlist few of those as follows:-
  1. Actions
  2. Datatables
  3. Checkpoints
  4. Smart Identifications
  5. Recovery scenarios
  6. Readily available test execution results and
  7. Object Repository and OR Manager

This is not the complete list but still this are the majors which I have missed.
“Journey becomes easy and better when you have good companion.” I went through many forums to find out good companion for learning selenium and finally settled on a book Selenium Testing Tools Cookbook by Unmesh Gundecha. When I started to learn selenium, I thought of  creating Object Repository in selenium. The book by Unmesh, itself was presented with recipe of implementation of Object Repository [OR]. I have done some changes in implementation as per need which we will discuss in this post.  

What is Object Repository (OR) anyway?

Object Repository is a mechanism to store objects information from application under test for performing action on those objects in a test script, it acts as interface between Test script and application in order to identify the objects during the execution

Setting Up Object Repository for Selenium WebDriver

         We know that, QTP internally uses  XML to store object repository and someone already answered on stackoverflow  to show use of XML as object repository for Webdriver. Personally I prefer to use properties files as they are more readable than XML files. As you might aware that property file uses key-value pair format. You must decide the format for your properties file, I am using it in following way:-


[logical_name]=[locator_type]~[locator_value]

Where -
[logical_name]:Logical Name generally would be label of element.[As it displayed on the UI]
[locator_type]:Locator type must be one from the following-id, name, className,  linkText, partialLinkText, cssSelector, xpath, tagName.
[locator_value]:Locator value - Value of locator_type

Sample property file screenshot-
Sample Object Repository Selenium WebDriver
Sample Object Repository Selenium WebDriver

Fetching objects from the Object Repository:-

Now that we have created properties file (OR), we need to have mechanism in a place to fetch this objects in our test script. Let's design a class which will help us to achieve following objectives.:-

  1. Get WebElement as mentioned in our properties file.[method getElement()]
  2. Get Locator as mentioned in our properties file. [method getLocator()]

Using Object Repository in Selenium WebDriver script:-

Now let us try to automate the scenario of login to application which uses Login OR  [Login.properties file as shown in image], ObjectMap class.



Above script demonstrate login to wordpress. It uses getLocator method from the class ObjectMap. This is very straightforward example of OR, it does not uses Page Object Model or TestNG. If you notice, we have not used getElement method from the ObjectMap class and used one OR in a script like shared OR. May be in future, I will post related articles which will show use of OR as Local OR along with Page Object.

This is all for now.
Cheers!!

Tuesday, 21 June 2016

Block Push Notification on Chrome in Selenium Webdriver


Many of you might already know that Chrome browser supports push notification  almost on all platforms from version 42  and many sites including Facebook and Google+ have already started delivering push notification for end users. So when it comes to automating such sites/apps first thing that you notice is browser asking permission to deliver push notification.


Block Push Notification on Chrome in Selenium Webdriver
Facebook asking for permission to show push notification

Problem Statement:-


As you can observe in above image that it would be impossible to perform immediate next action in browser after login as it’s been blacked-out. Chrome driver will wait for sometime (implicit wait) and then try to perform next step in browser, whatever it may be, it will fail and if you missed the step in execution which might cause failure of next step and result would be failed test/test suite.

Also push notification badges are not getting displayed as part of web document, so clicking on those button displayed is not possible through selenium.



Workaround:-

    Simple thing to do, is find body element of page [which exist for all the pages :-) ], and perform double click on it. But as mentioned, it would be just workaround.



Better Approach:-

    What you would have done if you have to do same thing again and again manually in this case? Consider testing ten different app and login scenarios for them. Any sane person would have searched for how to do the same manually.
Manually disable/block Push Notification in Chrome
Manually disable/block Push Notification in Chrome



Whatever you would have done manually, would it be possible to set this up while invoking chromedriver instance? Yes, This is where chromedriver Capabilities and ChromeOptions comes into the picture.
Almost for each user customizable setting there is ChromeOption available. You can check all options here. Now to prevent or block push notifications on Chrome we can use disable-notifications option.

This is all for now.
Cheers!!

Friday, 17 June 2016

Selenium as a Windows Service

I have been playing with selenium grid from past few days and it becomes very tedious to me to setup the grid by firing commands in command prompt [I am mostly windows 7 user]. So I thought of running selenium grid as service and for that I have used NSSM - the Non-Sucking Service Manager.

To set up grid as service, obviously you need-
  1. Selenium-server-standalone-2.53.0.jar file (should work with other version but I have used this)

Selenium Grid Hub setup:-

    You need to have following files in folder ready to use before you start with this setup. My folder setup is like-

    To set up hub, we use following command in the command prompt.

java -jar selenium-server-standalone-2.53.0.jar -role hub


Check whether grid hub is up and running as shown in below image-


Now if you accidentally close your command prompt running, your hub will go down which used happen a lot to me as I was not very keen user of command prompt. By setting up this as service, anyone can get rid of orphan looking command prompt. Now close the command prompt and start with actaul setup of service.

Set up same selenium grid hub as service

NSSM



Detail use of every tab in NSSM is mentioned here. Verify that proper entries are made in the registry for same.


You can monitor SeleniumHub service running now in Services.


Here is your selenium grid hub working as service.


On Grid adding chrome-driver node -



java -jar selenium-server-standalone-2.53.0.jar -role node -hub http://192.168.0.174:4444/grid/register/ -browser browserName="chrome",version=ANY,platform=WINDOWS,maxInstances=1 -Dwebdriver.chrome.driver=C:\Grid\chromedriver.exe  

Execute above command in command prompt. You need to use your hub IP instead of 192.168.0.174 which is IP of my hub. 


Observe your selenium grid console now, you can see one chrome node is added over there.


Set up same chrome node as service:-

Close the previously running chrome node in command prompt. I’m passing below command as parameter while creating new service as ‘ChromeNode’ -
-jar selenium-server-standalone-2.53.0.jar -role node -hub http://192.168.0.174:4444/grid/register/ -browser browserName="chrome",version=ANY,platform=WINDOWS,maxInstances=1 -Dwebdriver.chrome.driver=C:\Grid\chromedriver.exe




 You need to use your hub IP instead of 192.168.0.174 which is IP of my hub. 




Verify that proper entries are made in the registry for same.


You can monitor ChromeNode service running now in Services.



Here is your whole selenium grid setup running as service.



This is all for now in selenium testing tools
Cheers!!

Sunday, 12 June 2016

MongoDBClient for Java Application

Singleton MongoDBClient for Java Application

Reason to recommend not to close MongoDB driver connection:-

The MongoDB Java driver provides a MongoClient class for the connection of your Java application with the MongoDB database.

           The mongodb java client maintains (example below) a connection pool, which is relatively expensive to set up [even in faster network it takes 100 of milliseconds, apart from that each driver connection would run in separate thread and it will consume memory], so one should reuse the MongoClient instance across the lifetime.
            A Connection Pool is a cache of database connections maintained by the driver so that connections can be reused when new connections to the database are required. To reduce the number of connection pools created by your application, it is recommend to call MongoClient.connect once.

So it becomes obvious to create one instance of the MongoClient and to reuse it in every request of your application and not to close it.

MongoDBServices wrapper class:-

  1. I have used singleton design pattern in java by using enum.
  2. I kept separate properties file which has parameters to connect with MongoDB server.
  3. Declaration and Initialization of MongoClient.
  4. Use method for database operation.

Singleton pattern in Java by using enum


Parameters to connect with MongoDB server

Parameters to connect with MongoDB server
Properties file holding details for connection.

Declaration and Initialization of MongoClient

Declaration and Initialization of MongoClient
Declaration and Initialization of MongoClient

Use method for database operation

Database operation using singleton method
Database operation using singleton method


Resources:-

http://stackoverflow.com/questions/70689/what-is-an-efficient-way-to-implement-a-singleton-pattern-in-java

http://stackoverflow.com/questions/26914320/closing-mongodb-java-connection

Sunday, 5 June 2016

Page Object Model


           Once you start with automation, a word you will constantly get bombarded with is  ‘Framework' which is a very generic term.  Wiki defines a Test  Automation Framework as an integrated system that sets the rules of automation of a specific product. This system integrates the function libraries, test data sources, object details and various reusable modules. The article has also listed various approaches for designing test automation framework, sadly people categorize them as automation frameworks without understanding that it is just approach to design test automation. Approach of automation framework that one should choose/take must be depends upon the need of AUT.
          Similarly, many folks misunderstood or I am not sure why they call Page Object as framework. It is NOTa framework, it is a Design Pattern which has many advantages. Though there are many resources available on internet on how to implement page object model, very few of them mentions below rules.

Basic rules for getting the desired maintainability of your test code :-
1.      Page objects themselves should never make verifications or assertions. This is part of your test and should always be within the test’s code, never in an page object. The page object will contain the representation of the page, and the services the page provides via methods but no code related to what is being tested should be within the page object.
2.      There is one, single, verification which can, and should, be within the page object and that is to verify that the page, and possibly critical elements on the page, were loaded correctly. This verification should be done while instantiating the page object.
3.      A page object does not necessarily need to represent an entire page. The Page Object design pattern could be used to represent components on a page. If a page in the AUT has multiple components, it may improve maintainability if there is a separate page object for each component.
4.      If you have WebDriver APIs in your test methods, You're Doing It Wrong. [This is what point 1 is all about. ] -- Simon Stewart.


Ref:- http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-design-pattern



Saturday, 9 January 2016

Copyrights held by Amol Chavan. Powered by Blogger.