Automating Windows Store apps with Coded UI is not as
straight forward as automating desktop app. This is because recording actions
is not allowed for Windows Store apps.
Add a Windows Store Coded UI Test Project
1.
Add a new Coded UI Test Project from Store
App-> Windows Apps
4.
Launch the app
5. Drag to cross hair on to a control and select Add control to UI Map
7. Close the Coded UI Test Builder
8. UIMap.uitest will be created with the selected controls
Now instantiate the UIMap and automate the app in a test
method like below
Here, we will learn how to automate Windows Store apps using
Coded UI and launch and close the app programmatically using IApplicationActivationManager
Add a Windows Store Coded UI Test Project
1.
Add a new Coded UI Test Project from Store
App-> Windows Apps
2.
Select Edit UI Map or add assertions
3.
Note that recording actions is not allowed for
Windows Store apps
5. Drag to cross hair on to a control and select Add control to UI Map
6.
Add all controls and click Generate Code->Generate
7. Close the Coded UI Test Builder
8. UIMap.uitest will be created with the selected controls
Launch and Close the App
Add the following code
public enum ActivateOptions
{
None = 0x00000000, // No
flags set
DesignMode = 0x00000001, // The
application is being activated for design mode, and thus will not be able to
// to
create an immersive window. Window creation must be done by design tools which
// load
the necessary components by communicating with a designer-specified service on
// the
site chain established on the activation manager. The splash screen normally
// shown
when an application is activated will also not appear. Most activations
// will
not use this flag.
NoErrorUI = 0x00000002, // Do
not show an error dialog if the app fails to activate.
NoSplashScreen = 0x00000004, // Do
not show the splash screen when activating the app.
}
[ComImport, Guid("2e941141-7f97-4756-ba1d-9decde894a3d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IApplicationActivationManager
{
//
Activates the specified immersive application for the "Launch"
contract, passing the provided arguments
//
string into the application. Callers can
obtain the process Id of the application instance fulfilling this contract.
IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ActivateOptions options, [Out] out UInt32 processId);
IntPtr ActivateForFile([In] String appUserModelId, [In] IntPtr /*IShellItemArray* */ itemArray, [In] String verb, [Out] out UInt32 processId);
IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out UInt32 processId);
}
[ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")]//Application Activation
Manager
class ApplicationActivationManager : IApplicationActivationManager
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)/*, PreserveSig*/]
public extern IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ActivateOptions options, [Out] out UInt32 processId);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
public extern IntPtr ActivateForFile([In] String appUserModelId, [In] IntPtr /*IShellItemArray* */ itemArray, [In] String verb, [Out] out UInt32 processId);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
public extern IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out UInt32 processId);
}
Then create the following variables which can be accessed in
TestInitialize and TestCleanup
ApplicationActivationManager appActiveManager = new ApplicationActivationManager();
uint pid;
Add the following code in TestInitialize and TestCleanup
[TestInitialize()]
public void MyTestInitialize()
{
appActiveManager.ActivateApplication(appUserModelId, null, ActivateOptions.None, out pid);
}
[TestCleanup()]
public void MyTestCleanup()
{
Process.GetProcessById((int)pid).Kill();
}
The appUserModelId in TestInitialize can
be obtained using the following steps:
1.
If you own the source code of the app, find the
package name in package.appxmanifest
2.
Run regedit from command prompt
3.
On the device where the app is installed, find
the package name at
HKEY_CURRENT_USER\Software\Classes\ActivatableClasses\Package
4.
Find the AppUserModelId value in key in
\Server\App.App...
5.
For example, the appUserModelId for Calculator
app on my device is Microsoft.WindowsCalculator_8wekyb3d8bbwe!App as shown below
Automate the App
[TestMethod]
public void CodedUITestMethod1()
{
UIMap uiMap = new UIMap();
Keyboard.SendKeys(uiMap.UICalculatorWindow.UICalculatorResultsText,
"1");
Mouse.Click(uiMap.UICalculatorWindow.UIPlusButton, new Point(50, 50));
Keyboard.SendKeys(uiMap.UICalculatorWindow.UICalculatorResultsText,
"1");
Mouse.Click(uiMap.UICalculatorWindow.UIEqualsButton, new Point(50, 50));
Assert.AreEqual("Display
is 2 ",
uiMap.UICalculatorWindow.UICalculatorResultsText.DisplayText);
}