Хадсон, похоже, не запускает Process.Start правильно - PullRequest
0 голосов
/ 26 апреля 2010

Для проекта мне нужно запустить приложение на C #, вырвать дерево AutomationElement, связанное с процессом, а затем закрыть приложение и вывести дерево. Я делаю это, открывая приложение с помощью Process.Start. Затем я нахожу элементы AutomationElements, связанные с порожденным процессом, и иду по дереву, используя сочетание методов TreeWalker и AutomationElement FindFirst и FindAll.

Это нормально работает на моем компьютере и работает правильно, используя NUnit локально. Это также работает на других людях в компьютерах моих групп. Проблема в том, что он никогда не запускается на нашем центральном тестовом сервере, на котором работает Hudson. После нескольких часов отладки я провел тест на Hudson, запустил приложение и распечатал первый уровень AutomationTree. На моем компьютере это печатает все окна, которые у меня есть на рабочем столе. На Гудзоне печатается только рабочий стол.

Думая, что может быть несколько рабочих столов, я попытался использовать функцию GetWextSibling TreeWalker на RootElement. До сих пор сообщалось только об одном рабочем столе.

Вот код, который я использую для запуска процесса.

public bool connect(string[] args)
{
    if (this.process != null) {
        Console.WriteLine("ERROR: Process already connected");
        return false;
    }

    if (!File.Exists(sApplicationPath)) {
        Console.WriteLine(sApplicationPath + " does not exist");
        return false;
    }

    // Turn the command arguments into a single string
    string arguments = "";
    foreach (string arg in args) {
        arguments += arg + " ";
    }

    try {
        // Start the application
        ProcessStartInfo processStartInfo =
            new ProcessStartInfo(sApplicationPath);
        processStartInfo.Arguments = arguments;
        this.process = Process.Start(processStartInfo);

        // Must be a positive integer (non-zero)
        if ( !( iInitialDelay > 0 )  ) {
            Console.WriteLine("Invalid initial delay. " +
                              "Defaulting to 5 seconds.");
            this.iInitialDelay = 5000;
        }

        Thread.Sleep(this.iInitialDelay);
    } catch (Exception ex) {
        Console.WriteLine("WGApplication.connect: " + ex.Message);
        return false;
    }

    // Check if the process still exists
    try {
        /** This part does not return an error, so I think that means the process exists and is started */
        Process check = Process.GetProcessById(process.Id);
    } catch (ArgumentException ex) {
        Console.WriteLine("The process expired before connection was complete");
        Console.WriteLine("Make sure the process is not open anywhere else");
        Console.WriteLine("and that it is able to execute on the host machine.");
        return false;
    }

    // Check if the base automation element exists to verify open
    AutomationElement rootWindow =
        AutomationElement.RootElement.FindChildProcessById(process.Id);
    /** This part returns null, so it can't find the window associated with this process id */

    if (this.process == null) {
        return false;
    } else if (rootWindow == null) {
        // A root window with this process id has not been found
        Console.WriteLine("Cannot find the root window of the created " +
                          "process. Unknown error.");
        return false;
    } else {
        // Everything is good to go
        return true;
    }
}

sApplicationPath - это абсолютный путь к исполняемому файлу. iInitialDelay - задержка, чтобы убедиться, что приложение успевает запуститься. Я запускаю его на C: \ Windows \ System32 \ notepad.exe в Windows Vista с пакетом обновления 2 (SP2) и компилирую с помощью компилятора C3 v3.5.

FindChildProcessById определяется следующим образом:

public static AutomationElement FindChildProcessById(
    this AutomationElement element, int processId)
{
    var result = element.FindChildByCondition(
        new PropertyCondition(AutomationElement.ProcessIdProperty,
                              processId));

    return result;
}

Помните, что это компилируется и работает на моем компьютере. В моей тестовой программе на Гудзоне говорилось, что у RootElement вообще нет детей.

Итак, я запускаю приложение, подтверждаю, что оно существует, а затем не могу найти никаких окон, связанных с процессом. Я не могу найти никаких окон, связанных с чем-либо, кроме рабочего стола.

Это проблема с Гудзоном? Работает ли Hudson определенным образом, чтобы этот код не работал на нем? Это проблема с моим кодом? Сервер Hudson работает на компьютере под управлением Windows Server 2003. Любая помощь будет оценена. Я знаю, что это очень специфическая проблема, поэтому я не могу найти какие-либо решения в Интернете.

1 Ответ

1 голос
/ 26 апреля 2010

Хадсон работает как сервис? Если это так, он может не иметь необходимых прав для отображения окон.

...