Для проекта мне нужно запустить приложение на 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. Любая помощь будет оценена. Я знаю, что это очень специфическая проблема, поэтому я не могу найти какие-либо решения в Интернете.