Module: Appium
- Defined in:
- lib/appium_lib/common/helper.rb,
lib/appium_lib/driver.rb,
lib/appium_lib/logger.rb,
lib/appium_lib/ios/patch.rb,
lib/appium_lib/ios/errors.rb,
lib/appium_lib/ios/helper.rb,
lib/appium_lib/common/wait.rb,
lib/appium_lib/common/error.rb,
lib/appium_lib/common/patch.rb,
lib/appium_lib/android/patch.rb,
lib/appium_lib/device/device.rb,
lib/appium_lib/android/helper.rb,
lib/appium_lib/common/command.rb,
lib/appium_lib/common/version.rb,
lib/appium_lib/ios/element/text.rb,
lib/appium_lib/ios/element/alert.rb,
lib/appium_lib/device/multi_touch.rb,
lib/appium_lib/ios/element/button.rb,
lib/appium_lib/ios/mobile_methods.rb,
lib/appium_lib/ios/element/generic.rb,
lib/appium_lib/android/client_xpath.rb,
lib/appium_lib/android/element/text.rb,
lib/appium_lib/device/touch_actions.rb,
lib/appium_lib/android/element/alert.rb,
lib/appium_lib/common/element/window.rb,
lib/appium_lib/common/search_context.rb,
lib/appium_lib/ios/element/textfield.rb,
lib/appium_lib/android/element/button.rb,
lib/appium_lib/android/mobile_methods.rb,
lib/appium_lib/android/element/generic.rb,
lib/appium_lib/android/element/textfield.rb
Overview
UIAButton methods
Defined Under Namespace
Modules: Android, Common, Device, Error, Ios, Logger Classes: Driver, MultiTouch, TouchAction
Constant Summary collapse
- REQUIRED_VERSION_XCUITEST =
'1.6.0'.freeze
- VERSION =
Version and Date are defined on the ‘Appium’ module, not ‘Appium::Common’
'9.3.8'.freeze
- DATE =
'2017-04-13'.freeze
Class Method Summary collapse
-
.expand_required_files(base_dir, file_paths) ⇒ Array
List of require files as an array, nil if require doesn’t exist.
-
.load_settings(opts = {}) ⇒ hash
(also: load_appium_txt)
Load arbitrary text ([toml format](github.com/toml-lang/toml)) The toml is parsed by github.com/fbernier/tomlrb .
-
.promote_appium_methods(class_array) ⇒ Object
Promote appium methods to class instance methods.
-
.promote_singleton_appium_methods(modules) ⇒ Object
This method is intended to work with page objects that share a common module.
-
.symbolize_keys(hash) ⇒ Object
convert all keys (including nested) to symbols.
Class Method Details
.expand_required_files(base_dir, file_paths) ⇒ Array
Returns list of require files as an array, nil if require doesn’t exist.
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/appium_lib/driver.rb', line 117 def self.(base_dir, file_paths) # ensure files are absolute Array(file_paths).map! do |f| file = File.exist?(f) ? f : File.join(base_dir, f) file = File. file File.exist?(file) ? file : nil end file_paths.compact! # remove nils files = [] # now expand dirs file_paths.each do |item| unless File.directory? item # save file files << item next # only look inside folders end Dir.glob(File.(File.join(item, '**', '*.rb'))) do |f| # do not add folders to the file list files << File.(f) unless File.directory? f end end files end |
.load_settings(opts = {}) ⇒ hash Also known as: load_appium_txt
Load arbitrary text ([toml format](github.com/toml-lang/toml)) The toml is parsed by github.com/fbernier/tomlrb .
“‘
- caps
-
app = “path/to/app”
- appium_lib
-
port = 8080 “‘
:app is expanded :require is expanded all keys are converted to symbols
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/appium_lib/driver.rb', line 75 def self.load_settings(opts = {}) raise 'opts must be a hash' unless opts.is_a? Hash raise 'opts must not be empty' if opts.empty? toml = opts[:file] raise 'Must pass a capability file which has [caps] and [appium_lib]' unless toml verbose = opts.fetch :verbose, false Appium::Logger.info "appium settings path: #{toml}" if verbose toml_exists = File.exist? toml Appium::Logger.info "Exists? #{toml_exists}" if verbose raise "toml doesn't exist #{toml}" unless toml_exists require 'tomlrb' Appium::Logger.info "Loading #{toml}" if verbose data = Tomlrb.load_file(toml, symbolize_keys: true) if verbose Appium::Logger.ap_info data unless data.empty? end if data && data[:caps] && data[:caps][:app] && !data[:caps][:app].empty? data[:caps][:app] = Appium::Driver.absolute_app_path data end if data && data[:appium_lib] && data[:appium_lib][:require] parent_dir = File.dirname toml data[:appium_lib][:require] = (parent_dir, data[:appium_lib][:require]) end data end |
.promote_appium_methods(class_array) ⇒ Object
Promote appium methods to class instance methods
To promote methods to all classes:
“‘ruby Appium.promote_appium_methods Object “`
It’s better to promote on specific classes instead of Object
“‘ruby # promote on rspec Appium.promote_appium_methods RSpec::Core::ExampleGroup “`
“‘ruby # promote on minispec Appium.promote_appium_methods Minitest::Spec “`
223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
# File 'lib/appium_lib/driver.rb', line 223 def self.promote_appium_methods(class_array) raise 'Driver is nil' if $driver.nil? # Wrap single class into an array class_array = [class_array] unless class_array.class == Array # Promote Appium driver methods to class instance methods. class_array.each do |klass| $driver.public_methods(false).each do |m| klass.class_eval do define_method m do |*args, &block| begin # Prefer existing method. # super will invoke method missing on driver super(*args, &block) # minitest also defines a name method, # so rescue argument error # and call the name method on $driver rescue NoMethodError, ArgumentError $driver.send m, *args, &block if $driver.respond_to?(m) end end end end end nil # return nil end |
.promote_singleton_appium_methods(modules) ⇒ Object
This method is intended to work with page objects that share a common module. For example, Page::HomePage, Page::SignIn those could be promoted on with Appium.promote_singleton_appium_methods Page
If you are promoting on an individual class then you should use Appium.promote_appium_methods instead. The singleton method is intended only for the shared module use case.
if modules is a module instead of an array, then the constants of that module are promoted on. otherwise, the array of modules will be used as the promotion target.
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/appium_lib/driver.rb', line 170 def self.promote_singleton_appium_methods(modules) raise 'Driver is nil' if $driver.nil? target_modules = [] if modules.is_a? Module modules.constants.each do |sub_module| target_modules << modules.const_get(sub_module) end else raise 'modules must be a module or an array' unless modules.is_a? Array target_modules = modules end target_modules.each do |const| # noinspection RubyResolve # rubocop:disable Style/MultilineIfModifier $driver.public_methods(false).each do |m| const.send(:define_singleton_method, m) do |*args, &block| begin super(*args, &block) # promote.rb rescue NoMethodError, ArgumentError $driver.send m, *args, &block if $driver.respond_to?(m) end # override unless there's an existing method with matching arity end unless const.respond_to?(m) && const.method(m).arity == $driver.method(m).arity end # rubocop:enable Style/MultilineIfModifier end end |
.symbolize_keys(hash) ⇒ Object
convert all keys (including nested) to symbols
based on deep_symbolize_keys & deep_transform_keys from rails github.com/rails/docrails/blob/a3b1105ada3da64acfa3843b164b14b734456a50/activesupport/lib/active_support/core_ext/hash/keys.rb#L84
149 150 151 152 153 154 155 156 157 |
# File 'lib/appium_lib/driver.rb', line 149 def self.symbolize_keys(hash) raise 'symbolize_keys requires a hash' unless hash.is_a? Hash result = {} hash.each do |key, value| key = key.to_sym rescue key # rubocop:disable Style/RescueModifier result[key] = value.is_a?(Hash) ? symbolize_keys(value) : value end result end |