Extensibility- Add New Find Locators
Learn how to extend BELLATRIX adding new custom find locators.
Introduction
Imagine that you want to create a new locator for finding all elements with an ID starting with a specific value. First, you need to create a new ‘FindStrategy’ class.
Example
public class FindIdStartingWithStrategy : FindStrategy { public FindIdStartingWithStrategy(string value) : base(value) { } public override By Convert() { return By.CssSelector($"[id^='{Value}']"); } }
In the Convert method, we use a standard WebDriver By locator, and in this case we implement our requirements through a little CSS.
To ease the usage of the locator, we need to create an extension methods for ComponentCreateService and Component classes.
public static class ComponentCreateExtensions { public static ComponentsList<TComponent> CreateAllByIdStartingWith<TComponent>(this Element element, string idEnding) where TComponent : Component => new ComponentsList<TComponent>(new FindIdStartingWithStrategy(idEnding), component.WrappedElement); }
public static class ComponentRepositoryExtensions { public static TComponent CreateByIdStartingWith<TComponent>(this ComponentCreateService repository, string idPrefix, bool shouldCache = false) where TComponent : Component => repository.Create<TComponent, FindIdStartingWithStrategy>(new FindIdStartingWithStrategy(idPrefix), shouldCache); public static ComponentsList<TComponent> CreateAllByIdStartingWith<TComponent>(this ComponentCreateService repository, string idPrefix) where TComponent : Component => new ComponentsList<TComponent>(new FindIdStartingWithStrategy(idPrefix), null); }
Usage
using Bellatrix.Web.GettingStarted.ExtensionMethodsLocators; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Bellatrix.Web.GettingStarted { [TestFixture] public class NewFindLocatorsTests : WebTest { [Test] public void PromotionsPageOpened_When_PromotionsButtonClicked() { App.Navigation.Navigate("http://demos.bellatrix.solutions/"); var promotionsLink = App.Components.CreateByIdStartingWith<Anchor>("promo"); promotionsLink.Click(); } } }
You need to add a using statement to the namespace where the extension methods for new locator are situated.
using Bellatrix.Web.GettingStarted.ExtensionMethodsLocators;
After that, you can use the new locator as it was originally part of BELLATRIX.
var promotionsLink = App.Components.CreateByIdStartingWith<Anchor>("promo");