calculator/src/CalculatorUITestFramework/WindowsDriverExtensions.cs
Stephanie Anderl 2517854836 Added Calculator Standard Mode UI Tests (#501)
- Added the CalculatorUIFramework to handle the WinAppDriver logic.
- Added Standard Mode smoke tests and BVTs to the CalculatorUITests project.
- Removed old UI tests that did not use the CalculatorUIFramework
2019-06-21 14:54:36 -07:00

73 lines
3.0 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
using OpenQA.Selenium;
using OpenQA.Selenium.Appium.Windows;
namespace CalculatorUITestFramework
{
public static class WindowsDriverExtensions
{
/// <summary>
/// Wraps the WindowsDriver.FindElementByAccessibilityId and adds retry logic for when the element cannot be found due to WinAppDriver losing the window.
/// If FindElementByAccessibilityId fails for a different reason rethrow the error.
/// </summary>
public static WindowsElement TryFindElementByAccessibilityId(this WindowsDriver<WindowsElement> driver, string id)
{
try
{
return driver.FindElementByAccessibilityId(id);
}
catch (WebDriverException ex)
{
if (ex.Message.Contains("Currently selected window has been closed"))
{
driver.SwitchToCurrentWindowHandle();
return driver.FindElementByAccessibilityId(id);
}
throw;
}
}
/// <summary>
/// Wraps the WindowsDriver.FindElementByClassName and adds retry logic for when the element cannot be found due to WinAppDriver losing the window.
/// If FindElementByAccessibilityId fails for a different reason rethrow the error.
/// </summary>
public static WindowsElement TryFindElementByClassName(this WindowsDriver<WindowsElement> driver, string name)
{
try
{
return driver.FindElementByClassName(name);
}
catch (WebDriverException ex)
{
if (ex.Message.Contains("Currently selected window has been closed"))
{
driver.SwitchToCurrentWindowHandle();
return driver.FindElementByClassName(name);
}
throw;
}
}
/// <summary>
/// Gets the window handles for the current CalculatorSession and switches to the first one.
/// </summary>
public static void SwitchToCurrentWindowHandle(this WindowsDriver<WindowsElement> driver)
{
// Identify the current window handle. You can check through inspect.exe which window this is.
var currentWindowHandle = driver.CurrentWindowHandle;
// Return all window handles associated with this process/application.
// At this point hopefully you have one to pick from. Otherwise you can
// simply iterate through them to identify the one you want.
var allWindowHandles = driver.WindowHandles;
// Assuming you only have only one window entry in allWindowHandles and it is in fact the correct one,
// switch the session to that window as follows. You can repeat this logic with any top window with the same
// process id (any entry of allWindowHandles)
driver.SwitchTo().Window(allWindowHandles[0]);
}
}
}