Este es un problema común. Me gustaría prestar atención a:
Cómo nombras elementos
Use css id o class para identificar elementos. Favorezca el uso de la ID de CSS cuando el objeto es único. Considere el marco que está utilizando, por ejemplo, con Ruby on Rails, el name
atributo se asigna automáticamente y puede (no intuitivamente) ser mejor que usar el id o la clase css
Cómo identificas los elementos.
Evite identificadores posicionales como table/tr/td/td
a favor de formas como td[id="main_vehicle"
o td[class='alternates']
. Considere usar atributos de datos cuando sea apropiado. Incluso mejor trate de evitar etiquetas de diseño como <td>
por ejemplo, para lo anterior, puede agregar un intervalo y usarlo, por ejemplo, <span id="main_vehicle">
o un selector de comodín, como *[id="main_vehicle"]
donde *
ahora podría ser un div, span, td, etc.
Usar atributos de datos específicos de prueba que solo se usan para qa y pruebas.
Evite la calificación innecesaria para los elementos. Puede encontrarse usando lo siguiente:
body.main div#vehicles > form#vehicle input#primary_vehicle_name
Sin embargo, esto requiere que el campo de entrada permanezca en un formulario con una identificación exacta del vehículo y en una página con un cuerpo que tenga una clase de main y un div con una identificación de vehículos que tenga un elemento secundario inmediato de un formulario con una identificación de vehículo. Cualquier cambio en cualquiera de esa estructura y la prueba se rompe. En este caso, puede encontrar que
input#primary_vehicle_name
es suficiente para identificar de forma única el elemento.
Evite las pruebas que hacen referencia a texto visible. El texto en la página que se muestra al usuario generalmente cambia con el tiempo a medida que el sitio se mantiene y actualiza, así que use identificadores como css id y css class o atributos de datos. Elementos como form
, input
y select
utilizados en formularios también son buenas partes de elementos de identificación, generalmente en combinación con id o clase, por ejemplo, li.vehicle
o input#first-vehicle
También puede agregar sus propios identificadores, por ejemplo <div data-vehicle='dodge'>
. De esta forma, puede evitar el uso de las ID o clases de elementos, que los desarrolladores y diseñadores pueden cambiar. De hecho, con el tiempo descubrí que es mejor trabajar con desarrolladores y diseñadores y llegar a un acuerdo sobre los nombres y los ámbitos. Es difícil.
Cómo se mantienen los datos fijos.
Similar a la identificación de elementos reales, trate de evitar valores de identificación del selector codificado en línea a favor de los objetos de la página: pequeños fragmentos de texto que se mantienen en variables o métodos y, por lo tanto, pueden reutilizarse y también mantenerse centralmente. Ejemplos de variables de JavaScript que siguen este patrón para valores codificados:
storedVars["eqv_auto_year"] = "2015";
storedVars["eqv_auto_make_1"] = "ALFA ROMEO";
storedVars["eqv_auto_make_2"] = "HONDA";`
Más sobre objetos de página en selenium wiki y selenium docs
Comunicación con desarrolladores.
Independientemente del enfoque técnico en términos de "los desarrolladores realizan cambios y rompen la automatización del control de calidad", es un problema de flujo de trabajo. Debe asegurarse de que: todos son uno mismo equipo; el desarrollador ejecuta las mismas pruebas integradas; los estándares son acordados y seguidos por ambos grupos; la definición de hecho incluye ejecutar y posiblemente actualizar las pruebas de IU; los desarrolladores y el probador se emparejan en los planes de prueba y ambos asisten a la preparación del boleto (si está haciendo Agile) y hablan sobre las pruebas de IU como parte de la preparación. Debe asegurarse de que cualquier enfoque y estrategia que utilice para nombrar esté coordinado con los desarrolladores de aplicaciones. Si no llega a la misma página, le gustará el choque sobre la denominación de objetos. Algunos ejemplos de métodos de objetos de página que creé recientemente para un proyecto ruby:
def css_email_opt_in_true
'auto_policy[email_opt_in][value=1]'
end
def css_phone_opt_in
'*[name="auto_policy[phone_opt_in]"]'
end
def css_phone_opt_in_true
'input[name=phone_opt_in][value=true]'
end
def css_credit_rating
'auto_policy[credit_rating]'
end
Aquí están los mismos objetos de página que las variables de JavaScript:
storedVars["css_email_opt_in"] = "css=*[name='auto_policy[email_opt_in]']";
storedVars["css_phone_opt_in"]="css=*[name='auto_policy[phone_opt_in]']";
storedVars["css_phone_opt_in_true"]="css=input[name='phone_opt_in'][value=true]";
storedVars["css_credit_rating"]="css=select[name='auto_policy[credit_rating]']";