Automate "ClickOnce" WPF Application

Problem

To automate a WPF application it is necessary to configure the path to the executable file of the app. It is a problem when there is a WPF ClickOnce application. Then each new version of the app is installed in a different location. Here is a possible approach to the problem where a mixed test list containing a Web and WPF test is used.

Solution

It is necessary to create a stand alone class file (Utility) which static property (pathFile) will be used to store the path to the latest app version:

public class Utility
{
    public static string pathFile = string.Empty;
}
Public Class Utility

    Public Shared pathFile As String = String.Empty

End Class


The following scenario assumes that the app is downloaded form a web destination, installed and ran from a browser. In such case the first test in the list will be a Web test that will complete the app installation part. At the end of the installation the latest app version will be up and running. This test have to end with a coded step that will save in a variable path to the new application as given bellow:

// check if there is running process with same name
var runningApp = System.Diagnostics.Process.GetProcesses().Where(p => p.ProcessName == "YourClickOnceWpfApp");

// get the process
var proc = runningApp.FirstOrDefault();

// log the name of the process to the Execution Log
Log.WriteLine(proc.MainModule.FileName.ToString());

// save the full path to a common variable
Utility.pathFile = proc.MainModule.FileName.ToString();

Dim runningApp = System.Diagnostics.Process.GetProcesses().Where(Function(p) p.ProcessName = "YourClickOnceWpfApp")

Dim proc = runningApp.FirstOrDefault()

Log.WriteLine(proc.MainModule.FileName.ToString())

Utility.pathFile = proc.MainModule.FileName.ToString()


Next step is to create a WPF test that begins with a coded step and is configured to run a dummy WPF app. In the coded step the initially started mock app will be closed. Then depending on the latest version state (running/stoped) Test Studio will connect to or open it for next test steps execution:

// Shut down "mock" app
ActiveApplication.Quit();

// check if there is running process with same name
var runningApp = System.Diagnostics.Process.GetProcesses().Where(p => p.ProcessName == "YourClickOnceWpfApp");

// if there is same app running - connect to it
if (runningApp.Count() != 0)
{
    Manager.ConnectToApplication(runningApp.FirstOrDefault());
}
else
{
    // or - launch new application
    Manager.LaunchNewApplication(Utility.pathFile);
}

ActiveApplication.Quit()

Dim runningApp = System.Diagnostics.Process.GetProcesses().Where(Function(p) p.ProcessName = "YourClickOnceWpfApp")

If runningApp.Count() <> 0 Then

    Manager.ConnectToApplication(runningApp.FirstOrDefault())

Else

    Manager.LaunchNewApplication(Utility.pathFile)

End If


The project view is given on the next screenshot for a reference:

Project