Подтвердить что ты не робот

Application.GetWindow() * очень * медленно

У меня есть следующие два метода, которые я вызываю в последовательности (с соответствующим полем уровня класса в последовательности)

public const string ProcessName = "This is"
public const string WindowTitle = "somewhat proprietary."

public Application App { get; set; }

public void Launch()
{
    var theProcess = Process.GetProcesses().First(p => p.ProcessName.Contains(ProcessName))
     App = Application.Attach(theProcess);
}

public void Select()
{ 
    var window = App.GetWindow(WindowTitle);

    var textBox = window.Get<TextBox>();
    //etc, do more stuff in the window
}

Когда я запустил его, вызов App.GetWindow() занимает ДЕЙСТВИТЕЛЬНО долгое время. Как больше минуты. Приложение и окно открыты и работают.

Я попытался поэкспериментировать с перегрузками GetWindow(), а также попробовал обращения к Application.GetWindows() и Application.Find(), но с тем же результатом.

Есть ли у кого-нибудь какие-либо мысли о том, как я мог бы сократить это время или, по крайней мере, определить, что так долго? Я не состою в браке с реализацией, которую у меня есть на любом участке - независимо от того, что делает мне этот оконный объект в порядке со мной.

Update:

Чтобы рассмотреть комментарии до сих пор, я изменил код, чтобы попытаться устранить как можно больше других проблем.

public void Select()
{
    var processes = Process.GetProcesses().ToList();
    var process = processes.First(p => p.ProcessName.ToLower().Contains("notepad"));
    App = Application.Attach(process);
    var window = App.GetWindow("Untitled - Notepad");
}

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

(Кажется возможным, что белые могли бы отложить выполнение Application.Attach, но я не очень разбираюсь в этом инструменте, так что это очень непрозрачно для меня.)

Второе обновление:

Здесь разбивается время, проведенное в методе GetWindow(). Приложение потратило около 10% времени в GetWindow(), поэтому более половины этого времени потрачено в WaitTillFound() и почти все из этого метода Retry(). Любые мысли о том, как уменьшить это время (или сократить время, затрачиваемое на конструктор Window после его обнаружения)? Диагностика

4b9b3361

Ответ 1

Не ясно, действительно ли целевое окно найдено после этого ожидания. Если да - это очень странное поведение. Во всяком случае, когда вы вызываете GetWindow, белые будут пытаться найти это окно на определенный период, по умолчанию 30 секунд (с интервалом в 200 мс). Поэтому, скорее всего, это то, что вы испытываете - белые по какой-то причине не могут найти окно, на которое вы нацелились. Вы можете настроить этот таймаут через:

TestStack.White.Configuration.CoreAppXmlConfiguration.Instance.FindWindowTimeout = 0;

Где с 0, он немедленно сработает, если окно не будет найдено. Вы также можете использовать другое значение ниже 30 секунд.