Giter Club home page Giter Club logo

uchagani / java_selenium_custom_elements Goto Github PK

View Code? Open in Web Editor NEW

This project forked from tekvision/java_selenium_custom_elements

0.0 1.0 0.0 7.89 MB

The Selenium custom WebElements offer an additional abstraction layer around the Selenium WebElement class when using the page factory. It is possible to create simple custom elements from dropdown menus up to complex modules like radio button groups or tables.

License: MIT License

Java 100.00%

java_selenium_custom_elements's Introduction

Java Selenium Custom WebElements

The Selenium custom WebElements offer an additional abstraction layer around the Selenium WebElement class when using the page factory. It is possible to create simple custom elements from dropdown menus up to complex modules like radio button groups or tables. Each custom element can contain other custom WebElements or Selenium WebElements. This allows you to encapsulate functionality on how to interact with elements on a website in on place and still have an easy way to use the WebElements.

The project consists of the actual source code, which enables the usage of custom WebElements, some simple custom WebElements, an example on how to use it and a gradle file, which can be used to import the code as an project into any gradle supporting IDE (IntelliJ, Eclipse, ...).

Usage

The custom WebElement code is located in the "src/test/java/webelement" folder. Simply copy the content to your own project and use it however you like. This chapter will cover the basic usage/extension of the custom WebElements. For this, a shortened version of the example code (see chapter "Example") is being used.

1: (Optional) Create a custom WebElement

Create a custom WebElement by subclassing the "CustomWebElement" class. All subclasses of "CustomWebElement" can be used with the PageFactory.

/* Subclass from CustomWebElement to create your own custom WebElement*/

public class BingSearchModule extends CustomWebElement {

    /* Use default Selenium WebElements or other custom WebElements */
    
    @FindBy(id = "sb_form_q")
    private WebTextField searchField;
    
    @FindBy(id = "sb_form_go")
    private WebButton searchButton;

    /*  The constructor. */
    
    public BingSearchModule(WebDriver webDriver, By by) {
        super(webDriver, by);
    }

    /* Operations on the page */
    
    public void search(String searchText) {
        searchField.setText(searchText);
        searchButton.click();
    }
}

2: Use a custom WebElement

The custom WebElements can be used the same as the default Selenium WebElements by using the "@FindBy" annotation.

public class BingPage {

    @FindBy(id = "b_results")
    private BingResultListModule resultListModule;

    public void openSearchResult(int searchResultNumber) {
        resultListModule.openSearchResult(searchResultNumber);
    }
}

3: Use the PageFactory

Use the PageFactory on a class which contains @FindBy annotated custom WebElements like this: "PageFactory.initElements(new CustomElementFieldDecorator(WebDriverObject, WebDriverObject), PageObject);".

public class Test{
    public void bingExampleTest() {
        BingPage bingPage = new BingPage();
        WebDriver webDriver = new ChromeDriver();
        
        webDriver.get("https://www.bing.com/");
    
        // Uses the Selenium page factory in order to initialize the Bing page object
        // The CustomElementFieldDecorator statement is needed for the usage of the custom elements
        PageFactory.initElements(new CustomElementFieldDecorator(webDriver, webDriver), bingPage);
        // Do the search and open result stuff
        bingPage.search("Test");
        bingPage.openSearchResult(0);
    }
}

Structure of the custom WebElements

  1. The "customElementsDecorator" package: This is where the magic happens. The code is quite complex but hopefully good enough commented to understand what happens there. There are usually no code changes necessary in this package.
  2. The "modules" package: Contains one helper class, e.g. for getting the used locator from an already existing WebElement.
  3. The "customElements" package. It consists of
    1. the "superElements" package: This package contains the super class from which all other custom WebElements are subclassed.
    2. the "concreteElements" package: Contains some basic custom WebElements like
      1. WebButton: A simple button.
      2. WebLink: A simple link.
      3. WebCheckbox: A simple checkbox.
      4. WebLabel: A simple label.
      5. WebPageElement: Equivalent to the default Selenium WebElement. Use this if other elements do not match.

Dependencies

In order to use this feature you have to add the following dependencies to your project:

  1. Selenium server (tested with version 3.3.1)

The version of the dependencies should not influence this projects behaviour. Look up the gradle file to see the gradle dependencies declarations.

Example

The example demonstrates the usage of custom WebElements by doing a search via Bing and opening the first search result. The project can be found in the "test" source folder in the "example" package. It consists of the following packages:

  1. "exampleElements": Two example custom WebElements representing the Bing search form and the Bing result list. They are subclasses from the "CustomWebElement" class.
    1. "BingSearchModule" uses some default custom WebElements in order to form a more complex custom WebElement.
    2. "BingResultListModule" uses the "getBy()" method in order to access the element locator, which is passed from the "BingPage" webpage object, and uses it to interact with the website.
  2. "pages": Contains a a page object representing the Bing page, which uses the custom WebElements from 1.
  3. "tests": Contains the test class. Execute the example via this class. The PageFactory is used in this class.

Sources

The following sources were used as basis to create this project:

java_selenium_custom_elements's People

Contributors

sidnc86 avatar madhav4466 avatar julhorn avatar gauravahir28 avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.