Tuesday, October 25, 2016

Opening url in new Window?


How to open a new window with a new URL while browser automation session is ongoing?


Have you encountered situation where you are automating a website and same time you need to open other browser window to do something like read OTP or read E-Mail and come back to the AUT window and proceed automation...

I am sure If you are working in web automation testing you might have encountered this.

What solution we have ?
  1. Launch a new WebDriver instance while one is having AUT loaded.
    • For example below code :
      // Initial WebDriver instance to perform Automation Testing on AUT
      // (if Selenium 3.0 then set webdriver.gecko.driver path)
      WebDriver driver = new FirefoxDriver();
      driver.get("http://myAUT.com");
      // TODO: perform some automation stuff
      // ....
      // Now I want to open gmail in new window without disturbing
      // myAUT.com site
      // So launch a new WebDriver instance 
      WebDriver gmailBrowser = new FirefoxDriver();
      gmailBrowser.get("http://www.gmail.com");
      // Perform operations like read mail data here
      // String otp = gmailDriver.findElement(By.xpath("some locator"))
      // .getText(); 
      // Now close browser and go back to myAUT.com
      gmailBrowser.close();
      // now type otp in myAUT.com
      driver.findElement(By.id("some id")).sendKeys(otp);
      

    • But is this really good approach? NO!!! absolutely not! 
    • Because it's more confusing to work on two webdriver instance at a time.
    • Both WebDriver instance do not share common session with server.
  2. Launch a new url in new tab of existing WebDriver session
    • Why to start a new WebDriver instance when you do use already existing one?
    • This will also share existing session with server
    • Approach: - 
      • Execute a JavaScript code it will open a new url in new tab/window but in existing WebDriver instance
      • Switch driver to point newly opened driver and do some task
      • Once you are done close newly opened tab/window and switch back to AUT browser window
    • Below is the sample script
      WebDriver driver = new FirefoxDriver();
      WebDriver driver = new FirefoxDriver();
      driver.get("http://google.com");
      // copy current window handle for future reference
      String autWindowHandle = driver.getWindowHandle();
      JavascriptExecutor executor = (JavascriptExecutor) driver;
      executor.executeScript("window.open('http://www.gmail.com','_blank')");
      
      // Switch driver to gmail and do your work
      for (String handle : driver.getWindowHandles()) {
       driver.switchTo().window(handle);
      }
      // do operations and read data.
      // String otp = driver.findElement(By.id("some id")).getText();
      
      //Now close gmail and switch back to AUT site
      driver.close();
      driver.switchTo().window(autWindowHandle);
      //Continue automation testing
      
I hope this will be useful to solve your problem.

Saturday, October 22, 2016

Handling unexpected poupus and alerts while automation with selenium webdriver



Hi All,
Today I just thought it’s been a long time I wrote my last blog and I should post another one. Meantime on what’s app group one of my friend asked question on how to deal with the unexpected popup message while automation was going on. I am sure most of the automation testers are still facing the same issue and trying to figure out a solution to this problem. 

QTP gives a very nice feature to handle such a conditions with the help of “recovery scenario manager” features which works on different triggers like popup dialogue. But when it comes to WebDriver automation on one hand we get freedom to choose whichever framework / methodology but on other we don’t get any built in features like “Recovery Manager Scenario” instead we have to code it.

So here I am going to post a solution with the code example on handling unexpected poupus / dialog boxes or alert messages encountered during webdriver automation.
  
The first thing first “Unexpected popups / dialogue boxes or alert messages are not really UNEXPECTED”. The popup messages like survey or feedback are expected to get displayed in application but one cannot predict when it will be displayed in application. It doesn’t make sense to have a if….else.. condition after every webdriver action.

I propose 2 solutions to this problem

Approach 1: Using a very simple approach
This solution is only applicable for framework which is not built on Page object model. If your framework is having Page Object model pattern please go with approach #2.

Do not allow the driver to freely flowing all over the project, Use encapsulation and abstraction to keep driver in one class and write dependent methods in same class. As this framework approach do not allow driver to get freely accessible anywhere in the project except this class.

Simple example is as ->





Use the Object of this WebDrivreFace class to perform all operations on driver. Don’t allow driver access outside of this class and always use getElement() & isDisplayed () methods before doing any direct operations on element.

Sample code to use this type of framework example –

WebDriverFace face = new WebDriverFace(); // initialize driver in constructor
face.openUrl(“http://samplewebsite.com”);
face.click( By.linkText(“sign in”) );
face.type( By.id(“userid”), “username@domain.com”);
face.type( By.id(“password”), “myAW3somep@55word”);

If there is any popup / dialog displayed matching with our text or locator the it will closed. J

Approach 2: using Page Object model
                If your framework is using Page Object model to initialize page Objects then use below technique.

                Have a common generic method to initialize all page class objects from your class. Make sure after every time you create a object you call a method which will check and handle popups.

High level code will look like this ->

Class Page is base class for all other pages class with below method ->

 class Page{
                public void handlePopupsAndAlerts(){
                                // use loop and check if any popup locator is displayed
                                // if displayed then write a code close it here.
                }
public static T getPageObject(WebDriver drver, Class clazz) {
                               
                                T pageObject = (T)PageFactory.initElements(driver, clazz);
                                pageObject. handlePopupsAndAlerts();
                                return pageObject;
                }
}
 
How to use this code to create page object?

LoginPage loginPage = Page. getPageObject(driver,LoginPage.class);
loginPage.performLogin();
 
So in above example as soon as the new page is loaded in browser we should create object as mentioned above. While initializing every page object it will execute handlePopupsAndAlerts() method to find and handle all types of popups and alerts.