bucky-core 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +66 -0
  3. data/.codeclimate.yml +48 -0
  4. data/.dockerignore +11 -0
  5. data/.gitignore +40 -0
  6. data/.rspec +3 -0
  7. data/.rubocop.yml +76 -0
  8. data/.rubocop_todo.yml +51 -0
  9. data/Dockerfile +38 -0
  10. data/Dockerfile.system-test +44 -0
  11. data/Gemfile +4 -0
  12. data/Gemfile.lock +115 -0
  13. data/LICENSE +201 -0
  14. data/README.md +246 -0
  15. data/Rakefile +8 -0
  16. data/bin/console +15 -0
  17. data/bin/setup +8 -0
  18. data/bucky-core.gemspec +47 -0
  19. data/docker-compose.dev-with-bm.yml +28 -0
  20. data/docker-compose.dev.yml +18 -0
  21. data/docker-compose.system-test.yml +21 -0
  22. data/docker/nginx/Dockerfile +7 -0
  23. data/docker/nginx/nginx.conf +22 -0
  24. data/docker/nginx/public/index.html +19 -0
  25. data/docker/nginx/public/test_page.html +12 -0
  26. data/exe/bucky +214 -0
  27. data/lib/bucky.rb +3 -0
  28. data/lib/bucky/core/database/db_connector.rb +29 -0
  29. data/lib/bucky/core/database/test_data_operator.rb +195 -0
  30. data/lib/bucky/core/exception/bucky_exception.rb +39 -0
  31. data/lib/bucky/core/report/screen_shot_generator.rb +24 -0
  32. data/lib/bucky/core/test_core/test_case_loader.rb +162 -0
  33. data/lib/bucky/core/test_core/test_class_generator.rb +129 -0
  34. data/lib/bucky/core/test_core/test_manager.rb +70 -0
  35. data/lib/bucky/core/test_core/test_result.rb +92 -0
  36. data/lib/bucky/test_equipment/evidence/evidence_generator.rb +36 -0
  37. data/lib/bucky/test_equipment/pageobject/base_pageobject.rb +55 -0
  38. data/lib/bucky/test_equipment/pageobject/pages.rb +61 -0
  39. data/lib/bucky/test_equipment/selenium_handler/webdriver_handler.rb +66 -0
  40. data/lib/bucky/test_equipment/test_case/abst_test_case.rb +49 -0
  41. data/lib/bucky/test_equipment/test_case/e2e_test_case.rb +70 -0
  42. data/lib/bucky/test_equipment/test_case/linkstatus_test_case.rb +28 -0
  43. data/lib/bucky/test_equipment/user_operation/user_operation_helper.rb +97 -0
  44. data/lib/bucky/test_equipment/user_operation/user_operation_logger.rb +15 -0
  45. data/lib/bucky/test_equipment/user_operation/user_operator.rb +61 -0
  46. data/lib/bucky/test_equipment/verifications/abst_verification.rb +13 -0
  47. data/lib/bucky/test_equipment/verifications/e2e_verification.rb +106 -0
  48. data/lib/bucky/test_equipment/verifications/js_error_checker.rb +23 -0
  49. data/lib/bucky/test_equipment/verifications/service_verifications.rb +62 -0
  50. data/lib/bucky/test_equipment/verifications/status_checker.rb +180 -0
  51. data/lib/bucky/tools/lint.rb +69 -0
  52. data/lib/bucky/utils/bucky_logger.rb +25 -0
  53. data/lib/bucky/utils/bucky_output.rb +23 -0
  54. data/lib/bucky/utils/config.rb +55 -0
  55. data/lib/bucky/utils/requests.rb +33 -0
  56. data/lib/bucky/utils/yaml_load.rb +24 -0
  57. data/lib/bucky/version.rb +7 -0
  58. data/system_testing/test_bucky_project/.bucky_home +2 -0
  59. data/system_testing/test_bucky_project/config/bucky_config.yml +6 -0
  60. data/system_testing/test_bucky_project/config/e2e_config.yml +15 -0
  61. data/system_testing/test_bucky_project/config/linkstatus_config.yml +3 -0
  62. data/system_testing/test_bucky_project/config/test_db_config.yml +8 -0
  63. data/system_testing/test_bucky_project/services/README.md +1 -0
  64. data/system_testing/test_bucky_project/services/service_a/pc/pageobject/index.rb +13 -0
  65. data/system_testing/test_bucky_project/services/service_a/pc/parts/index.yml +6 -0
  66. data/system_testing/test_bucky_project/services/service_a/pc/scenarios/e2e/pc_e2e.yml +68 -0
  67. data/system_testing/test_bucky_project/services/service_a/pc/scenarios/e2e/setup_each_pc_e2e.yml +20 -0
  68. data/system_testing/test_bucky_project/services/service_a/pc/scenarios/e2e/setup_teardown_each_pc_e2e.yml +35 -0
  69. data/system_testing/test_bucky_project/services/service_a/pc/scenarios/e2e/teardown_each_pc_e2e.yml +20 -0
  70. data/system_testing/test_bucky_project/services/service_a/pc/scenarios/linkstatus/pc_link.yml +10 -0
  71. data/system_testing/test_bucky_project/services/service_a/sp/pageobject/index.rb +14 -0
  72. data/system_testing/test_bucky_project/services/service_a/sp/parts/index.yml +6 -0
  73. data/system_testing/test_bucky_project/services/service_a/sp/scenarios/e2e/sp_e2e_test.yml +26 -0
  74. data/system_testing/test_bucky_project/services/service_a/sp/scenarios/linkstatus/sp_link.yml +10 -0
  75. data/system_testing/test_bucky_project/services/service_a/tablet/pageobject/index.rb +14 -0
  76. data/system_testing/test_bucky_project/services/service_a/tablet/parts/index.yml +6 -0
  77. data/system_testing/test_bucky_project/services/service_a/tablet/scenarios/e2e/tablet_e2e_test.yml +26 -0
  78. data/system_testing/test_bucky_project/system/evidences/README.md +1 -0
  79. data/system_testing/test_bucky_project/system/evidences/screen_shots/README.md +1 -0
  80. data/system_testing/test_bucky_project/system/logs/README.md +1 -0
  81. data/system_testing/test_specification.md +38 -0
  82. data/system_testing/testing_code/command.bats +42 -0
  83. data/system_testing/testing_code/e2e.bats +75 -0
  84. data/system_testing/testing_code/linkstatus.bats +24 -0
  85. data/template/make_page/pc/pageobject/sample_page.rb +23 -0
  86. data/template/make_page/pc/parts/sample_page.yml +9 -0
  87. data/template/make_page/sp/pageobject/sample_page.rb +24 -0
  88. data/template/make_page/sp/parts/sample_page.yml +9 -0
  89. data/template/make_page/tablet/pageobject/sample_page.rb +24 -0
  90. data/template/make_page/tablet/parts/sample_page.yml +9 -0
  91. data/template/new/.bucky_home +2 -0
  92. data/template/new/config/bucky_config.yml +6 -0
  93. data/template/new/config/e2e_config.yml +15 -0
  94. data/template/new/config/linkstatus_config.yml +3 -0
  95. data/template/new/config/test_db_config.yml +8 -0
  96. data/template/new/services/README.md +1 -0
  97. data/template/new/system/evidences/README.md +1 -0
  98. data/template/new/system/evidences/screen_shots/README.md +1 -0
  99. data/template/new/system/logs/README.md +1 -0
  100. metadata +415 -0
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'parallel'
4
+ require_relative '../test_core/test_case_loader'
5
+ require_relative '../../utils/config'
6
+ require_relative './test_class_generator'
7
+
8
+ module Bucky
9
+ module Core
10
+ module TestCore
11
+ class TestManager
12
+ # Keep test conditions and round number
13
+ def initialize(test_cond)
14
+ @test_cond = test_cond
15
+ @re_test_count = @test_cond[:re_test_count]
16
+ @tdo = Bucky::Core::Database::TestDataOperator.new
17
+ @start_time = Time.now
18
+ $job_id = @tdo.save_job_record_and_get_job_id(@start_time, @test_cond[:command_and_option])
19
+ end
20
+
21
+ def run
22
+ execute_test
23
+ end
24
+
25
+ # Rerun by job id
26
+ def rerun
27
+ rerun_job_id = @test_cond[:job]
28
+ $round = @tdo.get_last_round_from_job_id(rerun_job_id)
29
+ @test_cond[:re_test_cond] = @tdo.get_ng_test_cases_at_last_execution(
30
+ is_error: 1, job_id: rerun_job_id, round: $round
31
+ )
32
+ execute_test
33
+ end
34
+
35
+ private
36
+
37
+ # Load test suite from test code.
38
+ def load_test_suites
39
+ test_suite_data = Bucky::Core::TestCore::TestCaseLoader.load_testcode(@test_cond)
40
+ raise StandardError, "\nThere is no test case!\nPlease check test condition." if test_suite_data.empty?
41
+
42
+ @tdo.update_test_suites_data(test_suite_data)
43
+ @tdo.add_suite_id_to_loaded_suite_data(test_suite_data)
44
+ end
45
+
46
+ # Generate and execute test
47
+ def do_test_suites(test_suite_data)
48
+ # For checking on linkstatus
49
+ link_status_url_log = {}
50
+ tcg = Bucky::Core::TestCore::TestClassGenerator.new(@test_cond)
51
+ Parallel.each(test_suite_data, in_processes: Bucky::Utils::Config.instance[:parallel_num]) do |data|
52
+ tcg.generate_test_class(data, link_status_url_log)
53
+ end
54
+ end
55
+
56
+ def execute_test
57
+ @re_test_count.times do |i|
58
+ $round = i + 1
59
+ test_suite_data = load_test_suites
60
+ do_test_suites(test_suite_data)
61
+ @test_cond[:re_test_cond] = @tdo.get_ng_test_cases_at_last_execution(
62
+ is_error: 1, job_id: $job_id, round: $round
63
+ )
64
+ break if @test_cond[:re_test_cond].empty?
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'singleton'
4
+ require 'json'
5
+ require 'test/unit/testresult'
6
+
7
+ require_relative '../database/test_data_operator'
8
+
9
+ module Bucky
10
+ module Core
11
+ module TestCore
12
+ class TestResult
13
+ include Singleton
14
+
15
+ attr_accessor :result
16
+
17
+ def initialize
18
+ @result = Test::Unit::TestResult.new
19
+ @tdo = Bucky::Core::Database::TestDataOperator.new
20
+ end
21
+
22
+ # Save test result
23
+ # @param [Array] added_result_info
24
+ def save(added_result_info)
25
+ # Format data before saving to database.
26
+ test_suite_result = format_result_summary(added_result_info)
27
+ @tdo.save_test_result(test_suite_result)
28
+ end
29
+
30
+ private
31
+
32
+ # Return Bucky::Test::Unit::TestResult Object
33
+ # @param [Array] added_result_info
34
+ # @return [Array] Array data for Sequel
35
+ def format_result_summary(added_result_info)
36
+ # For sequel
37
+ data_set = {}
38
+ error_test_case_name = []
39
+
40
+ ##############################################
41
+ # Store failed cases in data set. #
42
+ ##############################################
43
+ @result.faults.each do |fault|
44
+ case_name = fault.method_name
45
+ case_id = @tdo.get_test_case_id(added_result_info[case_name.to_sym][:test_suite_id], added_result_info[case_name.to_sym][:case_name])
46
+ error_test_case_name.push(case_name.to_sym)
47
+ data_set[case_name] =
48
+ [
49
+ id = nil,
50
+ test_case_id = case_id,
51
+ error_title = fault.message,
52
+ error_message = fault.location.join("\n"),
53
+ elapsed_time = added_result_info[case_name.to_sym][:elapsed_time],
54
+ is_error = 1,
55
+ job_id = $job_id,
56
+ round = $round
57
+ ]
58
+ end
59
+
60
+ ############################################
61
+ # Store passed cases in data set. #
62
+ ############################################
63
+ added_result_info.delete_if { |k, _v| error_test_case_name.include?(k) }
64
+ added_result_info.each do |case_name, added_info|
65
+ case_id = @tdo.get_test_case_id(added_info[:test_suite_id], added_info[:case_name])
66
+ data_set[case_name] =
67
+ [
68
+ id = nil,
69
+ test_case_id = case_id,
70
+ error_title = '',
71
+ error_message = '',
72
+ elapsed_time = added_info[:elapsed_time],
73
+ is_error = 0,
74
+ job_id = $job_id,
75
+ round = $round
76
+ ]
77
+ end
78
+
79
+ # Data set for sequel
80
+ data_set_ary = data_set.map { |_, v| v }
81
+
82
+ # Table colomn
83
+ column_name_ary = %i[id test_case_id error_title error_message elapsed_time is_error job_id round]
84
+ {
85
+ column: column_name_ary,
86
+ data_set: data_set_ary
87
+ }
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../core/report/screen_shot_generator'
4
+ require_relative '../../utils/bucky_logger'
5
+
6
+ module Bucky
7
+ module TestEquipment
8
+ module Evidence
9
+ class EvidenceGenerator
10
+ include Bucky::Utils::BuckyLogger
11
+
12
+ # Save log
13
+ # @param [String] file
14
+ # @param [Exception Object] err
15
+ def report(file, err)
16
+ Bucky::Utils::BuckyLogger.write(file, err)
17
+ end
18
+ end
19
+
20
+ # Create evidence for each test category
21
+ class E2eEvidence < EvidenceGenerator
22
+ include Bucky::Core::Report::ScreenShotGenerator
23
+
24
+ def initialize(**evid_args)
25
+ @driver = evid_args[:driver]
26
+ @tc = evid_args[:test_case]
27
+ end
28
+
29
+ def save_evidence(err)
30
+ generate_screen_shot(@driver, @tc)
31
+ report("#{@tc}_error", err)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../utils/yaml_load'
4
+ require_relative '../../core/exception/bucky_exception'
5
+
6
+ module Bucky
7
+ module TestEquipment
8
+ module PageObject
9
+ class BasePageObject
10
+ include Bucky::Utils::YamlLoad
11
+ def initialize(service, device, page_name, driver)
12
+ @driver = driver
13
+ generate_parts(service, device, page_name)
14
+ end
15
+
16
+ private
17
+
18
+ # Load parts file and define parts method
19
+ # @param [String] service
20
+ # @param [String] device (pc, sp)
21
+ # @param [String] paga_name
22
+ def generate_parts(service, device, page_name)
23
+ Dir.glob("./services/#{service}/#{device}/parts/#{page_name}.yml").each do |file|
24
+ parts_data = load_yaml(file)
25
+
26
+ # Define part method e.g.) page.parts
27
+ parts_data.each do |part_name, value|
28
+ self.class.class_eval { define_method(part_name) { find_elem(value[0], value[1]) } }
29
+ end
30
+ end
31
+ end
32
+
33
+ # @param [String] method Method name for searching WebElement
34
+ # http://www.rubydoc.info/gems/selenium-webdriver/0.0.28/Selenium/WebDriver/Find
35
+ # @param [String] Condition of search (xpath/id)
36
+ # @return [Selenium::WebDriver::Element]
37
+ def find_elem(method, value)
38
+ if method.end_with?('s')
39
+ elem = @driver.find_elements(method.sub(/s$/, '').to_sym, value)
40
+ raise_if_element_empty(elem, method, value)
41
+ return elem
42
+ end
43
+
44
+ @driver.find_element(method.to_sym, value)
45
+ rescue StandardError => e
46
+ Bucky::Core::Exception::WebdriverException.handle(e)
47
+ end
48
+
49
+ def raise_if_element_empty(elem, method, value)
50
+ raise Selenium::WebDriver::Error::NoSuchElementError, "#{method} #{value}" if elem.empty?
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bucky
4
+ module TestEquipment
5
+ module PageObject
6
+ class Pages
7
+ def initialize(service, device, driver)
8
+ collect_pageobjects(service, device, driver)
9
+ end
10
+
11
+ # Load page class and define page method
12
+ # @param [String] service
13
+ # @param [String] device (pc, sp)
14
+ # @param [Object] driver Webdriver object
15
+ def collect_pageobjects(service, device, driver)
16
+ # Create module name
17
+ module_service_name = service.split('_').map(&:capitalize).join
18
+ Dir.glob("#{$bucky_home_dir}/services/#{service}/#{device}/pageobject/*.rb").each do |file|
19
+ require file
20
+
21
+ page_name = file.split('/')[-1].sub('.rb', '')
22
+ page_class_name = page_name.split('_').map(&:capitalize).join
23
+
24
+ # Get instance of page class
25
+ page_class = eval(format('Services::%<module_service_name>s::%<device>s::PageObject::%<page_class_name>s', module_service_name: module_service_name, device: device.capitalize, page_class_name: page_class_name))
26
+ page_instance = page_class.new(service, device, page_name, driver)
27
+
28
+ # Define method by page name
29
+ self.class.class_eval do
30
+ define_method(page_name) { page_instance }
31
+ end
32
+ end
33
+ end
34
+
35
+ # Get Web element by page, part, num
36
+ # @param [Hash] args
37
+ def get_part(args)
38
+ return send(args[:page]).send(args[:part][:locate])[args[:part][:num]] if part_plural?(args)
39
+
40
+ send(args[:page]).send(args[:part])
41
+ end
42
+
43
+ # @param [Hash] args
44
+ # @return [Boolean]
45
+ def part_plural?(args)
46
+ # If the part is hash and has 'num' key, it has plural elements.
47
+ args[:part].class == Hash && args[:part].key?(:num)
48
+ end
49
+
50
+ # @param [Hash] args
51
+ # @return [Bool]
52
+ def part_exist?(args)
53
+ get_part(args)
54
+ true
55
+ rescue Selenium::WebDriver::Error::NoSuchElementError
56
+ false
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'selenium-webdriver'
4
+ require_relative '../../core/exception/bucky_exception'
5
+ require_relative '../../utils/config'
6
+
7
+ module Bucky
8
+ module TestEquipment
9
+ module SeleniumHandler
10
+ module WebdriverHandler
11
+ # Create and return webdriver object
12
+ # @param [String] device_type e.g.) sp, pc, tablet
13
+ # @return [Selenium::WebDriver]
14
+ def create_webdriver(device_type)
15
+ @@config = Bucky::Utils::Config.instance
16
+ driver_args = create_driver_args(device_type)
17
+ driver = Selenium::WebDriver.for(:remote, **driver_args)
18
+ driver.manage.window.resize_to(1280, 1000)
19
+ driver.manage.timeouts.implicit_wait = @@config[:find_element_timeout]
20
+ driver
21
+ rescue StandardError => e
22
+ Bucky::Core::Exception::BuckyException.handle(e)
23
+ end
24
+ module_function :create_webdriver
25
+
26
+ private
27
+
28
+ # @param [String] device_type e.g.) sp, pc, tablet
29
+ # @return [Hash] driver_args
30
+ def create_driver_args(device_type)
31
+ driver_args = { url: format('http://%<ip>s:%<port>s/wd/hub', ip: @@config[:selenium_ip], port: @@config[:selenium_port]) }
32
+ driver_args[:desired_capabilities] = generate_desire_caps(device_type)
33
+ client = Selenium::WebDriver::Remote::Http::Default.new
34
+ client.open_timeout = @@config[:driver_open_timeout]
35
+ client.read_timeout = @@config[:driver_read_timeout]
36
+ driver_args[:http_client] = client
37
+ driver_args
38
+ end
39
+
40
+ # @param [String] device_type e.g.) sp, pc, tablet
41
+ # @return [Hash] desire_capabilities
42
+ def generate_desire_caps(device_type)
43
+ case @@config[:browser]
44
+ when :chrome then
45
+ set_chrome_option(device_type)
46
+ else
47
+ raise 'Currently only supports chrome. Sorry.'
48
+ end
49
+ end
50
+
51
+ def set_chrome_option(device_type)
52
+ chrome_options = { 'goog:chromeOptions' => {} }
53
+ unless device_type == 'pc'
54
+ device_type = "#{device_type}_device_name".to_sym
55
+ mobile_emulation = { 'deviceName' => @@config[:device_name_on_chrome][@@config[device_type]] }
56
+ chrome_options['goog:chromeOptions']['mobileEmulation'] = mobile_emulation
57
+ end
58
+ chrome_options['goog:chromeOptions'][:args] = ["--load-extension=#{@@config[:js_error_collector_path]}"] if @@config[:js_error_check]
59
+ chrome_options['goog:chromeOptions'][:args] = ["--user-agent=#{@@config[:user_agent]}"] if @@config[:user_agent]
60
+
61
+ Selenium::WebDriver::Remote::Capabilities.chrome(chrome_options)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test/unit'
4
+ require_relative '../../core/test_core/test_result'
5
+
6
+ module Bucky
7
+ module TestEquipment
8
+ module TestCase
9
+ class AbstTestCase < Test::Unit::TestCase
10
+ class << self
11
+ def startup
12
+ return if $debug
13
+
14
+ @@this_result = Bucky::Core::TestCore::TestResult.instance
15
+ @@added_result_info = {}
16
+ end
17
+
18
+ def shutdown
19
+ @@this_result.save(@@added_result_info) unless $debug
20
+ end
21
+ end
22
+
23
+ # Override Test::Unit::TestCase#run
24
+ # Save test result to own test result object.
25
+ def run(result)
26
+ super
27
+ @@this_result.result = result unless $debug
28
+ end
29
+
30
+ def setup
31
+ # To make it easy to read
32
+ puts "\n"
33
+ end
34
+
35
+ def teardown
36
+ return if $debug
37
+
38
+ @@added_result_info[method_name.to_sym] = {
39
+ test_suite_id: suite_id,
40
+ elapsed_time: Time.now - start_time,
41
+ case_name: description
42
+ }
43
+ end
44
+
45
+ def cleanup; end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'selenium-webdriver'
4
+ require_relative './abst_test_case'
5
+ require_relative '../user_operation/user_operator'
6
+ require_relative '../pageobject/pages'
7
+ require_relative '../selenium_handler/webdriver_handler'
8
+ require_relative '../verifications/js_error_checker'
9
+ require_relative '../verifications/service_verifications'
10
+
11
+ module Bucky
12
+ module TestEquipment
13
+ module TestCase
14
+ class E2eTestCase < Bucky::TestEquipment::TestCase::AbstTestCase
15
+ include Bucky::TestEquipment::SeleniumHandler::WebdriverHandler
16
+ include Bucky::TestEquipment::Verifications::JsErrorChecker
17
+
18
+ TEST_CATEGORY = 'e2e'
19
+
20
+ class << self
21
+ def startup; end
22
+
23
+ def shutdown; end
24
+ end
25
+
26
+ # Initialize the following class
27
+ # - webdriver
28
+ # - page object
29
+ # - user oparation
30
+ # - verification
31
+ # @param [Hash] suite
32
+ def t_equip_setup
33
+ @driver = create_webdriver(suite_data[:device])
34
+ @pages = Bucky::TestEquipment::PageObject::Pages.new(suite_data[:service], suite_data[:device], @driver)
35
+ service_verifications_args = { service: suite_data[:service], device: suite_data[:device], driver: @driver, pages: @pages, method_name: method_name }
36
+ @service_verifications = Bucky::TestEquipment::Verifications::ServiceVerifications.new(service_verifications_args)
37
+ user_operator_args = { app: suite_data[:service], device: suite_data[:device], driver: @driver, pages: @pages }
38
+ @user_operator = Bucky::TestEquipment::UserOperation::UserOperator.new(user_operator_args)
39
+ end
40
+
41
+ # Call mothod of verification
42
+ # @param [Hash] verify_args e.g.) {verify: "assert_title", expect: "page title"}
43
+ def verify(**verify_args)
44
+ @service_verifications.send(verify_args[:verify], verify_args)
45
+ end
46
+
47
+ # Call method of user operation
48
+ # @param [Hash] op_args e.g.){page: 'top', part: 'rosen_tokyo', operation: 'click'}
49
+ def operate(**op_args)
50
+ @user_operator.send(op_args[:operate], method_name, op_args)
51
+ end
52
+
53
+ # Check javascript error
54
+ def check_js_error
55
+ assert_no_js_error(@driver) if @@config[:js_error_check]
56
+ end
57
+
58
+ def setup
59
+ super
60
+ t_equip_setup
61
+ end
62
+
63
+ def teardown
64
+ @driver.quit
65
+ super
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end