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 nameatributo é 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/tdem 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, inpute selectusados 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.vehicleou 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]']";