c# - una - No puedo determinar si existe un cierto UITestControl en mi aplicación web
visual basic vs c# (3)
Estoy usando tryfind () ... está funcionando bien.
if (obj_webor.GenLink.TryFind())
{
logdata.WriteLine(obj_webor.GenInnerText + " Exist !");
}
else
{
logdata.WriteLine(obj_webor.GenInnerText + " Does Not Exist");
}
Anteriormente estaba usando obj_webor.GenLink.exist () .. pero estaba dando error si era control no existente y se produce una excepción. tryfind está bien
Actualmente estoy tratando de ayudar a automatizar algunas pruebas de UI codificadas usando C # para una aplicación web. Un problema frecuente que encuentro es que puede ser extremadamente difícil determinar si existe un objeto UITestControl
en la página o no. Desafortunadamente, la documentación de Microsoft en su sitio web de MSDN para cualquier cosa relacionada con las pruebas de interfaz de usuario codificadas es prácticamente inexistente ( consulte aquí su página para UITestControl
).
Básicamente lo que estoy preguntando es:
- ¿Cuál es la mejor manera de determinar si existe un
UITestControl
en la página o no? - ¿Cómo funciona la propiedad
UITestControl.Exists
? - ¿Qué hace el método
UITestControl.Find()
? - ¿Cómo funciona el método
UITestControl.TryFind()
?
Cómo he tratado de manejarlo:
Como mencioné anteriormente, la documentación de todas estas clases y métodos es en su mayoría en blanco. Lo máximo que puede obtener para describir cualquiera de los métodos y propiedades es una descripción de 1 línea en Intellisense, así que he estado experimentando con los métodos que se enumeran.
Primero probé a verificar si la propiedad UITestControl.Exists
era verdadera, pero con el tiempo y consultando la experiencia de los demás con ella, se hizo evidente que siempre es verdadera, incluso si el navegador no está abierto. Como la opción que parecía más obvia no funcionaba, traté de usar el método UITestControl.Find()
, pero como no toma argumentos y no devuelve nada, no pude entender qué hizo. Traté de usar el método UITestControl.TryFind()
, y ocasionalmente funcionó, pero descubrí que solo parecía devolver falso cuando no estaba en la página correcta; siempre devolvió verdadero de lo contrario. Claramente no tenía idea de cómo funcionaba, y no debería usarlo como una prueba.
Pensé que si no podía obtener los métodos proporcionados para hacer su trabajo, tendría que intentar hacer mis propias herramientas. Recientemente intenté usar Mouse.Hover(UITestControl)
en un bloque try / catch para determinar si el control existe así:
public bool DoesExist(UITestControl control){
if(control == null)
return false;
try{ Mouse.Hover(control); }
catch (UITestException)
{
return false;
}
return true;
}
A veces funciona, pero en ciertas situaciones parece devolver falsos positivos por razones que no entiendo. Todavía estoy volando a ciegas, y estoy casi sin ideas.
Estoy usando Visual Studio 2012 y Microsoft .NET Framework versión 4.5.50709.
En lugar de usar obj.Exists (), hemos codificado nuestro propio método existente que utiliza un enfoque de combinación de EnsureClickable () y BoundingRectangle.Width > 0 para garantizar que el control tenga un punto de pantalla.
ETA- uy, lo siento dejó una parte importante. Actualizado para agregar. Ancho para asegurarse de que sea mayor que 0, es posible que necesite usar la longitud si su ancho no funciona de alguna manera.
Respuesta parcial sobre los métodos Find()
y TryFind()
.
Después de configurar las diversas propiedades de búsqueda en la instancia de clase para el control, el método Find()
hace la búsqueda real de un control para que coincida. SearchProperties
se usa para tratar de encontrar un control. Si no se encuentran controles, la búsqueda falla; olvide exactamente lo que sucede en ese momento, posiblemente se genere una excepción, pero la documentación no lo indica. Si se encuentra un control que completa Find()
. Si se encuentran dos o más, la búsqueda continúa utilizando FilterProperties
para reducir la cantidad de controles encontrados a uno.
El grabador de IU codificado genera código del estilo UIControl aControl = this.UIMap.uione.uitwo.uithree;
lo que lleva a la pregunta de ¿cómo obtiene uione
un valor que se refiera a un control tal que uitwo
puede ser evadido? La única respuesta que he encontrado está en la parte de Descripción de http://blogs.msdn.com/b/balagans/archive/2009/12/28/9941582.aspx que dice " la búsqueda del control comienza" (explícita por Buscar () o implícito por cualquier uso del control en acciones o validaciones de propiedad) ".
Entonces Find()
realiza la búsqueda de un control y se puede invocar explícita o implícitamente.
TryFind()
es básicamente lo mismo que Find()
excepto que devuelve un valor booleano que indica si se encontró el control. Una vez más, la documentación es pobre, pero creo que TryFind()
devuelve true
si se encuentra exactamente un control, de lo contrario es false
.
Otro método de búsqueda útil es FindMatchingControls
que devuelve una colección (posiblemente vacía) de todos los controles que coinciden con los criterios de búsqueda.
Según la respuesta de yonitdm , usar BoundingRectangle
puede ayudar cuando hay varios elementos que coinciden, pero la mayoría no se muestran. Los valores de Top
e Left
también se pueden usar. Hacer un FindMatchingControls
y seleccionar los resultados para ignorar cualquier cosa con Top
negativo o Left
puede funcionar.
Al desarrollar pruebas, el método DrawHighlight
es útil, dibuja un rectángulo alrededor de un control. El mismo tipo de rectángulo que se dibuja al registrar aserciones con la herramienta de cruz de pelo.
El índice de contenido de UI codificado tiene mucha información buena. El enlace a "Cómo encuentra el marco de prueba de UI (búsqueda) para un control" puede ser particularmente útil para usted.