Esse é um problema comum. Eu prestaria atenção a:
Como você nomeia elementos
Use css id ou classe para identificar elementos. Favor usar o ID do CSS quando o objeto for único. Considere a estrutura que você está usando, por exemplo, com o Ruby on Rails, o name
atributo é atribuído automaticamente e pode (não intuitivamente) ser melhor do que usar o id ou classe css
Como você identifica elementos.
Evite identificadores posicionais como table/tr/td/td
em favor de formas comotd[id="main_vehicle"
ou td[class='alternates']
. Considere usar atributos de dados quando apropriado. Ainda melhor, tente evitar as tags de layout, como <td>
as anteriores, para adicionar um span e usá-lo, por exemplo, <span id="main_vehicle">
ou um seletor de curinga, como *[id="main_vehicle"]
onde *
agora pode ser um div, span, td, etc.
Usando atributos de dados específicos de teste que são usados apenas para qa e teste.
Evite qualificação desnecessária para elementos. Você pode encontrar o seguinte:
body.main div#vehicles > form#vehicle input#primary_vehicle_name
No entanto, isso exige que o campo de entrada permaneça em um formulário com um ID exato do veículo e em uma página com uma carroceria que possua uma classe de main e uma div com um ID de veículos que tenha um filho imediato de um formulário com um ID de veículo. Qualquer alteração em qualquer estrutura e o teste é interrompido. Nesse caso, você pode achar que
input#primary_vehicle_name
é suficiente para identificar exclusivamente o elemento.
Evite testes que se refiram ao texto visível. O texto na página que é mostrado ao usuário geralmente muda com o tempo, à medida que o site é mantido e atualizado; portanto, use identificadores como id css e classe css ou atributos de dados. Elementos como form
, input
e select
usados em formulários, também são boas partes dos elementos de identificação, geralmente em combinação com ID ou classe, por exemplo, li.vehicle
ou input#first-vehicle
Você também pode adicionar seus próprios identificadores, por exemplo<div data-vehicle='dodge'>
. Dessa forma, você pode evitar o uso de IDs ou classes de elementos, que provavelmente serão alterados por desenvolvedores e designers. Na verdade, descobri com o tempo que é melhor trabalhar apenas com desenvolvedores e designers e chegar a um acordo sobre nomes e escopos. É difícil.
Como os dados fixos são mantidos.
Semelhante à identificação de elementos reais, tente evitar o seletor codificado em linha, identificando valores em favor dos objetos de página - pequenos pedaços de texto que são mantidos em variáveis ou métodos e, portanto, podem ser reutilizados e também mantidos centralmente. Exemplos de variáveis javascript seguindo este padrão para valores codificados:
storedVars["eqv_auto_year"] = "2015";
storedVars["eqv_auto_make_1"] = "ALFA ROMEO";
storedVars["eqv_auto_make_2"] = "HONDA";`
Mais informações sobre objetos de página no selenium wiki e selenium docs
Comunicação com desenvolvedores.
Independentemente da abordagem técnica em termos de 'desenvolvedores fazem alterações e interrompem a automação do controle de qualidade', isso é um problema do fluxo de trabalho. Você precisa ter certeza de que: todos são da mesma equipe; o desenvolvedor executa os mesmos testes integrados; os padrões são acordados e seguidos pelos dois grupos; a definição de done inclui executar e possivelmente atualizar os testes da interface do usuário; desenvolvedores e testadores fazem par de planos de teste e participam da preparação do ticket (se estiver fazendo o Agile) e falam sobre o teste da interface do usuário como parte da preparação. Você deve garantir que qualquer abordagem e estratégia usada para nomear seja coordenada com os desenvolvedores de aplicativos. Se você não chegar à mesma página, entrará em conflito com a nomeação de objetos. Alguns exemplos de métodos de objeto de página que criei recentemente para um projeto 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
Aqui estão os mesmos objetos de página que as variáveis 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]']";