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