Extensibility- Add New Element Wait Methods
Learn how to extend BELLATRIX adding new element wait methods.
Introduction
Imagine that you want to wait for an element to have a specific content. First, you need to create a new ‘WaitStrategy’ class that inheriting the WaitStrategy class.
Example
public class WaitHaveSpecificContentStrategy<TDriver, TDriverElement> : WaitStrategy<TDriver, TDriverElement> where TDriver : IOSDriver<TDriverElement> where TDriverElement : AppiumWebElement { private readonly string _elementContent; public WaitHaveSpecificContentStrategy(string elementContent, int? timeoutInterval = null, int? sleepInterval = null) : base(timeoutInterval, sleepInterval) { _elementContent = elementContent; TimeoutInterval = timeoutInterval ?? Bellatrix.ConfigurationService.GetSection<MobileSettings>().ElementToHaveContentTimeout; } public override void WaitUntil<TBy>(TBy by) => WaitUntil(ElementHasSpecificContent(WrappedWebDriver, by), TimeoutInterval, SleepInterval); private Func<TDriver, bool> ElementHasSpecificContent<TBy>(TDriver searchContext, TBy by) where TBy : FindStrategy<TDriver, TDriverElement> { return driver => { try { var element = by.FindElement(searchContext); return component.Text == _elementContent; } catch (NoSuchElementException) { return false; } catch (InvalidOperationException) { return false; } }; } }
After UntilHaveSpecificContent is created, it is important to be passed on to the element’s EnsureState method.
Usage
using Bellatrix.Mobile.IOS.GettingStarted.ExtensionMethodsWaitMethods; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Bellatrix.Mobile.IOS.GettingStarted { [TestFixture] [IOS(Constants.IOSNativeAppPath, Constants.IOSDefaultVersion, Constants.IOSDefaultDeviceName, Lifecycle.RestartEveryTime)] public class AddNewElementWaitMethodsTests : IOSTest { [Test] [Ignore] public void MessageChanged_When_ButtonHovered_Wpf() { var button = App.Components.CreateByName<Button>("ComputeSumButton").ToHaveSpecificContent("button"); button.Click(); } } }
You need to add a using statement to the namespace where the new wait extension methods are situated.
using Bellatrix.Mobile.IOS.GettingStarted.ExtensionMethodsWaitMethods;
After that, you can use the new wait method as it was originally part of BELLATRIX.
var button = App.Components.CreateByName<Button>("ComputeSumButton").ToHaveSpecificContent("button");