Almacenar en caché en los clientes de automatización de la interfaz de usuario
Actualización: noviembre 2007
En este tema se describe el almacenamiento en caché de las propiedades de Automatización de la interfaz de usuario y los patrones de control.
En Automatización de la interfaz de usuario, el almacenamiento en caché hace referencia a la captura previa de los datos. Después, se puede tener acceso a los datos sin una comunicación posterior entre los procesos. Las aplicaciones cliente de Automatización de la interfaz de usuario suelen utilizar el almacenamiento en caché para recuperar las propiedades y los patrones de control por lotes. Posteriormente, la información se recupera de la caché según sea necesario. La aplicación actualiza periódicamente la caché, normalmente como respuesta a eventos que indican que algo ha cambiado en la interfaz de usuario (UI).
Las ventajas del almacenamiento en caché son muy notables con los controles de Windows Presentation Foundation (WPF) y los controles personalizados que tienen proveedores de Automatización de la interfaz de usuario de servidor. Las ventajas son menores cuando se tiene acceso a proveedores de cliente, como los proveedores predeterminados para los controles de Win32.
El almacenamiento en caché se produce cuando la aplicación activa un objeto CacheRequest y usa después cualquier método o propiedad que devuelva un elemento AutomationElement; por ejemplo, FindFirst, FindAll. Los métodos de la clase TreeWalker son una excepción; el almacenamiento en caché solo se realiza si se especifica un objeto CacheRequest como parámetro (por ejemplo, TreeWalker.GetFirstChild(AutomationElement, CacheRequest)).
El almacenamiento en caché también se produce al suscribirse a un evento cuando hay un objeto CacheRequest activo. El elemento AutomationElement pasado al controlador de eventos como origen de un evento contiene las propiedades y los patrones almacenados en caché especificados por el objeto CacheRequest original. Cualquier cambio realizado en CacheRequest después de suscribirse al evento no tendrá ningún efecto.
Las propiedades y los patrones de control de Automatización de la interfaz de usuario de un elemento se pueden almacenar en caché.
Este tema contiene las secciones siguientes.
- Opciones de almacenamiento en caché
- Activar CacheRequest
- Recuperar las propiedades almacenadas en caché
- Recuperar los patrones de control almacenados en caché
- Recuperar elementos primarios y secundarios almacenados en caché
- Actualizar la caché
- Temas relacionados
Opciones de almacenamiento en caché
CacheRequest especifica las opciones siguientes para el almacenamiento en caché.
Propiedades que se almacenan en caché
Puede especificar las propiedades que se almacenarán en caché mediante una llamada a Add(AutomationProperty) para cada propiedad antes de activar la solicitud.
Patrones de control que se almacenan en caché
Puede especificar los patrones de control que se almacenarán en caché mediante una llamada a Add(AutomationPattern) para cada patrón antes de activar la solicitud. Cuando un patrón se almacena en caché, sus propiedades no se almacenan automáticamente; debe especificar las propiedades que desea que se almacenen en caché mediante CacheRequest.Add.
Ámbito y filtrado del almacenamiento en caché
Puede especificar los elementos cuyas propiedades y patrones desea almacenar en caché si establece la propiedad CacheRequest.TreeScope antes de activar la solicitud. El ámbito es relativo a los elementos que se recuperan mientras la solicitud está activa. Por ejemplo, si solo establece Children y, a continuación, recupera un elemento AutomationElement, se almacenarán en caché las propiedades y los patrones de los elementos secundarios de ese elemento, pero no las del propio elemento. Para asegurarse de que el almacenamiento en caché se aplica al propio elemento recuperado, debe incluir Element en la propiedad TreeScope. No es posible establecer el ámbito en Parent ni en Ancestors. Sin embargo, sí es posible almacenar en caché un elemento primario cuando se almacena un elemento secundario; vea "Recuperar elementos primarios y secundarios almacenados en caché" en este mismo tema.
El alcance del almacenamiento en caché también se ve afectado por la propiedad CacheRequest.TreeFilter. De forma predeterminada, el almacenamiento en caché únicamente se realiza para elementos que aparecen en la vista de control del árbol de Automatización de la interfaz de usuario. Sin embargo, puede cambiar esta propiedad para aplicar el almacenamiento en caché a todos los elementos o solo a los que aparezcan en la vista de contenido.
Eficacia de las referencias a elementos
Al recuperar un elemento AutomationElement, de forma predeterminada se tiene acceso a todas sus propiedades y patrones, incluso los que no estaban almacenados en caché. Sin embargo, para aumentar la eficacia, puede especificar que la referencia al elemento solo se refiera a los datos almacenados en caché; para ello, se establece la propiedad AutomationElementMode de CacheRequest en None. En este caso, no se tiene acceso a las propiedades y patrones no almacenados en caché de los elementos recuperados. Esto significa que no puede tener acceso a ninguna propiedad mediante el método GetCurrentPropertyValue o la propiedad Current de AutomationElement o cualquier patrón de control; tampoco puede recuperar un patrón utilizando los métodos GetCurrentPattern o TryGetCurrentPattern. En los patrones almacenados en caché, puede llamar a métodos que recuperen propiedades de matriz, como SelectionPattern.SelectionPatternInformation.GetSelection, pero no a cualquier método que realice acciones en el control, como InvokePattern.Invoke.
Un ejemplo de una aplicación que podría prescindir de las referencias completas a objetos sería un lector de pantalla, que realizaría la captura previa de las propiedades Name y ControlType de los elementos en una ventana, pero no necesitaría los propios objetos AutomationElement.
Activar CacheRequest
El almacenamiento en caché se realiza solo cuando se recuperan objetos AutomationElement mientras un objeto CacheRequest está activo para el subproceso actual. Hay dos maneras de activar CacheRequest.
La manera habitual es llamar al método Activate. Este método devuelve un objeto que implementa IDisposable. La solicitud sigue estando activa siempre que exista el objeto IDisposable. La manera más fácil de controlar la duración del objeto es incluir la llamada dentro de un bloque using (C#) o Using (Visual Basic). De este modo se garantiza que la solicitud se extrae de la pila aunque se produzca una excepción.
Otra alternativa, que es útil si se desea anidar las solicitudes de la caché, es llamar al método Push. Esta acción coloca la solicitud en una pila y la activa. La solicitud permanecerá activa hasta que el método Pop la quite de la pila. La solicitud pasa a estar temporalmente inactiva si se inserta otra solicitud en la pila; solo la solicitud superior de la pila está activa.
Recuperar las propiedades almacenadas en caché
Puede recuperar las propiedades almacenadas en caché de un elemento mediante los métodos y las propiedades siguientes.
Se producirá una excepción si la propiedad solicitada no está en la caché.
Cached, como Current, expone las propiedades individuales como miembros de una estructura. Sin embargo, no necesita recuperar esta estructura; se puede tener acceso a las propiedades individuales directamente. Por ejemplo, la propiedad Name se puede obtener de element.Cached.Name, donde element es un elemento AutomationElement.
Recuperar los patrones de control almacenados en caché
Puede recuperar los patrones de control almacenados en caché de un elemento mediante los métodos siguientes.
Si el patrón no está en la caché, GetCachedPattern produce una excepción y TryGetCachedPattern devuelve false.
Puede recuperar las propiedades de un patrón de control que están almacenadas en caché mediante la propiedad Cached del objeto de patrón. También puede recuperar los valores actuales mediante la propiedad Current, pero solo si no se especificó None al recuperar AutomationElement. (Full es el valor predeterminado y permite el acceso a los valores actuales).
Recuperar elementos primarios y secundarios almacenados en caché
Cuando se recupera un elemento AutomationElement y se solicita el almacenamiento en caché de los elementos secundarios de ese elemento a través de la propiedad TreeScope de la solicitud, es posible obtener después los elementos secundarios mediante la propiedad CachedChildren del elemento recuperado.
Si se incluyó Element en el ámbito de la solicitud de almacenamiento en caché, el elemento raíz de la solicitud estará disponible posteriormente mediante la propiedad CachedParent de cualquiera de los elementos secundarios.
Nota: |
---|
No se pueden almacenar en caché los elementos primarios o antecesores del elemento raíz de la solicitud. |
Actualizar la caché
La caché solo es válida hasta que se produce un cambio en la interfaz de usuario. La aplicación debe actualizar la caché, lo que suele suceder como respuesta a eventos.
Si se suscribe a un evento mientras un objeto CacheRequest está activo, se obtiene un elemento AutomationElement con una caché actualizada como origen del evento cada vez que se llame al delegado del controlador de eventos. También se puede actualizar la información almacenada en caché para un elemento mediante una llamada a GetUpdatedCache. Se puede pasar el objeto CacheRequest original para actualizar toda la información previamente almacenada en caché.
La actualización de la caché no modifica las propiedades de las referencias a AutomationElement existentes.