2010-04-26 3 views
0

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

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

Думаю, что может быть несколько рабочих столов, я попытался использовать функцию GetNextSibling 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) и компилирует его с помощью компилятора v3.5 C#.

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

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

    return result; 
} 

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

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

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

ответ

1

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

+0

Я разговаривал с профессором, который работает на сервере полчаса назад. Я считаю, что он работает как служба, и он сказал, что доступ к рабочему столу отключен. Я обновлю вас сегодня вечером, когда он изменяет разрешения. –

+0

Должно быть, это было. Он проверил это, и он работает. Спасибо за помощь. –

Смежные вопросы