Class: AppiumFailureHelper::Capture

Inherits:
Object
  • Object
show all
Defined in:
lib/appium_failure_helper/capture.rb

Constant Summary collapse

PREFIX =

… (Constantes PREFIX, MAX_VALUE_LENGTH, @@logger permanecem iguais) …

{
  'android.widget.Button' => 'btn', 'android.widget.TextView' => 'txt',
  'android.widget.ImageView' => 'img', 'android.widget.EditText' => 'input',
  'android.widget.CheckBox' => 'chk', 'android.widget.RadioButton' => 'radio',
  'android.widget.Switch' => 'switch', 'android.widget.ViewGroup' => 'group',
  'android.widget.View' => 'view', 'android.widget.FrameLayout' => 'frame',
  'android.widget.LinearLayout' => 'linear', 'android.widget.RelativeLayout' => 'relative',
  'android.widget.ScrollView' => 'scroll', 'android.webkit.WebView' => 'web',
  'android.widget.Spinner' => 'spin', 'XCUIElementTypeButton' => 'btn',
  'XCUIElementTypeStaticText' => 'txt', 'XCUIElementTypeTextField' => 'input',
  'XCUIElementTypeImage' => 'img', 'XCUIElementTypeSwitch' => 'switch',
  'XCUIElementTypeScrollView' => 'scroll', 'XCUIElementTypeOther' => 'elm',
  'XCUIElementTypeCell' => 'cell'
}.freeze
MAX_VALUE_LENGTH =
100
@@logger =
nil

Class Method Summary collapse

Class Method Details

.handler_failure(driver, exception) ⇒ Object

— MÉTODO PRINCIPAL (SEM ALTERAÇÕES) —



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/appium_failure_helper/capture.rb', line 30

def self.handler_failure(driver, exception)
  begin
    self.setup_logger unless @@logger
    timestamp = Time.now.strftime('%Y%m%d_%H%M%S')
    output_folder = "reports_failure/failure_#{timestamp}"
    FileUtils.mkdir_p(output_folder)
    @@logger.info("Pasta de saída criada: #{output_folder}")
    screenshot_base64 = driver.screenshot_as(:base64)
    page_source = driver.page_source
    File.write("#{output_folder}/page_source_#{timestamp}.xml", page_source)
    doc = Nokogiri::XML(page_source)
    platform = driver.capabilities['platformName']&.downcase || 'unknown'
    failed_element_info = self.extract_info_from_exception(exception)
    local_element_map = self.load_local_element_map
    de_para_result = nil
    logical_name_key = failed_element_info[:selector_value].to_s.gsub(/^#/, '')
    if local_element_map.key?(logical_name_key)
      de_para_result = {
        logical_name: logical_name_key,
        correct_locator: local_element_map[logical_name_key]
      }
    end
    all_elements_suggestions = self.get_all_elements_from_screen(doc, platform)
    similar_elements = self.find_similar_elements(failed_element_info, all_elements_suggestions)
    targeted_report = {
      failed_element: failed_element_info,
      similar_elements: similar_elements,
      de_para_analysis: de_para_result
    }
    File.open("#{output_folder}/failure_analysis_#{timestamp}.yaml", 'w') { |f| f.write(YAML.dump(targeted_report)) }
    File.open("#{output_folder}/all_elements_dump_#{timestamp}.yaml", 'w') { |f| f.write(YAML.dump(all_elements_suggestions)) }
    html_content = self.generate_html_report(targeted_report, all_elements_suggestions, screenshot_base64, platform, timestamp)
    File.write("#{output_folder}/report_#{timestamp}.html", html_content)
    @@logger.info("Relatórios gerados com sucesso em: #{output_folder}")
  rescue => e
    @@logger.error("Erro ao capturar detalhes da falha: #{e.message}\n#{e.backtrace.join("\n")}")
  end
end