Showing posts with label Coded UI. Show all posts
Showing posts with label Coded UI. Show all posts

Thursday, October 9, 2014

Automating Windows Store apps using Coded UI

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.
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





 
      4.       Launch the app
      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

 Now instantiate the UIMap and automate the app in a test method like below
[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);
        }

Friday, November 2, 2012

Windows Azure: Automated UI testing using the power of cloud

Problem Statement
Automated UI testing needs to be performed from different parts of the world.
The tests can validate various UI behaviors from different geo locations e.g. behavior of JavaScript which makes service calls.
Background
As we have seen in my previous post on Performance testing using the power of cloud, it is possible to install test agents around the globe and run Load Tests from the agents. The same setup can be used to run unit tests or web tests by distributing them across different agents.
Challenge
The challenging part is to run UI tests (e.g. Coded UI) from the agents in cloud. This is because we will always need to have an active desktop session for the tests to interact with the UI. One option would be to have dedicated hardware on premise from where active remote desktop session is always maintained for all the agents in the cloud. The other option is to tweak the configuration a little as described below without requiring any additional hardware.
Solution
Perform the same steps which were done for the setting up the environment to run load tests i.e. Installing Test Controller on Premise and Setting up Windows Azure Connect.
Now below are the changes that the needed to specifically run Automated UI Tests
  • Instead of having just one user on the Azure VM’s, we will need to have two users. One of them is used for Remote Desktop and the other one is used to Run Tests.
  • The Remote Desktop user needs to be specified in the configuration file (.cscfg)
<Setting name="Microsoft.WindowsAzure.Plugins.RemoteAccess.AccountUsername" value="remoteuser" />
  •  The Test Agent user needs to be created in setup.cmd (This user name and password should be the same as the one configured on Test Controller)
REM Create user vstestagent as an administrator
net user vstestagent <<password>> /expires:never /add
net localgroup administrators vstestagent /Add

  •  Deploy the worker role and add it to the Local Endpoint Group for Windows Azure Connect as before.
  • Now Remote Desktop to the Azure VM from the Azure Portal using the Remote Desktop user.
  • Once connected, get the machine name of the VM from Computer->Properties.
  • Go to Run and type mstsc and connect to the same VM using the machine name. While connecting this time, type the credentials of the Test Agent user.
  • Configure the test agent with the test controller in Interactive mode.
  • Finally, a script needs to be run to turn off IE ESC, set default IE settings, turn off Phishing filter and disable Auto Lock. A command file can be added which does the following:
  • REM Configure IE ESC to Off
    REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" /v "IsInstalled" /t REG_DWORD /d 0 /f
    REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" /v "IsInstalled" /t REG_DWORD /d 0 /f
    Rundll32 iesetup.dll, IEHardenLMSettings
    Rundll32 iesetup.dll, IEHardenUser
    Rundll32 iesetup.dll, IEHardenAdmin
    REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A7-37EF-4b3f-8CFC-4F3A74704073}" /f /va
    REG DELETE "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Active Setup\Installed Components\{A509B1A8-37EF-4b3f-8CFC-4F3A74704073}" /f /va
    REM Set Default IE Settings
    REG DELETE "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "First Home Page" /f
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Default_Page_URL" /t REG_SZ /d "about:blank" /f
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Start Page" /t REG_SZ /d "about:blank" /f
    REM Disable Phishing Filter
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PhishingFilter" /v "ShownVerifyBalloon" /t REG_DWORD /d 3 /f
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\PhishingFilter" /v "Enabled" /t REG_DWORD /d 0 /f
    REM Disable Auto Lock
    REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v "DisableLockWorkstation" /t REG_DWORD /d 1 /f
    • Now don’t minimize any remote desktop windows and simply close the remote desktop window of the Remote Desktop user. This way the Remote Desktop window of the Test Agent user will be always active and the UI Tests can interact with the desktop.
    Result
    Now you can run your tests using the Test Controller. The Agent running as an interactive Process should be shown with an asterisk (*)
    The Automated UI Test runs on the Test Agent
    To confirm that the desktop doesn’t get locked, wait for 10-15 minutes, rerun the automated UI test and verify that it passes.