This repository has been archived on 2022-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
DevOpsOpenHack/MobileApps/MyDriving/MyDriving.UITests/Pages/BasePage.cs

125 lines
3.5 KiB
C#
Raw Permalink Normal View History

2022-11-03 20:41:13 +00:00
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
using System;
using NUnit.Framework;
using Xamarin.UITest;
using Xamarin.UITest.Queries;
using Xamarin.UITest.Android;
using Xamarin.UITest.iOS;
using Query = System.Func<Xamarin.UITest.Queries.AppQuery, Xamarin.UITest.Queries.AppQuery>;
using System.Linq;
namespace MyDriving.UITests
{
public class BasePage
{
protected readonly IApp App;
protected readonly bool OnAndroid;
protected readonly bool OniOS;
protected Func<AppQuery, AppQuery> Trait;
protected BasePage()
{
App = AppInitializer.App;
OnAndroid = App.GetType() == typeof(AndroidApp);
OniOS = App.GetType() == typeof(iOSApp);
InitializeCommonQueries();
}
protected BasePage(Func<AppQuery, AppQuery> androidTrait, Func<AppQuery, AppQuery> iOSTrait)
: this()
{
if (OnAndroid)
Trait = androidTrait;
if (OniOS)
Trait = iOSTrait;
AssertOnPage(TimeSpan.FromSeconds(30));
App.Screenshot("On " + this.GetType().Name);
}
protected BasePage(string androidTrait, string iOSTrait)
: this(x => x.Marked(androidTrait), x => x.Marked(iOSTrait))
{
}
/// <summary>
/// Verifies that the trait is still present. Defaults to no wait.
/// </summary>
/// <param name="timeout">Time to wait before the assertion fails</param>
public void AssertOnPage(TimeSpan? timeout = default(TimeSpan?))
{
if (Trait == null)
throw new NullReferenceException("Trait not set");
var message = "Unable to verify on page: " + this.GetType().Name;
if (timeout == null)
Assert.IsNotEmpty(App.Query(Trait), message);
else
Assert.DoesNotThrow(() => App.WaitForElement(Trait, timeout: timeout), message);
}
/// <summary>
/// Verifies that the trait is no longer present. Defaults to a two second wait.
/// </summary>
/// <param name="timeout">Time to wait before the assertion fails</param>
protected void WaitForPageToLeave(TimeSpan? timeout = default(TimeSpan?))
{
if (Trait == null)
throw new NullReferenceException("Trait not set");
timeout = timeout ?? TimeSpan.FromSeconds(2);
var message = "Unable to verify *not* on page: " + this.GetType().Name;
Assert.DoesNotThrow(() => App.WaitForNoElement(Trait, timeout: timeout), message);
}
public void NavigateTo(string tabName)
{
if (OnAndroid)
{
if (App.Query(_hamburger).Any())
App.Tap(_hamburger);
App.Screenshot("Navigation Menu Open");
int count = 0;
while (!App.Query(tabName).Any() && count < 3)
{
App.ScrollDown(x => x.Class("NavigationMenuView"));
count++;
}
}
App.Tap(_tab(tabName));
}
#region CommonPageActions
// Use this region to define functionality that is common across many or all pages in your app.
// Eg tapping the back button of a page or selecting the tabs of a tab bar
Query _hamburger;
Func<string, Query> _tab;
void InitializeCommonQueries()
{
if (OnAndroid)
{
_hamburger = x => x.Marked("Navigate up");
_tab = name => x => x.Id("design_menu_item_text").Text(name);
}
if (OniOS)
{
_tab = name => x => x.Class("UITabBarButtonLabel").Text(name);
}
}
#endregion
}
}