OneStopTesting - Quality Testing Jobs, eBooks, Articles, FAQs, Training Institutes, Testing Software, Testing downloads, testing news, testing tools, learn testing, manual testing, automated testing, load runner, winrunner, test director, silk test, STLC

Forum| Contact Us| Testimonials| Sitemap| Employee Referrals| News| Articles| Feedback| Enquiry
 
Testing Resources
 
  • Testing Articles
  • Testing Books
  • Testing Certification
  • Testing FAQs
  • Testing Downloads
  • Testing Interview Questions
  • Career In Software Testing
  • Testing Jobs
  • Testing Job Consultants
  • Testing News
  • Testing Training Institutes
  •  
    Fundamentals
     
  • Introduction
  • Designing Test Cases
  • Developing Test Cases
  • Writing Test Cases
  • Test Case Templates
  • Purpose
  • What Is a Good Test Case?
  • Test Specifications
  • UML
  • Scenario Testing
  • Test Script
  • Test Summary Report
  • Test Data
  • Defect Tracking
  •  
    Software testing
     
  • Testing Forum
  • Introduction
  • Testing Start Process
  • Testing Stop Process
  • Testing Strategy
  • Risk Analysis
  • Software Listings
  • Test Metrics
  • Release Life Cycle
  • Interoperability Testing
  • Extreme Programming
  • Cyclomatic Complexity
  • Equivalence Partitioning
  • Error Guessing
  • Boundary Value Analysis
  • Traceability Matrix
  •  
    SDLC Models
     
  • Introduction
  • Waterfall Model
  • Iterative Model
  • V-Model
  • Spiral Model
  • Big Bang Model
  • RAD Model
  • Prototyping Model
  •  
    Software Testing Types
     
  • Static Testing
  • Dynamic Testing
  • Blackbox Testing
  • Whitebox Testing
  • Unit Testing
  • Requirements Testing
  • Regression Testing
  • Error Handling Testing
  • Manual support Testing
  • Intersystem Testing
  • Control Testing
  • Parallel Testing
  • Volume Testing
  • Stress Testing
  • Performance Testing
  • Agile Testing
  • Localization Testing
  • Globalization Testing
  • Internationalization Testing
  •  
    Test Plan
     
  • Introduction
  • Test Plan Development
  • Test Plan Template
  • Regional Differences
  • Criticism
  • Hardware Development
  • IEEE 829-1998
  • Testing Without a TestPlan
  •  
    Code Coverage
     
  • Introduction
  • Measures
  • Working
  • Statement Coverage
  • Branch Coverage
  • Path Coverage
  • Coverage criteria
  • Code coverage in practice
  • Tools
  • Features
  •  
    Quality Management
     
  • Introduction
  • Components
  • Capability Maturity Model
  • CMMI
  • Six Sigma
  •  
    Project Management
     
  • Introduction
  • PM Activities
  • Project Control Variables
  • PM Methodology
  • PM Phases
  • PM Templates
  • Agile PM
  •  
    Automated Testing Tools
     
  • Quick Test Professional
  • WinRunner
  • LoadRunner
  • Test Director
  • Silk Test
  • Test Partner
  • Rational Robot
  •  
    Performance Testing Tools
     
  • Apache JMeter
  • Rational Performance Tester
  • LoadRunner
  • NeoLoad
  • WAPT
  • WebLOAD
  • Loadster
  • OpenSTA
  • LoadUI
  • Appvance
  • Loadstorm
  • LoadImpact
  • QEngine
  • Httperf
  • CloudTest
  •  
    Languages
     
  • Perl Testing
  • Python Testing
  • JUnit Testing
  • Unix Shell Scripting
  •  
    Automation Framework
     
  • Introduction
  • Keyword-driven Testing
  • Data-driven Testing
  •  
    Configuration Management
     
  • History
  • What is CM?
  • Meaning of CM
  • Graphically Representation
  • Traditional CM
  • CM Activities
  • Tools
  •  
    Articles
     
  • What Is Software Testing?
  • Effective Defect Reports
  • Software Security
  • Tracking Defects
  • Bug Report
  • Web Testing
  • Exploratory Testing
  • Good Test Case
  • Write a Test
  • Code Coverage
  • WinRunner vs. QuickTest
  • Web Testing Tools
  • Automated Testing
  • Testing Estimation Process
  • Quality Assurance
  • The Interview Guide
  • Upgrade Path Testing
  • Priority and Severity of Bug
  • Three Questions About Bug
  •    
     
    Home » Testing Articles » Automated Testing Articles » Selenium Best Practices

    Selenium Best Practices

    A D V E R T I S E M E N T


    Use PageObjects pattern  Be fluent with     - return this, varargs, generics,     - reuse your model and jodatime  Be robust and portable     - Prefered selector order : id > name > css > xpath     - Avoid Thread.sleep prefer Wait or FluentWait    - Use relative URLs    - Don't rely on specific Driver implementation    - Create your dataset  Know your new tool    - Keep up to date (versions and usage pattern)    - Troubleshooting         - jre 1.6        - IE (zoom, Protected mode setting )        - Firefox/firebug startpage    - How to deal with UI components like... fileupload, datepicker, ajaxtables,...    - Detect when selenium isn't the good tool for the job    - Don't be afraid to hack around selenium

    Use PageObjects pattern

    Page Object is a Design Pattern which has become popular in test automation for enhancing test maintenance and reducing code duplication. A page object is an object-oriented class that serves as an interface to a page of your Application Under Test. The tests then use the methods of this page object class whenever they need to interact with that page of the UI. The benefit is that if the UI changes for the page, the tests themselves don't need to change, only the code within the page object needs to change. Subsequently all changes to support that new UI are located in one place.

    The Page Object Design Pattern provides the following advantages :

    • There is a clean separation between test code and page specific code such as locators (or their use if you're using a UI map) and layout.
    • There is  a single repository for the services or operations offered by the page rather than having these services scattered through out the tests.

    For example you have a LoginPage that you can reuse in all your integration test.
    if the logon has now a new option or the layout changed a bit� adapt the LoginPage� that's it !

    More on page object : page-objects-in-selenium-2-, PageObjectFactory, simple example based on google search page

    Be fluent !

    With return this

    It makes often your tests more readable if your "void" methods return "this".

    1
    2
    3
    4
    5
    6
    public class CampaignCreatePage extends AbstractPage {
        ...
     public CampaignCreatePage withCampaignName(String campaignName) {
         name.sendKeys(campaignName);
         return this;
     }

    So you can chain the calls like :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Test
    public void shouldntSaveWithoutAnyErrors() throws Exception {
        CampaignCreatePage createPage = openCampaignCreatePage();
        createPage.hasNumberOfErrors(4);
        createPage.withCampaignName("SELENIUM").save();
        createPage.hasNumberOfErrors(3);
        createPage.withAgent("firefox").save();
        createPage.hasNumberOfErrors(2);
        createPage.withAssignee("tom").save();
        createPage.hasNumberOfErrors(1);
    }

    With varargs

    You can also use varargs to make the api cleaner

    1
    2
    3
    4
    public CampaignCreatePage withCampaignTargetsIds(long... targets) {
        targetsIds.sendKeys(StringUtils.join(target,","));
        return this;
        }

    In the test this give us something like

    1
    2
    3
    4
    5
    6
    @Test
    public void shouldntSaveTargetUnknownIds() throws Exception {
        CampaignCreatePage createPage = openCampaignCreatePage();
        createPage.withCampaignName("SELENIUM").withAgent("firefox").withAssignee("tom").withProduct(0).withCampaignTargetsIds(1, 2, 3, 4);
        createPage.save().hasNumberOfErrors(1);
    }

    With generics

    If you have a component that don't have access to your pageObject. For example, a generic menu where plugins can contribute links to their own pages.
    you can use this trick :

    1
    2
    3
    4
    public  T clickOnMenu(String path, Class pageClassToProxy) {
        clickOnMenu(path);
        return PageFactory.initElements(getDriver(), pageClassToProxy);
    }

     

    1
    2
    3
    4
    5
    6
    7
    8
       @Test
       public void testBrodocWithoutMemberOrProspectIdentified() {
           processLogon();
           MemberIdentificationPage page = openMemberIdentificationPage();
           page = page.getMenuElement().clickOnMenu(LuceneSearchPage.URL, LuceneSearchPage.class);
           page.hasInfoMessage();
           page.withNameFilter("mestachs").search().getResults().hasResults()
    }

    By reusing your model and joda

    For example the CampaignSearchPage can reuse the SearchCampaignParameter

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
         public CampaignSearchPage searchFor(SearchCampaignParameter parameter) {
            clearForm();
            selectRadio("campaignTargetType", parameter.getPersonType());
            sendString(campaignName, parameter.getCampaignName());
            sendDate(creationDateFrom, parameter.getCreationDateFrom());
            sendDate(creationDateTo, parameter.getCreationDateTo());
            sendDate(campaignDateFrom, parameter.getCampaignDateFrom());
            sendDate(campaignDateTo, parameter.getCampaignDateTo());
            findCampaigns.click();
        }
    ...

    Be robust and portable

    Preferred selector order : id > name > css > xpath

    To locate an element we can use

    • the element's ID
    • the element's name attribute
    • an XPath statement
    • by a links text
    • document object model (DOM)

    In practice, you will discover

    • id and name are often the easiest and sure way.
    • xpath are often brittle. for example you have 3 tables displayed but sometimes there are no data and the table isn't rendered, your xpath locating the second table will not always return the intented one.
    • css are the way to go in conjunction of id and name !
    • locating links in an internationalized application is sometimes hard� try to use partial href.

    various selectors articles : why-jquery-in-selenium-css-locators-is-the-way-to-go, css selector demystified, jquery selectors

    Avoid Thread.sleep prefer Wait or FluentWait

    Instead of sleep

    1
    2
    3
    4
    public void clickOnContactType() {
        getDriver().findElement(By.id("contacttypelink")).click();
        sleep(500);
    }

    Prefer this fluentWait

    1
    2
    3
    4
    public void clickOnContactType() {
        getDriver().findElement(By.id("contacttypelink")).click();
        SeleniumUtil.fluentWait(By.name("handle"), getDriver());
    }

    It's more robust, deterministic, in case of element not found� the exception will be clearer.

    Another alternative is

    1
    2
    3
    4
    (new WebDriverWait(driver, 30)).until(new ExpectedCondition() {
                    public Boolean apply(WebDriver d) {
                        return d.getTitle().toLowerCase().startsWith("java developer");
                    }

    More on this http://www.thoughtworks-studios.com/twist-agile-test-automation/2.3/help/how_do_i_handle_ajax_in_selenium2.html

    Use relative URLs

    Avoid hardcoding hosts

    1
    2
    3
    WikiMainPage page = PageFactory.initElements(getDriver(), WikiMainPage.class);
    page.search("sdfsdf");

    Prefer configuration and pass relative urls like

    1
    openPartialUrl("/");

    That use an abstract method

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    protected void openPartialUrl(String partialurl) {
        getDriver().get(getUrlPrefix() + partialurl + "?siteLanguage=" + this.settings.getLanguage());
    }
    private static String getPrefix() {
        return StringUtils.replace(System.getProperty("selenium.website.url", HTTP_PREFIX), "@localhost@", getCanonicalHostName());
    }
    private static String getCanonicalHostName() {
        try {
            return java.net.InetAddress.getLocalHost().getCanonicalHostName();
        } catch (Exception e) {
            return "127.0.0.1";
        }
    }

    It is easy then to launch these tests against another server (integration,acceptance,� or jetty in integration tests)

    Don't rely on specific Driver implementation

    Don't assume that driver will be an instance of FireFoxDriver or InternetExplorerDriver. For example when running the integration tests on your continuous build (linux) you will receive a RemoteDriver.

    It's quite easy to create a small framework around selenium using :

    • LabelledParameterized : to be able to run with different browsers IE,FF,� or with different user language fr/nl/en
    • ScreenShotWatchMan : that takes screenshot on exception and logs the html sources. (see ./target/screenshot/*.png)

    Create your dataset

    Avoid something like assuming that the data is always there.

    1
    2
    3
    4
    CampaignConsultPage consult = openCampaignConsultPage(2132103215L);
    CampaignEditPage edit = consult.goToEditPage();
    consult = edit.save();
    consult.hasInfoMessage();

    Create a new campaign and check consult

    1
    2
    3
    4
    5
    6
    7
    8
    9
    CampaignCreatePage createPage = openCampaignCreatePage();
    createPage.withCampaignName("SELENIUM" + new DateTime()).withAgent("tom").withAssignee("tom").withProduct(0);
    createPage.save().hasNumberOfErrors(0);
    createPage.hasInfoMessage();
    Long campaignId = createPage.getCampaignId();
    CampaignConsultPage consult = openCampaignConsultPage(campaignId);
    CampaignEditPage edit = consult.goToEditPage();
    consult = edit.save();
    consult.hasInfoMessage();

    Know your new tool

    Keep up to date

    Keep your binaries and knowledge up to date !
    This official blog contains announcements and also some a lot of links to possible application of selenium
    StackOverflow forums are really good to learn from other mistakes. The official Sauce Labs Blog is also really interesting for their real life experiences.

    Use jre 1.6

    If while starting your integration tests you encounter :

    java.lang.NoSuchFieldError: HOURS  at org.openqa.selenium.remote.internal.HttpClientFactory.(HttpClientFactory.java:44)

    or

    java.lang.NoSuchFieldError: java/util/concurrent/TimeUnit.HOURS

    Run your test with a jre 1.6

    How to close Firebug startpage

    FirefoxProfile profile = new FirefoxProfile();  profile.setPreference("extensions.firebug.currentVersion", "1.8.2");  driver = new FirefoxDriver(profile);

    note that you may need to adapt the version.

    IE not working

    check

    • The browser zoom level must be set to 100% so that the native mouse events can be set to the correct coordinates.
    • On IE 7 or higher on Windows Vista or Windows 7, you must set the Protected Mode settings for each zone to be the same value. The value can be on or off, as long as it is the same for every zone. To set the Protected Mode settings, choose "Internet Options�" from the Tools menu, and click on the Security tab. For each zone, there will be a check box at the bottom of the tab labeled "Enable Protected Mode".

    Possible workaround for Protected Mode

    1
    2
    3
    4
    DesiredCapabilities ieCapabilities = DesiredCapabilities.internetExplorer();
    ieCapabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
    ieCapabilities.setCapability("ensureCleanSession", true);
    driver = new InternetExplorerDriver(ieCapabilities);

    How to deal with ui elements like

    File upload

    Selenium Tips: Uploading Files in Remote WebDriver

    Single and multi select

    One option

    1
    2
    3
    4
    5
    6
    7
    public class AbstractPage {
    ...
       protected void selectRadio(String name, String code) {
        WebElement select = this.webDriver.findElement(By.xpath("//input[@value='" + code+ "'and @name='" + name + "' ]"));
        select.click();
       }
    ...

    Maybe a better option is using org.openqa.selenium.support.ui.Select

    1
    2
    3
    4
    5
    6
    7
    8
    Select singleSelection = new Select(getDriver().findElement(By.id("single-selection")));
    singleSelection.selectByVisibleText("July");
    Select mulitpleSelection = new Select(getDriver().findElement(By.xpath("//select[@multiple='multiple' and @size=12]")));
    mulitpleSelection.deselectAll();
    // Select February, August and November using different functions.
    mulitpleSelection.selectByIndex(1); // February
    mulitpleSelection.selectByValue("Aug"); // Select ...
    mulitpleSelection.selectByVisibleText("November"); // Select November

    DatePicker

    1
    2
    3
    4
    public class CampaignSearchPage extends AbstractPage {
      ...
        sendDate(creationDateFrom, parameter.getCreationDateFrom());
      ...

    sendDate is defined in AbstractPage

    1
    2
    3
    4
    5
    protected void sendDate(WebElement e, DateMidnight dm) {
     if (dm != null) {
         sendString(e, dm.toString("dd/MM/YYYY"));
     }
    }

    AjaxTableElement

    If you use table elemenst with paging, sorting,� you can perhaps create a component AjaxTableElement
    add in pageObject :

    1
    2
    3
    4
    5
    6
    public class CampaignSearchPage extends AbstractPage {
              ....
             public AjaxTableElement getTableResult() {
            return new AjaxTableElement(getDriver(),"results");
        }
    }

    Then you can use the AjaxTableElement

    1
    2
    3
    page.searchFor(param);
    page.getTableResult().hasResult();
    page.getTableResult().clickOnResult(1);

    Detect when selenium isn't the good tool for the job

    Selenium can't deal with OS level dialogs so first avoid them as much as possible�
    For eg don't try to download a pdf through selenium and open acrobat reader.
    You may be tempted to use tool like : autoit or sikuli (his java api) but you will loose portability and may be they will only offer you a false sense of quality.

    Don't be afraid to hack around selenium

    A lot of people are using it but also trying new stuff like :
    - collecting performance statistics.
    - creating a full acceptance framework
    - implementing a new webdriver



    More Automated Testing Articles



    discussionDiscussion Center
    Discuss
    Discuss

    Query

    Feedback
    Yahoo Groups
    Y! Group
    Sirfdosti Groups
    Sirfdosti
    Contact Us
    Contact

    Looking for Software Testing eBooks and Interview Questions? Join now and get it FREE!
     
    A D V E R T I S E M E N T
       
       

    Members Login


    Email ID:
    Password:


    Forgot Password
    New User
       
       
    Testing Interview Questions
  • General Testing
  • Automation Testing
  • Manual Testing
  • Software Development Life Cycle
  • Software Testing Life Cycle
  • Testing Models
  • Automated Testing Tools
  • Silk Test
  • Win Runner
  •    
       
    Testing Highlights

  • Software Testing Ebooks
  • Testing Jobs
  • Testing Frequently Asked Questions
  • Testing News
  • Testing Interview Questions
  • Testing Jobs
  • Testing Companies
  • Testing Job Consultants
  • ISTQB Certification Questions
  •    
       
    Interview Questions

  • WinRunner
  • LoadRunner
  • SilkTest
  • TestDirector
  • General Testing Questions
  •    
       
    Resources

  • Testing Forum
  • Downloads
  • E-Books
  • Testing Jobs
  • Testing Interview Questions
  • Testing Tools Questions
  • Testing Jobs
  • A-Z Knowledge
  •    
    Planning
    for
    Study ABROAD ?


    Study Abroad


    Vyom Network : Free SMS, GRE, GMAT, MBA | Online Exams | Freshers Jobs | Software Downloads | Programming & Source Codes | Free eBooks | Job Interview Questions | Free Tutorials | Jokes, Songs, Fun | Free Classifieds | Free Recipes | Bangalore Info | GATE Preparation | MBA Preparation | Free SAP Training
    Privacy Policy | Terms and Conditions
    Sitemap | Sitemap (XML)
    Job Interview Questions | Placement Papers | SMS Jokes | C++ Interview Questions | C Interview Questions | Web Hosting
    German | French | Portugese | Italian