appium_failure_helper 0.6.6 → 0.6.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +58 -45
- data/lib/appium_failure_helper/configuration.rb +13 -0
- data/lib/appium_failure_helper/element_repository.rb +40 -32
- data/lib/appium_failure_helper/version.rb +1 -1
- data/lib/appium_failure_helper.rb +14 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5d5d4f2b54142887b1306f844740130498cf86d84a98146539e3c881ade117ad
|
4
|
+
data.tar.gz: f42ba2c9bc3c33005613702381b5974475064d22e69a0978bd3f63b0ccaa4dde
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aadc9e9fa50c1d543eac38ae98da69d63353f9824916fe5c03cacc48baa3bfa359a987213f9eb53f719eeff2457cc2e8d5a785d106066548eeb4213c1d2e45da
|
7
|
+
data.tar.gz: 37f7783e098caae647c356a089221c7f903871c485523f8e804afa86966b830394f6f1d54b6ee22b142d11f3e938f54c4fbe635e0fec788c8e90ae7e822c5361
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Diagnóstico Inteligente de Falhas Appium
|
2
2
|
|
3
3
|

|
4
|
-

|
5
5
|

|
6
6
|
|
7
7
|
Uma ferramenta robusta para diagnosticar falhas em testes automatizados com Appium, transformando erros de `NoSuchElementException` em relatórios interativos e inteligentes. Chega de perder tempo depurando seletores quebrados; deixe que a análise automatizada faça o trabalho pesado por você.
|
@@ -10,9 +10,10 @@ Uma ferramenta robusta para diagnosticar falhas em testes automatizados com Appi
|
|
10
10
|
|
11
11
|
* **Relatório HTML Interativo:** Gera um relatório visual completo a cada falha, com screenshot, análise detalhada e dump de todos os elementos da tela.
|
12
12
|
* **Análise de Mapeamento ("De/Para"):** Verifica automaticamente se o elemento que falhou está definido em alguma fonte de dados do projeto, como:
|
13
|
-
* **Arquivos `.yaml`** gerados dinamicamente
|
14
|
-
* **Arquivos de elementos Ruby (`.rb`)**
|
15
|
-
* **Sugestão por Similaridade:** Utiliza o algoritmo de Levenshtein para encontrar elementos na tela que são "parecidos" com o localizador que falhou, sugerindo correções
|
13
|
+
* **Arquivos `.yaml`** gerados dinamicamente.
|
14
|
+
* **Arquivos de elementos Ruby (`.rb`)** customizáveis.
|
15
|
+
* **Sugestão por Similaridade:** Utiliza o algoritmo de Levenshtein para encontrar elementos na tela que são "parecidos" com o localizador que falhou, sugerindo correções.
|
16
|
+
* **Altamente Configurável:** Permite que os projetos definam seus próprios caminhos e nomes de arquivos de elementos, tornando a ferramenta totalmente reutilizável.
|
16
17
|
* **Arquitetura Modular:** O código é limpo, organizado e fácil de estender, seguindo o Princípio da Responsabilidade Única.
|
17
18
|
* **Suporte Multiplataforma:** A lógica de análise e sugestão funciona tanto para **Android** quanto para **iOS**.
|
18
19
|
|
@@ -30,12 +31,36 @@ E então execute no seu terminal:
|
|
30
31
|
bundle install
|
31
32
|
```
|
32
33
|
|
33
|
-
## ⚙️ Configuração
|
34
|
+
## ⚙️ Configuração (Opcional)
|
34
35
|
|
35
|
-
|
36
|
+
Para tornar a ferramenta flexível e adaptável a diferentes projetos, você pode configurar os caminhos onde os elementos são buscados. Crie um bloco de configuração no seu arquivo de inicialização (ex: `features/support/env.rb`).
|
36
37
|
|
37
|
-
|
38
|
-
|
38
|
+
**Se nenhuma configuração for fornecida, a ferramenta usará os valores padrão.**
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
# Em features/support/env.rb
|
42
|
+
|
43
|
+
AppiumFailureHelper.configure do |config|
|
44
|
+
# Caminho para a pasta que contém os arquivos de elementos.
|
45
|
+
# Padrão: 'features/elements'
|
46
|
+
config.elements_path = 'caminho/para/sua/pasta/de/elementos'
|
47
|
+
|
48
|
+
# Nome do arquivo principal de elementos Ruby.
|
49
|
+
# Padrão: 'elementLists.rb'
|
50
|
+
config.elements_ruby_file = 'meu_arquivo_de_elementos.rb'
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
### Opções Disponíveis
|
55
|
+
|
56
|
+
| Parâmetro | Descrição | Valor Padrão |
|
57
|
+
| --------------------- | ------------------------------------------------------------------------------ | ------------------------ |
|
58
|
+
| `elements_path` | Path relativo à raiz do projeto para a pasta que contém os arquivos de elementos. | `'features/elements'` |
|
59
|
+
| `elements_ruby_file` | Nome do arquivo Ruby principal que define os elementos dentro da `elements_path`. | `'elementLists.rb'` |
|
60
|
+
|
61
|
+
## 🛠️ Uso no Cucumber
|
62
|
+
|
63
|
+
A integração é feita através de um hook `After` no seu ambiente de testes.
|
39
64
|
|
40
65
|
**Exemplo completo para `features/support/env.rb`:**
|
41
66
|
|
@@ -45,52 +70,39 @@ A integração com projetos baseados em **Cucumber** é extremamente simples.
|
|
45
70
|
require 'appium_lib'
|
46
71
|
require 'cucumber'
|
47
72
|
|
48
|
-
# 1. Carrega a sua ferramenta
|
73
|
+
# 1. Carrega a sua ferramenta
|
49
74
|
require 'appium_failure_helper'
|
50
75
|
|
51
|
-
#
|
76
|
+
# 2. (Opcional) Configura os caminhos se forem diferentes do padrão
|
77
|
+
AppiumFailureHelper.configure do |config|
|
78
|
+
config.elements_path = 'features/elements'
|
79
|
+
config.elements_ruby_file = 'elementLists.rb'
|
80
|
+
end
|
52
81
|
|
53
|
-
#
|
82
|
+
# 3. Hook que executa após cada cenário de teste
|
54
83
|
After do |scenario|
|
55
84
|
# Se o cenário falhou, aciona o seu helper
|
56
85
|
if scenario.failed?
|
57
86
|
puts "\n--- CENÁRIO FALHOU! ACIONANDO O DIAGNÓSTICO INTELIGENTE ---"
|
58
87
|
|
59
|
-
# A chamada
|
60
|
-
# Use a variável do seu driver (pode ser @driver, $driver, etc.)
|
88
|
+
# A chamada ao helper utiliza automaticamente as configurações definidas acima.
|
61
89
|
AppiumFailureHelper.handler_failure(@driver, scenario.exception)
|
62
90
|
|
63
91
|
puts "--- HELPER FINALIZOU. VERIFIQUE A PASTA 'reports_failure' ---"
|
64
92
|
end
|
65
93
|
end
|
66
|
-
|
67
|
-
# ... (código para fechar o driver, etc.) ...
|
68
94
|
```
|
69
95
|
|
70
|
-
E é isso! A ferramenta está pronta para agir.
|
71
|
-
|
72
96
|
## 📄 Entendendo o Relatório Gerado
|
73
97
|
|
74
|
-
Após uma falha, uma nova pasta será criada na raiz do seu projeto
|
75
|
-
|
76
|
-
Dentro dela, você encontrará 4 arquivos:
|
77
|
-
|
78
|
-
```
|
79
|
-
reports_failure/failure_20250924_154010/
|
80
|
-
|-- all_elements_dump_20250924_154010.yaml # Dump de todos os elementos da tela.
|
81
|
-
|-- failure_analysis_20250924_154010.yaml # Resumo da análise em formato YAML.
|
82
|
-
|-- page_source_20250924_154010.xml # O XML completo da tela no momento da falha.
|
83
|
-
`-- report_20250924_154010.html # O relatório interativo para abrir no navegador.
|
84
|
-
```
|
85
|
-
|
86
|
-
### O Relatório HTML Interativo
|
98
|
+
Após uma falha, uma nova pasta será criada na raiz do seu projeto: `reports_failure/failure_[timestamp]`. Dentro dela, o arquivo mais importante é o `report_[...].html`.
|
87
99
|
|
88
|
-
|
100
|
+
O relatório HTML é dividido em seções claras para um diagnóstico rápido:
|
89
101
|
|
90
|
-
#### Análise de Mapeamento (
|
91
|
-
|
92
|
-
* **Bloco Verde (Sucesso):** Confirma que o elemento foi encontrado
|
93
|
-
* **Bloco Amarelo (Aviso):** Informa que o elemento **não foi encontrado
|
102
|
+
#### Análise de Mapeamento (Bloco Verde/Amarelo)
|
103
|
+
Informa se o elemento que falhou foi encontrado nos seus arquivos de mapeamento (`.rb` ou `.yaml`).
|
104
|
+
* **Bloco Verde (Sucesso):** Confirma que o elemento foi encontrado. Isso sugere que a definição está correta, e o problema pode ser de timing ou visibilidade na tela.
|
105
|
+
* **Bloco Amarelo (Aviso):** Informa que o elemento **não foi encontrado**. Isso geralmente aponta para um erro de digitação no nome do elemento no seu código de teste.
|
94
106
|
|
95
107
|
#### Elemento com Falha (Bloco Vermelho)
|
96
108
|
Mostra exatamente qual `Tipo de Seletor` e `Valor Buscado` o Appium usou quando a falha ocorreu.
|
@@ -99,21 +111,22 @@ Mostra exatamente qual `Tipo de Seletor` e `Valor Buscado` o Appium usou quando
|
|
99
111
|
Uma imagem exata da tela no momento do erro.
|
100
112
|
|
101
113
|
#### Sugestões de Reparo (Análise de Similaridade)
|
102
|
-
|
114
|
+
Lista os elementos na tela com localizadores parecidos com o que falhou, com uma pontuação de similaridade. Ideal para corrigir erros de digitação nos seletores.
|
103
115
|
|
104
116
|
#### Dump Completo da Página
|
105
|
-
Uma lista interativa de **todos os elementos** visíveis na tela, com todos os seus possíveis localizadores.
|
117
|
+
Uma lista interativa de **todos os elementos** visíveis na tela, com todos os seus possíveis localizadores.
|
106
118
|
|
107
119
|
## 🏛️ Arquitetura do Código
|
108
120
|
|
109
|
-
O código
|
121
|
+
O código é modular para facilitar a manutenção e a extensibilidade.
|
110
122
|
|
111
|
-
* `
|
112
|
-
* `
|
113
|
-
* `
|
114
|
-
* `
|
115
|
-
* `
|
116
|
-
* `
|
123
|
+
* `configuration.rb`: Classe que armazena as opções configuráveis e seus valores padrão.
|
124
|
+
* `handler.rb`: O **Maestro**. Orquestra as chamadas para os outros módulos.
|
125
|
+
* `analyzer.rb`: O **Analista**. Processa a mensagem de erro e calcula a similaridade.
|
126
|
+
* `element_repository.rb`: O **Repositório**. Encontra e carrega as definições de elementos de arquivos `.yaml` e `.rb` usando os caminhos configurados.
|
127
|
+
* `page_analyzer.rb`: O **Leitor de Tela**. Processa o XML da página para extrair elementos e sugerir nomes/localizadores.
|
128
|
+
* `report_generator.rb`: O **Gerador**. Consolida todos os dados e cria os arquivos de relatório.
|
129
|
+
* `utils.rb`: Funções auxiliares (Logger, etc.).
|
117
130
|
|
118
131
|
## 🤝 Como Contribuir
|
119
132
|
|
@@ -121,4 +134,4 @@ Encontrou um bug ou tem uma ideia para uma nova funcionalidade? Abra uma *Issue*
|
|
121
134
|
|
122
135
|
## 📜 Licença
|
123
136
|
|
124
|
-
Este projeto é distribuído sob a licença MIT.
|
137
|
+
Este projeto é distribuído sob a licença MIT.
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module AppiumFailureHelper
|
2
|
+
class Configuration
|
3
|
+
# Define as opções que o usuário poderá configurar
|
4
|
+
attr_accessor :elements_path, :elements_ruby_file
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
# Define os valores PADRÃO.
|
8
|
+
# Se o usuário não configurar nada, a GEM usará estes valores.
|
9
|
+
@elements_path = 'features/elements'
|
10
|
+
@elements_ruby_file = 'elementLists.rb'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -1,49 +1,57 @@
|
|
1
1
|
module AppiumFailureHelper
|
2
2
|
module ElementRepository
|
3
|
+
|
4
|
+
def self.load_all
|
5
|
+
elements_map = load_from_ruby_file
|
6
|
+
elements_map.merge!(load_all_from_yaml)
|
7
|
+
elements_map
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def self.load_from_ruby_file
|
13
|
+
map = {}
|
14
|
+
# ALTERADO: Lê os caminhos a partir da configuração central.
|
15
|
+
config = AppiumFailureHelper.configuration
|
16
|
+
file_path = File.join(Dir.pwd, config.elements_path, config.elements_ruby_file)
|
17
|
+
|
18
|
+
return map unless File.exist?(file_path)
|
19
|
+
|
20
|
+
# ... (o resto do método continua igual)
|
21
|
+
begin
|
22
|
+
require file_path
|
23
|
+
instance = OnboardingElementLists.new
|
24
|
+
unless instance.respond_to?(:elements)
|
25
|
+
Utils.logger.warn("AVISO: A classe OnboardingElementLists não expõe um `attr_reader :elements`.")
|
26
|
+
return map
|
27
|
+
end
|
28
|
+
instance.elements.each do |key, value|
|
29
|
+
map[key.to_s] = { 'tipoBusca' => value[0], 'valor' => value[1] }
|
30
|
+
end
|
31
|
+
rescue => e
|
32
|
+
Utils.logger.warn("AVISO: Erro ao processar o arquivo #{file_path}: #{e.message}")
|
33
|
+
end
|
34
|
+
|
35
|
+
map
|
36
|
+
end
|
37
|
+
|
3
38
|
def self.load_all_from_yaml
|
4
39
|
elements_map = {}
|
5
|
-
#
|
6
|
-
|
40
|
+
# ALTERADO: Lê o caminho base da configuração central.
|
41
|
+
config = AppiumFailureHelper.configuration
|
42
|
+
glob_path = File.join(Dir.pwd, config.elements_path, '**', '*.yaml')
|
7
43
|
|
8
44
|
Dir.glob(glob_path).each do |file|
|
9
|
-
#
|
45
|
+
# ... (o resto do método continua igual) ...
|
10
46
|
next if file.include?('reports_failure')
|
11
|
-
|
12
47
|
begin
|
13
48
|
data = YAML.load_file(file)
|
14
|
-
if data.is_a?(Hash)
|
15
|
-
data.each do |key, value|
|
16
|
-
if value.is_a?(Hash) && value['tipoBusca'] && value['value']
|
17
|
-
elements_map[key] = value
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
49
|
+
elements_map.merge!(data) if data.is_a?(Hash)
|
21
50
|
rescue => e
|
22
51
|
Utils.logger.warn("Aviso: Erro ao carregar o arquivo YAML #{file}: #{e.message}")
|
23
52
|
end
|
24
53
|
end
|
25
54
|
elements_map
|
26
55
|
end
|
27
|
-
|
28
|
-
# NOVO: Método para verificar a existência de um elemento em um arquivo .rb
|
29
|
-
def self.find_in_ruby_file(element_name, path = 'elements/elements.rb')
|
30
|
-
return { found: false, path: path, reason: "Arquivo não encontrado" } unless File.exist?(path)
|
31
|
-
|
32
|
-
begin
|
33
|
-
content = File.read(path)
|
34
|
-
# Regex flexível para encontrar definições como:
|
35
|
-
# def nome_do_elemento
|
36
|
-
# element :nome_do_elemento
|
37
|
-
# element('nome_do_elemento')
|
38
|
-
if content.match?(/def #{element_name}|element[ |\(]['|:]#{element_name}/)
|
39
|
-
return { found: true, path: path }
|
40
|
-
else
|
41
|
-
return { found: false, path: path, reason: "Definição não encontrada" }
|
42
|
-
end
|
43
|
-
rescue => e
|
44
|
-
Utils.logger.warn("Aviso: Erro ao ler o arquivo Ruby #{path}: #{e.message}")
|
45
|
-
return { found: false, path: path, reason: "Erro de leitura" }
|
46
|
-
end
|
47
|
-
end
|
48
56
|
end
|
49
57
|
end
|
@@ -15,8 +15,22 @@ require_relative 'appium_failure_helper/element_repository'
|
|
15
15
|
require_relative 'appium_failure_helper/page_analyzer'
|
16
16
|
require_relative 'appium_failure_helper/report_generator'
|
17
17
|
require_relative 'appium_failure_helper/handler'
|
18
|
+
require_relative 'appium_failure_helper/configuration'
|
19
|
+
|
18
20
|
module AppiumFailureHelper
|
19
21
|
class Error < StandardError; end
|
22
|
+
class << self
|
23
|
+
attr_writer :configuration
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.configuration
|
27
|
+
@configuration ||= Configuration.new
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.configure
|
31
|
+
yield(configuration)
|
32
|
+
end
|
33
|
+
|
20
34
|
def self.handler_failure(driver, exception)
|
21
35
|
Handler.call(driver, exception)
|
22
36
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appium_failure_helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Nascimento
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- Rakefile
|
96
96
|
- lib/appium_failure_helper.rb
|
97
97
|
- lib/appium_failure_helper/analyzer.rb
|
98
|
+
- lib/appium_failure_helper/configuration.rb
|
98
99
|
- lib/appium_failure_helper/element_repository.rb
|
99
100
|
- lib/appium_failure_helper/handler.rb
|
100
101
|
- lib/appium_failure_helper/page_analyzer.rb
|