Skip to content

Repository files navigation

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*/publicclassBingSearchModuleextendsCustomWebElement {
/* Use default Selenium WebElements or other custom WebElements */@FindBy(id = "sb_form_q")
privateWebTextFieldsearchField;
@FindBy(id = "sb_form_go")
privateWebButtonsearchButton;
/* The constructor. */publicBingSearchModule(WebDriverwebDriver, Byby) {
super(webDriver, by);
}
/* Operations on the page */publicvoidsearch(StringsearchText) {
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.

publicclassBingPage {
@FindBy(id = "b_results")
privateBingResultListModuleresultListModule;
publicvoidopenSearchResult(intsearchResultNumber) {
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);".

publicclassTest{
publicvoidbingExampleTest() {
BingPagebingPage = newBingPage();
WebDriverwebDriver = newChromeDriver();
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 elementsPageFactory.initElements(newCustomElementFieldDecorator(webDriver, webDriver), bingPage);
// Do the search and open result stuffbingPage.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:

About

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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - tekvision/java_selenium_custom_elements: 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. · GitHub
Skip to content

Repository files navigation

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*/publicclassBingSearchModuleextendsCustomWebElement {
/* Use default Selenium WebElements or other custom WebElements */@FindBy(id = "sb_form_q")
privateWebTextFieldsearchField;
@FindBy(id = "sb_form_go")
privateWebButtonsearchButton;
/* The constructor. */publicBingSearchModule(WebDriverwebDriver, Byby) {
super(webDriver, by);
}
/* Operations on the page */publicvoidsearch(StringsearchText) {
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.

publicclassBingPage {
@FindBy(id = "b_results")
privateBingResultListModuleresultListModule;
publicvoidopenSearchResult(intsearchResultNumber) {
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);".

publicclassTest{
publicvoidbingExampleTest() {
BingPagebingPage = newBingPage();
WebDriverwebDriver = newChromeDriver();
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 elementsPageFactory.initElements(newCustomElementFieldDecorator(webDriver, webDriver), bingPage);
// Do the search and open result stuffbingPage.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:

About

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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tekvision/java_selenium_custom_elements: 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. · GitHub
Skip to content

Repository files navigation

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*/publicclassBingSearchModuleextendsCustomWebElement {
/* Use default Selenium WebElements or other custom WebElements */@FindBy(id = "sb_form_q")
privateWebTextFieldsearchField;
@FindBy(id = "sb_form_go")
privateWebButtonsearchButton;
/* The constructor. */publicBingSearchModule(WebDriverwebDriver, Byby) {
super(webDriver, by);
}
/* Operations on the page */publicvoidsearch(StringsearchText) {
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.

publicclassBingPage {
@FindBy(id = "b_results")
privateBingResultListModuleresultListModule;
publicvoidopenSearchResult(intsearchResultNumber) {
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);".

publicclassTest{
publicvoidbingExampleTest() {
BingPagebingPage = newBingPage();
WebDriverwebDriver = newChromeDriver();
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 elementsPageFactory.initElements(newCustomElementFieldDecorator(webDriver, webDriver), bingPage);
// Do the search and open result stuffbingPage.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:

About

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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tekvision/java_selenium_custom_elements: 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. · GitHub
Skip to content

Repository files navigation

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*/publicclassBingSearchModuleextendsCustomWebElement {
/* Use default Selenium WebElements or other custom WebElements */@FindBy(id = "sb_form_q")
privateWebTextFieldsearchField;
@FindBy(id = "sb_form_go")
privateWebButtonsearchButton;
/* The constructor. */publicBingSearchModule(WebDriverwebDriver, Byby) {
super(webDriver, by);
}
/* Operations on the page */publicvoidsearch(StringsearchText) {
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.

publicclassBingPage {
@FindBy(id = "b_results")
privateBingResultListModuleresultListModule;
publicvoidopenSearchResult(intsearchResultNumber) {
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);".

publicclassTest{
publicvoidbingExampleTest() {
BingPagebingPage = newBingPage();
WebDriverwebDriver = newChromeDriver();
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 elementsPageFactory.initElements(newCustomElementFieldDecorator(webDriver, webDriver), bingPage);
// Do the search and open result stuffbingPage.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:

About

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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - tekvision/java_selenium_custom_elements: 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. · GitHub
Skip to content

Repository files navigation

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*/publicclassBingSearchModuleextendsCustomWebElement {
/* Use default Selenium WebElements or other custom WebElements */@FindBy(id = "sb_form_q")
privateWebTextFieldsearchField;
@FindBy(id = "sb_form_go")
privateWebButtonsearchButton;
/* The constructor. */publicBingSearchModule(WebDriverwebDriver, Byby) {
super(webDriver, by);
}
/* Operations on the page */publicvoidsearch(StringsearchText) {
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.

publicclassBingPage {
@FindBy(id = "b_results")
privateBingResultListModuleresultListModule;
publicvoidopenSearchResult(intsearchResultNumber) {
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);".

publicclassTest{
publicvoidbingExampleTest() {
BingPagebingPage = newBingPage();
WebDriverwebDriver = newChromeDriver();
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 elementsPageFactory.initElements(newCustomElementFieldDecorator(webDriver, webDriver), bingPage);
// Do the search and open result stuffbingPage.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:

About

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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - tekvision/java_selenium_custom_elements: 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. · GitHub
Skip to content

Repository files navigation

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*/publicclassBingSearchModuleextendsCustomWebElement {
/* Use default Selenium WebElements or other custom WebElements */@FindBy(id = "sb_form_q")
privateWebTextFieldsearchField;
@FindBy(id = "sb_form_go")
privateWebButtonsearchButton;
/* The constructor. */publicBingSearchModule(WebDriverwebDriver, Byby) {
super(webDriver, by);
}
/* Operations on the page */publicvoidsearch(StringsearchText) {
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.

publicclassBingPage {
@FindBy(id = "b_results")
privateBingResultListModuleresultListModule;
publicvoidopenSearchResult(intsearchResultNumber) {
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);".

publicclassTest{
publicvoidbingExampleTest() {
BingPagebingPage = newBingPage();
WebDriverwebDriver = newChromeDriver();
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 elementsPageFactory.initElements(newCustomElementFieldDecorator(webDriver, webDriver), bingPage);
// Do the search and open result stuffbingPage.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:

About

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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - tekvision/java_selenium_custom_elements: 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. · GitHub
Skip to content

Repository files navigation

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*/publicclassBingSearchModuleextendsCustomWebElement {
/* Use default Selenium WebElements or other custom WebElements */@FindBy(id = "sb_form_q")
privateWebTextFieldsearchField;
@FindBy(id = "sb_form_go")
privateWebButtonsearchButton;
/* The constructor. */publicBingSearchModule(WebDriverwebDriver, Byby) {
super(webDriver, by);
}
/* Operations on the page */publicvoidsearch(StringsearchText) {
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.

publicclassBingPage {
@FindBy(id = "b_results")
privateBingResultListModuleresultListModule;
publicvoidopenSearchResult(intsearchResultNumber) {
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);".

publicclassTest{
publicvoidbingExampleTest() {
BingPagebingPage = newBingPage();
WebDriverwebDriver = newChromeDriver();
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 elementsPageFactory.initElements(newCustomElementFieldDecorator(webDriver, webDriver), bingPage);
// Do the search and open result stuffbingPage.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:

About

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.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages