13

Windows ストア アプリケーションの場合、単体テストを実行するには開発者ライセンスが必要です。これは、個々の開発者が自分のマシンで実行するのに適しています。

しかし、ビルド サーバーでの継続的な統合プロセスでは、ライセンスを自動的に取得する機能が本当に必要です。

Microsoft はコマンド ライン ツールを提供していますが、それでも対話型ウィンドウが作成され、プロセスが中断されます。

TailoredDeploy.exe AcquireDeveloperLicense

開発者ライセンスを自動的に取得する他の方法を知っている人はいますか? 手動でセットアップする必要がある場合、新しいビルドノードを生成するのは大変なことです。それらのそれぞれの VPN。

4

1 に答える 1

4

UI Automationを使用するように提案されましたが、これまでに思いついたものは次のとおりです。

using System.Diagnostics;
using System.Threading;
using System.Windows.Automation;

class Program
{
    static void Main(string[] args)
    {
        var processStartInfo = new ProcessStartInfo(@"C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\TailoredDeploy.exe", "AcquireDeveloperLicense");

        var process = Process.Start(processStartInfo);
        process.WaitForInputIdle();

        Thread.Sleep(1000);

        var agreementWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children,
            new PropertyCondition(AutomationElement.ProcessIdProperty, process.Id));

        var iAgreeButton = agreementWindow.FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                          .FindAll(TreeScope.Children, Condition.TrueCondition)[2];

        var buttonPattern = iAgreeButton.GetCurrentPattern(AutomationPattern.LookupById(InvokePattern.Pattern.Id)) as InvokePattern;
        buttonPattern.Invoke();

        Thread.Sleep(10000);

        var processes = Process.GetProcessesByName("dllhost");

        var credentialsWindows = AutomationElement.RootElement.FindAll(TreeScope.Children,
            new PropertyCondition(AutomationElement.ProcessIdProperty, processes[0].Id));

        if (credentialsWindows[0].Current.Name == "Developer License")
        {
            var credentialsPane = credentialsWindows[0].FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                                       .FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                                       .FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                                       .FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                                       .FindAll(TreeScope.Children, Condition.TrueCondition);

            var usernameTextBox = credentialsPane[3].GetCurrentPattern(AutomationPattern.LookupById(ValuePattern.Pattern.Id)) as ValuePattern;
            usernameTextBox.SetValue("username@outlook.com");

            var passwordTextBox = credentialsPane[5].GetCurrentPattern(AutomationPattern.LookupById(ValuePattern.Pattern.Id)) as ValuePattern;
            passwordTextBox.SetValue("password");

            var loginButton = credentialsPane[8].GetCurrentPattern(AutomationPattern.LookupById(InvokePattern.Pattern.Id)) as InvokePattern;
            loginButton.Invoke();

            Thread.Sleep(10000);

            var finishUpProcesses = Process.GetProcessesByName("TailoredDeploy");

            var finishWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children,
                new PropertyCondition(AutomationElement.ProcessIdProperty, finishUpProcesses[0].Id));

            var lastItems = finishWindow.FindAll(TreeScope.Children, Condition.TrueCondition)[0]
                                        .FindAll(TreeScope.Children, Condition.TrueCondition);

            var closeButton = lastItems[3].GetCurrentPattern(AutomationPattern.LookupById(InvokePattern.Pattern.Id)) as InvokePattern;
            closeButton.Invoke();
        }
    }
}

これを使用するにapp.manifestは、昇格モードで実行する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
    </application>
  </compatibility>
</asmv1:assembly>
于 2012-11-12T17:16:54.677 に答える