c# - Application.GetWindow()*muy*lento
white (1)
Tengo los siguientes dos métodos a los que llamo en secuencia (con el campo de nivel de clase apropiado en secuencia)
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
}
Cuando lo ejecuto, la llamada a App.GetWindow()
lleva un tiempo REALMENTE largo. Como más de un minuto. La aplicación y la ventana están abiertas y en ejecución.
Intenté experimentar con las sobrecargas de GetWindow()
y también probé llamadas a Application.GetWindows()
y Application.Find()
, pero con el mismo resultado.
¿Alguien tiene alguna idea sobre cómo podría reducir este tiempo, o al menos señalar qué está tomando tanto tiempo? No estoy casado con la implementación que tengo de ninguna manera; lo que sea que me haga entender ese objeto de la ventana está bien conmigo.
Actualizar:
Para abordar los comentarios hasta el momento, modifiqué el código para intentar eliminar tantas otras preocupaciones como sea posible.
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");
}
Tiré en la evaluación enumerable para eliminar cualquier ejecución diferida también. Y lo probé tanto con mi aplicación como con el bloc de notas. El código anterior, tanto para mi aplicación como para el bloc de notas, ejecuta las primeras 3 líneas inmediatamente en el depurador, y luego toma un tiempo excesivo en la última en ambos casos.
(Parece posible que White pueda diferir internamente la ejecución de Application.Attach
, pero no sé mucho acerca de esta herramienta, por lo que es muy opaco para mí).
Segunda actualización:
Aquí está el desglose del tiempo empleado en el método GetWindow (). La aplicación pasó alrededor del 10% del tiempo en GetWindow (), por lo que más de la mitad de ese tiempo se gasta en WaitTillFound () y casi todo eso en un método Reintentar (). ¿Alguna idea sobre cómo reducir ese tiempo (o reducir el tiempo empleado en el constructor de Windows después de que se encuentra)?
No está claro si la ventana de destino se encuentra realmente después de esa espera. Si es así, ese es un comportamiento muy extraño. De todos modos, cuando llame a GetWindow, White intentará encontrar esa ventana durante un período determinado, por defecto 30 segundos (con intervalos de 200ms). Así que lo más probable es que eso sea lo que experimenta: el blanco por alguna razón no puede encontrar la ventana a la que se dirige. Puede configurar este tiempo de espera a través de:
TestStack.White.Configuration.CoreAppXmlConfiguration.Instance.FindWindowTimeout = 0;
Donde con 0 fallará inmediatamente si no se encuentra la ventana. También puede utilizar algún otro valor inferior a 30 segundos.