Skip to content

Commit

Permalink
click monitor test and add FindByAccessibilityId function
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhaopeng Wang committed Mar 4, 2025
1 parent ff51440 commit b96bcf1
Showing 5 changed files with 79 additions and 3 deletions.
13 changes: 13 additions & 0 deletions src/common/UITestAutomation/FindHelper.cs
Original file line number Diff line number Diff line change
@@ -17,6 +17,19 @@ namespace Microsoft.PowerToys.UITest
/// </summary>
internal static class FindHelper
{
public static ReadOnlyCollection<T>? FindAll<T, TW>(Func<IReadOnlyCollection<TW>> findElementsFunc, WindowsDriver<WindowsElement>? driver, int timeoutMS)
where T : Element, new()
{
var items = findElementsFunc();
var res = items.Select(item =>
{
var element = item as WindowsElement;
return NewElement<T>(element, driver, timeoutMS);
}).Where(item => item.IsMatchingTarget()).ToList();

return new ReadOnlyCollection<T>(res);
}

public static ReadOnlyCollection<T>? FindAll<T, TW>(Func<ReadOnlyCollection<TW>> findElementsFunc, WindowsDriver<WindowsElement>? driver, int timeoutMS)
where T : Element, new()
{
43 changes: 43 additions & 0 deletions src/common/UITestAutomation/Session.cs
Original file line number Diff line number Diff line change
@@ -62,6 +62,26 @@ public T Find<T>(string name, int timeoutMS = 3000)
return this.Find<T>(By.Name(name), timeoutMS);
}

/// <summary>
/// Shortcut for this.FindAllByAccessibilityId<T>(accessibilityId, timeoutMS)
/// </summary>
/// <typeparam name="T">The class of the element, should be Element or its derived class.</typeparam>
/// <param name="accessibilityId">The accessibilityId of the element.</param>
/// <param name="timeoutMS">The timeout in milliseconds (default is 3000).</param>
/// <returns>The found element.</returns>
public T FindByAccessibilityId<T>(string accessibilityId, int timeoutMS = 3000)
where T : Element, new()
{
Assert.IsNotNull(this.WindowsDriver, $"WindowsElement is null in method Find<{typeof(T).Name}> with parameters: accessibilityId = {accessibilityId}, timeoutMS = {timeoutMS}");

// leverage findAll to filter out mismatched elements
var collection = this.FindAllByAccessibilityId<T>(accessibilityId, timeoutMS);

Assert.IsTrue(collection.Count > 0, $"Element not found using selector: {accessibilityId}");

return collection[0];
}

/// <summary>
/// Shortcut for this.Find<Element>(by, timeoutMS)
/// </summary>
@@ -107,6 +127,29 @@ public ReadOnlyCollection<T> FindAll<T>(By by, int timeoutMS = 3000)
return foundElements ?? new ReadOnlyCollection<T>([]);
}

/// <summary>
/// Finds all elements by accessibilityId.
/// </summary>
/// <typeparam name="T">The class of the elements, should be Element or its derived class.</typeparam>
/// <param name="accessibilityId">The accessibilityId to find the elements.</param>
/// <param name="timeoutMS">The timeout in milliseconds (default is 3000).</param>
/// <returns>A read-only collection of the found elements.</returns>
public ReadOnlyCollection<T> FindAllByAccessibilityId<T>(string accessibilityId, int timeoutMS = 3000)
where T : Element, new()
{
Assert.IsNotNull(this.WindowsDriver, $"WindowsElement is null in method FindAll<{typeof(T).Name}> with parameters: accessibilityId = {accessibilityId}, timeoutMS = {timeoutMS}");
var foundElements = FindHelper.FindAll<T, WindowsElement>(
() =>
{
var elements = this.WindowsDriver.FindElementsByAccessibilityId(accessibilityId);
return elements;
},
this.WindowsDriver,
timeoutMS);

return foundElements ?? new ReadOnlyCollection<T>([]);
}

/// <summary>
/// Finds all elements by selector.
/// Shortcut for this.FindAll<T>(By.Name(name), timeoutMS)
Original file line number Diff line number Diff line change
@@ -10,15 +10,34 @@
using Microsoft.PowerToys.UITest;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Windows.UI;
using static Microsoft.ApplicationInsights.MetricDimensionNames.TelemetryContext;

namespace UITests_FancyZonesEditor
{
[TestClass]
public class DefaultLayoutsTest
public class DefaultLayoutsTest : UITestBase
{
public DefaultLayoutsTest()
: base(PowerToysModule.FancyZone)
{
FancyZonesEditorHelper.InitFancyZonesLayout();
// FancyZonesEditorHelper.InitFancyZonesLayout();
}

[TestMethod]
public void ClickMonitor()
{
Assert.IsNotNull(Session.FindByAccessibilityId<Element>("Monitors").Find<Element>("Monitor 1"));
Assert.IsNotNull(Session.FindByAccessibilityId<Element>("Monitors").Find<Element>("Monitor 2"));

// verify that the monitor 1 is selected initially
Assert.IsTrue(Session.FindByAccessibilityId<Element>("Monitors").Find<Element>("Monitor 1").Selected);
Assert.IsFalse(Session.FindByAccessibilityId<Element>("Monitors").Find<Element>("Monitor 2").Selected);

Session.FindByAccessibilityId<Element>("Monitors").Find<Element>("Monitor 2").Click();

// verify that the monitor 2 is selected after click
Assert.IsFalse(Session.FindByAccessibilityId<Element>("Monitors").Find<Element>("Monitor 1").Selected);
Assert.IsTrue(Session.FindByAccessibilityId<Element>("Monitors").Find<Element>("Monitor 2").Selected);
}
}
}
Original file line number Diff line number Diff line change
@@ -18,7 +18,7 @@ public class NewFancyZonesEditorTest
{
public NewFancyZonesEditorTest()
{
FancyZonesEditorHelper.InitFancyZonesLayout();
// FancyZonesEditorHelper.InitFancyZonesLayout();
}

[TestClass]
Original file line number Diff line number Diff line change
@@ -335,6 +335,7 @@
</ScrollViewer.DataContext>
<Grid>
<ui:GridView
x:Name="Monitors"
HorizontalAlignment="Center"
IsItemClickEnabled="True"
IsSelectionEnabled="True"

0 comments on commit b96bcf1

Please sign in to comment.