2011-03-28 14 views
5

Tengo una aplicación que realiza cierta automatización en una aplicación de Windows arbitraria. He estado usando el Bloc de notas para probarlo.UIAutomation and Remote Desktop Connections

Durante esta automatización, tengo que invocar eventos desde el código. Actualmente apoyo dos tipos de eventos, ya que parecen ser los más comunes, InvokePattern y ExpandCollapsePattern.

Utilizo una computadora que puedo remotamente para hacer las pruebas. Pero es extraño. Cuando estoy conectado a la computadora a través de Escritorio remoto, la aplicación funciona bien. Cuando me desconecto de la computadora, mi código deja de funcionar para ExpandCollapsePattern (InvokePattern funciona bien). Obtengo una InvalidOperationException.

La documentación dice que esto solo debe lanzarse si el nodo está marcado como un LeafNode. ¿Qué hace que Remote Desktop sea diferente al obtener InvalidOperationException?

Aquí está el código que actualmente tengo para realizar el evento.

ExpandCollapseState state = 
    patternMenu.Current.ExpandCollapseState; 
if (state == ExpandCollapseState.Expanded) 
    patternMenu.Collapse(); 
else if (state == ExpandCollapseState.PartiallyExpanded || 
     state == ExpandCollapseState.Collapsed) 
    patternMenu.Expand(); 

patternMenu es un ExpandCollapsePattern recibido de la AutomationElement usando GetCurrentPattern.

El valor actual de ExpandCollapseState es "Contraído" cuando imprimo el valor.

EDIT: ¿Alguna posibilidad de que pueda saber por qué obtuve un voto negativo y cómo esta es una mala pregunta? Estoy realmente confundido de lo que está sucediendo, ya que solo parece fallar cuando se cierra el escritorio remoto. Si esta es una pregunta realmente tonta de la que debería saber la respuesta, me encantaría una explicación y luego un voto negativo.

El proceso que interactúa con el escritorio no es un servicio de Windows. Es una aplicación que comienzo después de que el escritorio remoto en la computadora. ¿Es porque estoy bloqueando el escritorio?

Estoy usando "Terminal Server Client" en Ubuntu para iniciar sesión en la máquina con Windows. Al presionar el botón de cerrar en esta aplicación, ¿se bloquea el escritorio?

Respuesta

2

En general, normalmente no puede ejecutar la automatización de UI o similar en un escritorio no interactivo. Los escritorios no interactivos tienen varias limitaciones con respecto a la entrada: no hay un elemento enfocado, la entrada no se puede enviar, por lo que todo lo que dependa de ellos fallará.

Algunas funciones, como el envío de mensajes de Windows, funcionarán bien. Lo que podría estar sucediendo aquí es que la funcionalidad InvokePattern se implementa bajo las cubiertas como mensajes, por lo que todavía funciona; pero el Expandir/Contraer podría implementarse en términos de entrada, lo cual fallaría.

No está claro por qué, en su caso, se produce un error cuando se cierra el cliente (se espera que esa parte), pero parece funcionar cuando los sí remotos cerraduras de escritorio - tendrían que esperar a comportarse de la misma en ambos casos .

(Tenga en cuenta que si los bloqueos locales de escritorio de Ubuntu, todo debería estar bien y seguir trabajando, siempre y cuando el cliente aún en marcha. El cliente remoto sigue siendo 'interactivo' en ese caso, ya que tiene un cliente en vivo unido a él, independientemente de si el cliente se está ejecutando en un escritorio interactivo o no interactivo, ¡los conceptos pueden incluso no aplicarse a un cliente que se ejecuta en otro sistema operativo!)

+0

Pensé que funcionaba bien cuando el escritorio se bloqueó , pero estaba equivocado.El último resultado de prueba comenzó a fallar tan pronto como el escritorio se bloqueó. Comenzaré a configurar una VM para ejecutar las pruebas en lugar de usar el escritorio remoto. Gracias. –