Tuesday, 22 October 2019

setup proxy for seetest devices


package sample.Seetest;
import io.appium.java_client.ios.IOSDriver;
import io.appium.java_client.ios.IOSElement;
import io.appium.java_client.remote.MobileBrowserType;
import org.testng.annotations.*;
import org.openqa.selenium.By;
import org.openqa.selenium.Cookie;
import org.openqa.selenium.Keys;
import org.openqa.selenium.ScreenOrientation;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.Iterator;
import java.util.Set;

public class LocaliOSTest {

    private String accessKey = "eyJ4cC51Ijo3NTgzMzczLCJ4cC5wIjo3NTgzMzcyLCJ4cC5tIjoiTVRVM01UYzFNakEyTkRJd05BIiwiYWxnIjoiSFMyNTYifQ.eyJleHAiOjE4ODcxMTIwOTAsImlzcyI6ImNvbS5leHBlcml0ZXN0In0.R47MeNXeUeRGukUeRnBMQxiwjjgwVl-XYhv2PlMrrZ0";
    protected IOSDriver<IOSElement> driver = null;
    DesiredCapabilities dc = new DesiredCapabilities();

    @BeforeTest
    public void setUp() throws MalformedURLException {
        dc.setCapability("testName", "SHIVA Quick Start iOS Browser Demo ");
        dc.setCapability("accessKey", accessKey);
        dc.setCapability("deviceQuery", "@os='ios' and @category='PHONE'");
        dc.setBrowserName(MobileBrowserType.SAFARI);
        dc.setCapability("cleanSession","true"); 
        dc.setCapability("ensureCleanSession","true");

        
        driver = new IOSDriver<>(new URL("https://cloud.seetest.io/wd/hub"), dc);
       
        
    }

    @Test
    public void quickStartiOSBrowserDemo() {
    
     
     driver.get("https://www.autozone.com/");
     
    Set<Cookie> cookies = driver.manage().getCookies();
    
        System.out.println("Cookies size "+cookies.size());

    
    Iterator<Cookie> itr = cookies.iterator();

    while (itr.hasNext()){
    Cookie c = itr.next();
        System.out.println("Cookies name "+c.getName());
        driver.manage().deleteCookie(c);
        System.out.println("Deleted Cookies name "+c.getName());

    }
    
        driver.rotate(ScreenOrientation.PORTRAIT);
       
       // new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='siteLogo']")));
        //driver.findElement(By.xpath("//*[@id='siteLogo']")).click();
        //new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(By.xpath("(//*[@value='Log In'])[1]")));

  

    }

    @AfterTest
    public void tearDown() {
        System.out.println("Report URL: "+ driver.getCapabilities().getCapability("reportUrl"));
        driver.quit();
    }
}

Monday, 4 April 2016

Appium Sample Run Code

package com.sample;
import java.io.File;


import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.android.AndroidDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.Test;

@Test
public class AppiumExampleTest {
WebDriver driver ;
public  void aSa() throws MalformedURLException{

    File appDir = new File("/Users/siva/git");
    File app = new File(appDir, "Sample.apk");

    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("BROWSER_NAME","Android");
    capabilities.setCapability("VERSION","Android");
    capabilities.setCapability("device","Android");

 
    //mandatory capabilities
    capabilities.setCapability("deviceName","Android");
    capabilities.setCapability("platformName","Android");
capabilities.setCapability("appPackage", "com.****.***");
    capabilities.setCapability("appActivity", "com.jhonsoned.aqua.login.viewcontroller.LoginActivity");



    //other caps
    capabilities.setCapability("app", app.getAbsolutePath());
     driver =  new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
 

 
}
}


Note :

AppActivty and appPackge will come automatically once u have chosen path in Appium server




Tuesday, 16 February 2016

To verify whether file is downloaded or not in selenium webdriver

package com.sample;

import java.io.File;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class FileDownloadVerify {

private WebDriver driver;

private static String downloadPath = "D:\\siva";
private String URL="http://all-free-download.com/free-photos/download/in_love_cosmos_flower_garden_220378.html";

@BeforeClass
public void testSetup() throws Exception{
driver = new FirefoxDriver(firefoxProfile());
driver.manage().window().maximize();
}

@Test
public void example_VerifyExpectedFileName() throws Exception {
driver.get(URL);
   driver.findElement(By.xpath(".//*[@id='detail_content']/div[2]/a")).click();
 
   Thread.sleep(10000);
   File getLatestFile = getLatestFilefromDir(downloadPath);
   String fileName = getLatestFile.getName();
   Assert.assertTrue(fileName.equals("in_love_cosmos_flower_garden_220378.zip"), "Downloaded file name is not matching with expected file name");
}


@AfterClass
public void tearDown() {
driver.quit();
}
public static FirefoxProfile firefoxProfile() throws Exception {

FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.setPreference("browser.download.folderList",2);
firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false);
firefoxProfile.setPreference("browser.download.dir",downloadPath);
firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/zip");

return firefoxProfile;
}
public boolean isFileDownloaded(String downloadPath, String fileName) {
boolean flag = false;
    File dir = new File(downloadPath);
    File[] dir_contents = dir.listFiles();
   
    for (int i = 0; i < dir_contents.length; i++) {
        if (dir_contents[i].getName().equals(fileName))
            return flag=true;
            }

    return flag;
}

private boolean isFileDownloaded_Ext(String dirPath, String ext){
boolean flag=false;
    File dir = new File(dirPath);
    File[] files = dir.listFiles();
    if (files == null || files.length == 0) {
        flag = false;
    }
   
    for (int i = 1; i < files.length; i++) {
    if(files[i].getName().contains(ext)) {
    flag=true;
    }
    }
    return flag;
}

private File getLatestFilefromDir(String dirPath){
    File dir = new File(dirPath);
    File[] files = dir.listFiles();
    if (files == null || files.length == 0) {
        return null;
    }

    File lastModifiedFile = files[0];
    for (int i = 1; i < files.length; i++) {
       if (lastModifiedFile.lastModified() < files[i].lastModified()) {
           lastModifiedFile = files[i];
       }
    }
    return lastModifiedFile;
}
}

Sunday, 18 May 2014

Zoom in/out page content selenium webdriver

WebElement Sel= driver.findElement(By.tagName("html"));
sel.sendKeys(Keys.chord(Keys.CONTROL, Keys.ADD));
reset the zoom back to 100%:
html.sel(Keys.chord(Keys.CONTROL, "0"));

Friday, 21 March 2014

Random

WebDriver driver=new FirefoxDriver();
driver.get("http://www.donebynone.com/?gclid=CLXXyPaikb0CFedV4godlE0Azw");
driver.manage().window().maximize();

Random randomGenerator = new Random();
java.util.List<WebElement> ll=driver.findElements(By.xpath("html/body/header/div[4]/div[1]/nav/section/ul/li"));
int la=ll.size();
System.out.println(la);
int ran1=randomGenerator.nextInt(la)+1;

System.out.println("ran1..."+ran1);
java.util.List<WebElement> l=driver.findElements(By.xpath("html/body/header/div[4]/div[1]/nav/section/ul/li[1]/ul/li[2]"));
int a=l.size();


System.out.println("szeTwo"+la);
System.out.println("szeOne"+a);

int ran2=randomGenerator.nextInt(a)+3;

System.out.println("ran2..."+ran2);
WebElement web=driver.findElement(By.xpath("html/body/header/div[4]/div[1]/nav/section/ul/li["+ran1+"]/ul/li["+ran2+"]/a"));
// WebElement web=driver.findElement(By.xpath("html/body/header/div[4]/div[1]/nav/section/ul/li[5]/ul/li[4]/a"));
WebElement web1=driver.findElement(By.xpath("html/body/header/div[4]/div[1]/nav/section/ul/li[1]"));
//WebElement web=driver.findElement(By.xpath("html/body/header/div[4]/div[1]/nav/section/ul/li[5]/ul/li[4]/a"));
Actions act=new Actions(driver);
act.moveToElement(web1).build().perform();
Thread.sleep(5000);
web.click();
System.out.println("over");

Monday, 17 February 2014

Reading and writing data from Excel using Selenium Web driver

This code will work for reading data from excel sheet :

import java.io.IOException;
import org.testng.annotations.Test;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
@Test
public class Xlsheet {
public void asd() throws IOException, BiffException, Throwable{
Workbook workbook = Workbook.getWorkbook(new File ("FilePath"));
System.out.println(workbook);
Sheet sheet = workbook.getSheet("Sheet1");
System.out.println(sheet.getRows());

String s = sheet.getCell(1,1).getContents();
System.out.println(s);
}
}
This code will work for Writing data into excel sheet :

package sample;
import java.io.FileOutputStream;
import org.testng.annotations.Test;
import jxl.Workbook;
import jxl.write.WritableWorkbook;
import jxl.write.WritableSheet;
import jxl.write.Label;
@Test
public class ExcelWrite {
public void aa() throws Throwable{

//Creating an excel and naming it. 

FileOutputStream exlFileName= new FileOutputStream("Filepath");

//Creating an instance for the above excel.

WritableWorkbook exlWorkBook = Workbook.createWorkbook(exlFileName);

//Creating Writable work sheets for the above excel.

WritableSheet exlWorkSheet1 = exlWorkBook.createSheet("Shivaprsad",0);
WritableSheet exlWorkSheet2 = exlWorkBook.createSheet("Suresh",1);

//Creating data(cell values) into above excel workbook

Label Sheet1cellContent = new Label(0,0,"Test sheet1");
Label Sheet2cellContent = new Label(0,0,"Test sheet2");

//Adding cell value to its respective sheet.

exlWorkSheet1.addCell(Sheet1cellContent);
exlWorkSheet2.addCell(Sheet2cellContent);

//Writing the values into excel.

exlWorkBook.write();

//Close the workbook

exlWorkBook.close();
}
}
   
        

Monday, 27 January 2014

Verification points in Selenium ...

1.    To check Element Present:
if(driver.findElements(By.xpath("value")).size() != 0){
System.out.println("Element is Present");
}else{
System.out.println("Element is Absent");
}
Or
if(driver.findElement(By.xpath("value"))!= null){
System.out.println("Element is Present");
}else{
System.out.println("Element is Absent");
}
2.    To check Visible:
if( driver.findElement(By.cssSelector("a > font")).isDisplayed()){
System.out.println("Element is Visible");
}else{
System.out.println("Element is InVisible");
}
3.    To check Enable:
if( driver.findElement(By.cssSelector("a > font")).isEnabled()){
System.out.println("Element is Enable");
}else{
System.out.println("Element is Disabled");
}
4.    To check text present:
if(driver.getPageSource().contains("Text to check")){
System.out.println("Text is present");
}else{
System.out.println("Text is absent")


Thursday, 2 January 2014

Select methods in selenium Webdriver...

Select Methods
The following are the most common methods used on drop-down elements.

selectByVisibleText() :
deselectByVisibleText():

Selects/deselects the option that displays the text matching the parameter.
Parameter: The exactly displayed text of a particular option

selectByValue()
deselectByValue()

Selects/deselects the option whose “value” attribute matches the specified parameter.
Parameter: value of the “value” attribute remember that not all drop-down options have the same text and “value”, like in the example below.

selectByIndex()
deselectByValue()


Selects/deselects the option at the given index.
Parameter: the index of the option to be selected


isMultiple()

Returns TRUE if the drop-down element allows multiple selections at a time; FALSE if otherwise.
Needs parameters needed

deselectAll ():


Clears all selected entries. This is only valid when the drop-down element supports multiple selections.

No parameters needed

Navigate commands in Selenium Webdriver...


Navigate commands:
 These commands allow you to refresh go-into and switch back and forth between different webpages.

navigate ().to() :        It automatically opens a new browser window and fetches the
                                 page that  you specify inside its parentheses.

                                It does exactly the same thing as the get() method.

navigate().refresh() : It refreshes the current page


navigate().back():       Takes you back by one page on the browser’s history.

navigate().forward():  Takes you forward by one page on the browser’s history.

Tuesday, 26 November 2013

How can I read background-color of an element in selenium Webdriver?



driver.get("http://www.google.co.in/");
String color = driver.findElement(By.name("btnK")).getCssValue("background-color");
   
System.out.println("The background color of Google search button"+color);

Wednesday, 6 November 2013

How to find child elements in Selenium Web driver




When same object is getting duplicated for N number of parent, then user can refer parent and child relationship to identify the object in browser.

WebElement bodyElement = driver.findElement(By.id("body"));
WebElement bodyElement1 = bodyElement.findElement(By.id("body"));
System.out.println(bodyElement1.findElement(By.id("TotalScore")).getText());

User want to read all child elements of div(parent) container by using following methods.

WebElement bodyElement = driver.findElement(By.id("body"));   
List divElements = bodyElement.findElements(By.className("div"));
for(WebElement childDiv : divElements){
 List fieldSetEle = childDiv.findElements(By.tagName("fieldset"));
 System.out.println(childDiv.getTagName()+":"+fieldSetEle.size());
    }  

How to Identify popup window in Selenium Webdriver....




1. First Check whether its popup window or IFrame window by using IE Developer or Find bug tools.

2. If its popup window then use following code :

driver.findElement(By.xpath("")).click();

Set s=driver.getWindowHandles();

This method will help to handle of opened windows other than parent 



Iterator ite=s.iterator();

while(ite.hasNext())

{

String popupHandle=ite.next().toString();

if(!popupHandle.contains(mwh))

{

driver.switchTo().window(popupHandle);

/**/here you can perform operation in pop-up window**

//After finished your operation in pop-up just select the main window again

driver.switchTo().window(mwh);

}

}

This method will help to filter out of all opened windows


1) String parentWindowHandle = browser.getWindowHandle(); // save the current window handle.

WebDriver popup = null;

Iterator windowIterator = browser.getWindowHandles();

while(windowIterator.hasNext()) { 

String windowHandle = windowIterator.next(); 

popup = browser.switchTo().window(windowHandle);

if (popup.getTitle().equals("Google") {

break;

}

}

2) Uncomment code for the same popup,

//action in popup "Google". 

popup.findElement(By.name("q")).sendKeys("Thoughtworks");

//action in popup "Google". 

popup.findElement(By.name("btnG")).submit();"


3) After the popup actions, switch the driver back to the parent window,


browser.close(); // close the popup.

browser.switchTo().window(parentWindowHandle); // Switch back to parent window.
If its IFrame then use following line.

String parentWindowHandle = driver.getWindowHandle(); 

driver.switchTo().Frame(driver.findelement(by.id("iframeid")));
// perform ur actions.
//revert back to parent control

driver.switchTo().window(parentWindowHandle);

Thursday, 1 August 2013

Grid with SeleniumWebdriver


import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;

import org.junit.AfterClass;
 import org.openqa.selenium.*;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.ie.InternetExplorerDriver;
 import org.openqa.selenium.remote.DesiredCapabilities;
 import org.openqa.selenium.remote.RemoteWebDriver;
 import org.testng.annotations.*;

public class GridWithWebdriver {

 public WebDriver driver;

 @Parameters({"browser"})
 @BeforeClass
 public void setup(String browser) throws MalformedURLException {

 DesiredCapabilities capability=null;
 //setting Chrome driver location
 System.setProperty("webdriver.chrome.driver",System.getProperty("user.dir")+"\\lib\\chromedriver.exe");
if(browser.equalsIgnoreCase("firefox")){
 System.out.println("firefox");
 capability= DesiredCapabilities.firefox();
 capability.setBrowserName("firefox");
capability.setPlatform(org.openqa.selenium.Platform.ANY);
 //capability.setVersion("");
 }

 if(browser.equalsIgnoreCase("chrome")){
 System.out.println("chrome");
 capability= DesiredCapabilities.chrome();
 capability.setBrowserName("chrome");
capability.setPlatform(org.openqa.selenium.Platform.WINDOWS);
 //capability.setVersion("");
 }

 driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
 driver.manage().window().maximize();
 driver.navigate().to("http://google.com");

 }

 @Test
 public void test_first() throws InterruptedException{
 Thread.sleep(3000);
 WebElement search_editbox = driver.findElement(By.name("q"));
 WebElement search_button = driver.findElement(By.name("btnG"));
 search_editbox.clear();
 search_editbox.sendKeys("first");
 search_button.click();
 driver.navigate().to("http://yahoo.com");
 String MYURL=driver.getCurrentUrl();
 System.out.println(MYURL);
 Thread.sleep(3000);
 }

 @Test
 public void test_second() throws InterruptedException{
 driver.navigate().to("http://CNN.com");
 String MYA=driver.getCurrentUrl();
 System.out.println(MYA);
 Thread.sleep(3000);
 driver.navigate().to("http://google.com");
 WebElement search_editbox=driver.findElement(By.name("q"));
 WebElement search_button=driver.findElement(By.name("btnG"));
 search_editbox.clear();
 search_editbox.sendKeys("second");
 search_button.click();
 }

 @AfterClass
 public void tearDown(){
 driver.close();
 }
 }
 //-Then started the selenium grid as per the below.

java -jar selenium-server-standalone-2.32.0.jar -role hub
 java -jar selenium-server-standalone-2.32.0.jar -role webdriver -hub http://localhost:4444/grid/register -browser browserName=firefox,platform=WINDOWS
 java -jar selenium-server-standalone-2.32.0.jar -role webdriver -hub http://localhost:4444/grid/register -browser browserName=chrome,platform=WINDOWS -port 5556

//My testng.XML file as per the below.

<suite name="Same TestCases on Different Browser" verbose="3" parallel="tests" thread-count="2">
<test name="Run on Mozilla Firefox">
 <parameter name="browser" value="firefox"/>
 <classes>
 <class name="GridWithWebdriver"/>
 </classes>
 <test name="Run on goolge Chrome">
 <parameter name="browser" value="chrome"/>
 <classes>
 <class name="GridWithWebdriver"/>
 </classes>
 </test>
</test>
</suite>


When i ran the XML file as testng suite below error occurred.Hope any one may able to help.



Friday, 26 July 2013

Upload Files in Selenium Webdriver

Please go through below code ......


package Sample;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
public class uploadfile {
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("http://www.files.com/");
driver.manage().window().maximize();
WebElement uploadElement = driver.findElement(By.xpath(".//*[@id='uploadFields']/input"));
//WebElement uploadElement = driver.findElement(By.id("uploadfile_0"));
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
uploadElement.sendKeys("C:\\Users\\shivap\\Desktop\\24-1374658179-13.jpg");
driver.close();

}
}

Happy Testing 

Sauce Labs With Selenium Webdriver



Overview

Ø  Sauce on Demand is a cloud-based service that allows you to run 
automated cross- browser functional tests at high speeds in parallel, 
so you   don’t need to maintain testing infrastructure.

Ø  Easy-to-use tools let you build both manual and automated tests 
that produce media-rich results, including screen shots and videos 
of bugs that can be added to any bug tracking system.

Ø  Sauce Support 65+browser and OS combination.

Ø  Operating Systems like Windows, Linux, Mac,

Ø  Browsers like Internet Explorer, Chrome, Firefox, Safari, Opera,
 I Phone, IPod, Android.

Ø  All latest browsers versions are available.

Ø  It has commercial support for selenium.

SAUCE CONNECT

Ø  Sauce Connect securely proxies browser traffic between Sauce 
Labscloud-based 
VMs and your local servers. Connect uses ports 443 and 80for communication
 with Sauces cloud.

Ø  Sauce Connect helps to do HTML Layout Testing.

Ø  This can be used by both Front End designers and Testers for performing manual compatibility testing.

Configure Sauce Connect

Ø   First we need to register in https://saucelabs.com/ website.

Ø  Download Sauce Connect.jar file from the Sauce labs site.

Ø  Run the Jar as below 
java -jar Sauce-Connect.jar YOUR-SAUCE-USERNAME(sivaprasadk) 
YOUR- SAUCE-API-KEY(d75aaba0-ed9c-4ec8-aa35-17c5ed17b402)

Ø  Login to the Sauce Labs web site using valid user credentials.( Here I have given my        credentials mentioned in previous point)

Ø  Select “New Interactive Session”
Ø  Browse the url`s (we can use the localhost url`s as well).

Screenshot of configured sauce Connect:

 Example Script for Sauce:

package sample;
import java.net.URL;
import org.openqa.selenium.By;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.Test;

public class Test2 {
private WebDriver driver;
@Test

public void setUp() throws Exception {
  DesiredCapabilities capabilities = DesiredCapabilities.firefox();
  capabilities.setCapability("version", "5");
  capabilities.setCapability("platform", Platform.windows);

  this.driver = new RemoteWebDriver(new URL
("http://sivaprasadk:d75aaba0-ed9c-4ec8-aa35-17c5ed17b402@ondemand.saucelabs.com:80/wd/hub"),
                capabilities);
    }

   
@Test
    public void Login_Paytm() throws Exception {
   
driver.get("https://www.paytm.com/");
driver.findElement(By.cssSelector("span")).click();
driver.findElement(By.id("username")).clear();
driver.findElement(By.id("username")).sendKeys("9880070959");
driver.findElement(By.id("password")).clear();
driver.findElement(By.id("password")).sendKeys("password");
driver.findElement(By.id("Proceed")).click();
driver.findElement(By.id("opns")).click();
driver.findElement(By.id("loggedout")).click();
driver.quit();
}}

 Integration of Web driver and Sauce Services Sauce support Web 
driver scripts and can compatible with multiple programming languages 
like Java, Python, NodeJs, Perl. Here,

We are using java language for Integration and Functional Test Automation 
    (Selenium2 with java bindings).

Steps to Follow:

Ø    A Java File is written, which will take browsers Name, OS and browser 
    version as run time arguments.

Ø   The Script reads the inputs and invokes the Sauce browser with the given
    OS and browser combination in Sauce Cloud.

Ø   On invoking the Selenium functional script the tests will get executed in
    the Sauce Cloud.

Ø   Here we used HtmlTestRunner(unit test module for python) for maintaining
    test suite.

Ø   The test results can be captured from Sauce or from Html Test Report 
    (which will be generated using HtmlTestRunner).

 Dashboard – Sauce

    Like below we can find the results after completing test scripts.



Features of Sauce Cloud:

·       Developer Tools in Every Browser
·       Selenium RC & WebDriver Compatible
·       Video Recordings of Every Test
·       Test Local and Firewalled Servers
·       Any Programming Language
·       Browsers and Mobile Emulators

Advantages:

·       Easy to Integrate with Continuous Integration and Selenium2 test scripts.
·       Able to run the Parallel functional tests, which helps to optimize the 
    test execution Time.
·       Supports multiple browsers and OS combination including mobile browsers.
·       By using this approach, we can perform Functional, Layout, Compatibility 
    testing.
·       Sauce, in built support of Video recording and Screenshot capturing is very
    helpful and good.
·       Availability of updated Browsers and Versions.
·       Secure Tunnel system.

Dis Advantages:

·       Issues with Corporate Proxy environment.
·       As this tool works over cloud script runs very slowly.

References:

    http://saucelabs.com/features