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");