appium_lib 9.7.2 → 9.7.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/docs/android_docs.md +220 -168
- data/docs/docs.md +13 -37
- data/docs/ios_docs.md +278 -220
- data/docs/ios_xcuitest.md +0 -4
- data/docs/parallel.md +8 -0
- data/lib/appium_lib/android/android.rb +3 -0
- data/lib/appium_lib/android/common/helper.rb +3 -0
- data/lib/appium_lib/android/espresso.rb +9 -0
- data/lib/appium_lib/android/espresso/bridge.rb +14 -0
- data/lib/appium_lib/common/multi_touch.rb +151 -4
- data/lib/appium_lib/common/touch_actions.rb +21 -0
- data/lib/appium_lib/common/wait.rb +2 -22
- data/lib/appium_lib/core/android.rb +1 -0
- data/lib/appium_lib/core/android/espresso/bridge.rb +18 -0
- data/lib/appium_lib/core/android/touch.rb +15 -0
- data/lib/appium_lib/core/android/uiautomator1/bridge.rb +3 -1
- data/lib/appium_lib/core/android/uiautomator2/bridge.rb +3 -1
- data/lib/appium_lib/core/android_espresso.rb +5 -0
- data/lib/appium_lib/core/android_uiautomator2.rb +1 -0
- data/lib/appium_lib/core/core.rb +1 -1
- data/lib/appium_lib/core/device/touch_actions.rb +8 -23
- data/lib/appium_lib/core/driver.rb +93 -17
- data/lib/appium_lib/core/ios.rb +1 -0
- data/lib/appium_lib/core/ios/touch.rb +16 -0
- data/lib/appium_lib/core/ios/uiautomation/bridge.rb +2 -0
- data/lib/appium_lib/core/ios/xcuitest/bridge.rb +2 -0
- data/lib/appium_lib/core/ios/xcuitest/search_context.rb +23 -12
- data/lib/appium_lib/core/ios_xcuitest.rb +1 -0
- data/lib/appium_lib/driver.rb +18 -15
- data/lib/appium_lib/ios/xcuitest/bridge.rb +1 -0
- data/lib/appium_lib/ios/xcuitest/command.rb +1 -0
- data/lib/appium_lib/ios/xcuitest/command/source.rb +20 -0
- data/lib/appium_lib/version.rb +2 -2
- data/readme.md +14 -29
- data/release_notes.md +8 -0
- metadata +10 -3
- data/lib/appium_lib/core/device/multi_touch.rb +0 -213
@@ -10,6 +10,7 @@ module Appium
|
|
10
10
|
attr_reader :http_client
|
11
11
|
|
12
12
|
# Device type to request from the appium server
|
13
|
+
# @return [Symbol] :android and :ios, for example
|
13
14
|
attr_reader :device
|
14
15
|
|
15
16
|
# Automation name sent to appium server or received from server
|
@@ -24,6 +25,8 @@ module Appium
|
|
24
25
|
# Export session id to textfile in /tmp for 3rd party tools
|
25
26
|
# @return [Boolean]
|
26
27
|
attr_reader :export_session
|
28
|
+
# @return [String] By default, session id is exported in '/tmp/appium_lib_session'
|
29
|
+
attr_reader :export_session_path
|
27
30
|
|
28
31
|
# Default wait time for elements to appear
|
29
32
|
# Returns the default client side wait.
|
@@ -38,13 +41,13 @@ module Appium
|
|
38
41
|
attr_reader :port
|
39
42
|
|
40
43
|
# Return a time wait timeout
|
41
|
-
# Wait time for ::Appium::
|
44
|
+
# Wait time for ::Appium::Core::Base::Wait, wait and wait_true
|
42
45
|
# Provide Appium::Drive like { appium_lib: { wait_timeout: 20 } }
|
43
46
|
# @return [Integer]
|
44
47
|
attr_reader :wait_timeout
|
45
48
|
|
46
49
|
# Return a time wait timeout
|
47
|
-
# Wait interval time for ::Appium::
|
50
|
+
# Wait interval time for ::Appium::Core::Base::Wait, wait and wait_true
|
48
51
|
# Provide Appium::Drive like { appium_lib: { wait_interval: 20 } }
|
49
52
|
# @return [Integer]
|
50
53
|
attr_reader :wait_interval
|
@@ -52,13 +55,9 @@ module Appium
|
|
52
55
|
# instance of AbstractEventListener for logging support
|
53
56
|
attr_reader :listener
|
54
57
|
|
55
|
-
private
|
56
|
-
|
57
58
|
# @return [Appium::Core::Base::Driver]
|
58
59
|
attr_reader :driver
|
59
60
|
|
60
|
-
public
|
61
|
-
|
62
61
|
# @private
|
63
62
|
# @see Appium::Core.for
|
64
63
|
#
|
@@ -117,7 +116,8 @@ module Appium
|
|
117
116
|
# listener: nil,
|
118
117
|
# }
|
119
118
|
# }
|
120
|
-
# @
|
119
|
+
# @core = Appium::Driver.new(opts)
|
120
|
+
# @driver = @core.start_driver
|
121
121
|
#
|
122
122
|
def start_driver(server_url: nil,
|
123
123
|
http_client_ops: { http_client: nil, open_timeout: 999_999, read_timeout: 999_999 })
|
@@ -141,7 +141,7 @@ module Appium
|
|
141
141
|
listener: @listener)
|
142
142
|
|
143
143
|
# export session
|
144
|
-
write_session_id(@driver.session_id) if @export_session
|
144
|
+
write_session_id(@driver.session_id, @export_session_path) if @export_session
|
145
145
|
rescue Errno::ECONNREFUSED
|
146
146
|
raise "ERROR: Unable to connect to Appium. Is the server running on #{server_url}?"
|
147
147
|
end
|
@@ -155,6 +155,11 @@ module Appium
|
|
155
155
|
|
156
156
|
# Quits the driver
|
157
157
|
# @return [void]
|
158
|
+
#
|
159
|
+
# @example
|
160
|
+
#
|
161
|
+
# @core.quit_driver
|
162
|
+
#
|
158
163
|
def quit_driver
|
159
164
|
@driver.quit
|
160
165
|
rescue
|
@@ -166,7 +171,7 @@ module Appium
|
|
166
171
|
#
|
167
172
|
# @example
|
168
173
|
#
|
169
|
-
# @
|
174
|
+
# @core.appium_server_version
|
170
175
|
# {
|
171
176
|
# "build" => {
|
172
177
|
# "version" => "0.18.1",
|
@@ -178,7 +183,7 @@ module Appium
|
|
178
183
|
#
|
179
184
|
# @example
|
180
185
|
#
|
181
|
-
# @
|
186
|
+
# @core.appium_server_version #=> {}
|
182
187
|
#
|
183
188
|
def appium_server_version
|
184
189
|
@driver.remote_status
|
@@ -193,7 +198,7 @@ module Appium
|
|
193
198
|
#
|
194
199
|
# @example
|
195
200
|
#
|
196
|
-
# @
|
201
|
+
# @core.platform_version #=> [10.1.1]
|
197
202
|
#
|
198
203
|
def platform_version
|
199
204
|
p_version = @driver.capabilities['platformVersion']
|
@@ -207,15 +212,81 @@ module Appium
|
|
207
212
|
#
|
208
213
|
# @example
|
209
214
|
#
|
210
|
-
# @
|
215
|
+
# @core.screenshot '/tmp/hi.png' #=> nil
|
216
|
+
# # same as `@driver.save_screenshot png_save_path`
|
211
217
|
#
|
212
218
|
def screenshot(png_save_path)
|
213
219
|
@driver.save_screenshot png_save_path
|
214
220
|
nil
|
215
221
|
end
|
216
222
|
|
223
|
+
# Check every interval seconds to see if yield returns a truthy value.
|
224
|
+
# Note this isn't a strict boolean true, any truthy value is accepted.
|
225
|
+
# false and nil are considered failures.
|
226
|
+
# Give up after timeout seconds.
|
227
|
+
#
|
228
|
+
# Wait code from the selenium Ruby gem
|
229
|
+
# https://github.com/SeleniumHQ/selenium/blob/cf501dda3f0ed12233de51ce8170c0e8090f0c20/rb/lib/selenium/webdriver/common/wait.rb
|
230
|
+
#
|
231
|
+
# If only a number is provided then it's treated as the timeout value.
|
232
|
+
#
|
233
|
+
# @param [Hash] opts Options
|
234
|
+
# @option opts [Numeric] :timeout Seconds to wait before timing out. Set default by `appium_wait_timeout` (30).
|
235
|
+
# @option opts [Numeric] :interval Seconds to sleep between polls. Set default by `appium_wait_interval` (0.5).
|
236
|
+
# @option opts [String] :message Exception message if timed out.
|
237
|
+
# @option opts [Array, Exception] :ignore Exceptions to ignore while polling (default: Exception)
|
238
|
+
#
|
239
|
+
# @example
|
240
|
+
#
|
241
|
+
# @core.wait_true { @driver.find_element :accessibility_id, 'something' }
|
242
|
+
#
|
243
|
+
def wait_true(opts = {})
|
244
|
+
opts = process_wait_opts(opts).merge(return_if_true: true)
|
245
|
+
|
246
|
+
opts[:timeout] ||= @wait_timeout
|
247
|
+
opts[:interval] ||= @wait_interval
|
248
|
+
|
249
|
+
wait = ::Appium::Core::Base::Wait.new opts
|
250
|
+
wait.until { yield }
|
251
|
+
end
|
252
|
+
|
253
|
+
# Check every interval seconds to see if yield doesn't raise an exception.
|
254
|
+
# Give up after timeout seconds.
|
255
|
+
#
|
256
|
+
# Wait code from the selenium Ruby gem
|
257
|
+
# https://github.com/SeleniumHQ/selenium/blob/cf501dda3f0ed12233de51ce8170c0e8090f0c20/rb/lib/selenium/webdriver/common/wait.rb
|
258
|
+
#
|
259
|
+
# If only a number is provided then it's treated as the timeout value.
|
260
|
+
#
|
261
|
+
# @param [Hash] opts Options
|
262
|
+
# @option opts [Numeric] :timeout Seconds to wait before timing out. Set default by `appium_wait_timeout` (30).
|
263
|
+
# @option opts [Numeric] :interval Seconds to sleep between polls. Set default by `appium_wait_interval` (0.5).
|
264
|
+
# @option opts [String] :message Exception message if timed out.
|
265
|
+
# @option opts [Array, Exception] :ignore Exceptions to ignore while polling (default: Exception)
|
266
|
+
#
|
267
|
+
# @example
|
268
|
+
#
|
269
|
+
# @core.wait_true { @driver.find_element :accessibility_id, 'something' }
|
270
|
+
#
|
271
|
+
def wait(opts = {})
|
272
|
+
opts = process_wait_opts(opts).merge(return_if_true: false)
|
273
|
+
|
274
|
+
opts[:timeout] ||= @wait_timeout
|
275
|
+
opts[:interval] ||= @wait_interval
|
276
|
+
|
277
|
+
wait = ::Appium::Core::Base::Wait.new opts
|
278
|
+
wait.until { yield }
|
279
|
+
end
|
280
|
+
|
217
281
|
private
|
218
282
|
|
283
|
+
# @private
|
284
|
+
def process_wait_opts(opts)
|
285
|
+
opts = { timeout: opts } if opts.is_a?(Numeric)
|
286
|
+
raise 'opts must be a hash' unless opts.is_a? Hash
|
287
|
+
opts
|
288
|
+
end
|
289
|
+
|
219
290
|
# @private
|
220
291
|
def extend_for(device:, automation_name:, target:)
|
221
292
|
target.extend Appium::Core
|
@@ -224,6 +295,8 @@ module Appium
|
|
224
295
|
case device
|
225
296
|
when :android
|
226
297
|
case automation_name
|
298
|
+
when :espresso
|
299
|
+
::Appium::Core::Android::Espresso::Bridge.for(self)
|
227
300
|
when :uiautomator2
|
228
301
|
::Appium::Core::Android::Uiautomator2::Bridge.for(self)
|
229
302
|
else # default and UiAutomator
|
@@ -291,9 +364,12 @@ module Appium
|
|
291
364
|
|
292
365
|
# @private
|
293
366
|
def set_appium_lib_specific_values(appium_lib_opts)
|
294
|
-
@custom_url
|
295
|
-
@
|
296
|
-
|
367
|
+
@custom_url = appium_lib_opts.fetch :server_url, false
|
368
|
+
@default_wait = appium_lib_opts.fetch :wait, 0
|
369
|
+
|
370
|
+
# bump current session id into a particular file
|
371
|
+
@export_session = appium_lib_opts.fetch :export_session, false
|
372
|
+
@export_session_path = appium_lib_opts.fetch :export_session_path, '/tmp/appium_lib_session'
|
297
373
|
|
298
374
|
@port = appium_lib_opts.fetch :port, 4723
|
299
375
|
|
@@ -330,8 +406,8 @@ module Appium
|
|
330
406
|
end
|
331
407
|
|
332
408
|
# @private
|
333
|
-
def write_session_id(session_id)
|
334
|
-
File.open(
|
409
|
+
def write_session_id(session_id, export_path = '/tmp/appium_lib_session')
|
410
|
+
File.open(export_path, 'w') { |f| f.puts session_id }
|
335
411
|
rescue IOError => e
|
336
412
|
::Appium::Logger.warn e
|
337
413
|
nil
|
data/lib/appium_lib/core/ios.rb
CHANGED
@@ -0,0 +1,16 @@
|
|
1
|
+
module Appium
|
2
|
+
module Core
|
3
|
+
module Ios
|
4
|
+
module Touch
|
5
|
+
def self.extend_touch_actions
|
6
|
+
::Appium::Core::TouchAction.class_eval do
|
7
|
+
def swipe_coordinates(start_x: 0, start_y: 0, offset_x: 0, offset_y: 0)
|
8
|
+
Appium::Logger.info "start_x: #{start_x}, start_y: #{start_y}, offset_x: #{offset_x}, offset_y: #{offset_y}"
|
9
|
+
{ offset_x: offset_x, offset_y: offset_y }
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -7,18 +7,29 @@ module Appium
|
|
7
7
|
# Only for XCUITest(WebDriverAgent)
|
8
8
|
# find_element/s can be used with a [class chain]( https://github.com/facebook/WebDriverAgent/wiki/Queries)
|
9
9
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
10
|
+
# @example
|
11
|
+
#
|
12
|
+
# # select the third child button of the first child window element
|
13
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow/XCUIElementTypeButton[3]'
|
14
|
+
#
|
15
|
+
# # select all the children windows
|
16
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow'
|
17
|
+
#
|
18
|
+
# # select the second last child of the second child window
|
19
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2]'
|
20
|
+
#
|
21
|
+
# # matching predicate. <code>`</code> is the mark.
|
22
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow[`visible = 1][`name = \"bla\"`]'
|
23
|
+
#
|
24
|
+
# # containing predicate. `$` is the mark.
|
25
|
+
# # Require appium-xcuitest-driver 2.54.0+
|
26
|
+
# # PR: https://github.com/facebook/WebDriverAgent/pull/707/files
|
27
|
+
# find_elements :class_chain, 'XCUIElementTypeWindow[$name = \"bla$$$bla\"$]'
|
28
|
+
# e = find_element :class_chain, "**/XCUIElementTypeWindow[$name == 'Buttons'$]"
|
29
|
+
# e.tag_name #=> "XCUIElementTypeWindow"
|
30
|
+
# e = find_element :class_chain, "**/XCUIElementTypeStaticText[$name == 'Buttons'$]"
|
31
|
+
# e.tag_name #=> "XCUIElementTypeStaticText"
|
32
|
+
#
|
22
33
|
def self.extend
|
23
34
|
::Appium::Core::Base::SearchContext.add_finders(class_chain: '-ios class chain')
|
24
35
|
end
|
data/lib/appium_lib/driver.rb
CHANGED
@@ -39,6 +39,7 @@ module Appium
|
|
39
39
|
attr_reader :caps
|
40
40
|
attr_reader :custom_url
|
41
41
|
attr_reader :export_session
|
42
|
+
attr_reader :export_session_path
|
42
43
|
attr_reader :default_wait
|
43
44
|
attr_reader :appium_port
|
44
45
|
attr_reader :appium_device
|
@@ -129,6 +130,7 @@ module Appium
|
|
129
130
|
@caps = @core.caps
|
130
131
|
@custom_url = @core.custom_url
|
131
132
|
@export_session = @core.export_session
|
133
|
+
@export_session_path = @core.export_session_path
|
132
134
|
@default_wait = @core.default_wait
|
133
135
|
@appium_port = @core.port
|
134
136
|
@appium_wait_timeout = @core.wait_timeout
|
@@ -214,20 +216,21 @@ module Appium
|
|
214
216
|
# Returns a hash of the driver attributes
|
215
217
|
def driver_attributes
|
216
218
|
{
|
217
|
-
caps:
|
218
|
-
automation_name:
|
219
|
-
custom_url:
|
220
|
-
export_session:
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
219
|
+
caps: @core.caps,
|
220
|
+
automation_name: @core.automation_name,
|
221
|
+
custom_url: @core.custom_url,
|
222
|
+
export_session: @core.export_session,
|
223
|
+
export_session_path: @core.export_session_path,
|
224
|
+
default_wait: @core.default_wait,
|
225
|
+
sauce_username: @sauce.username,
|
226
|
+
sauce_access_key: @sauce.access_key,
|
227
|
+
sauce_endpoint: @sauce.endpoint,
|
228
|
+
port: @core.port,
|
229
|
+
device: @core.device,
|
230
|
+
debug: @appium_debug,
|
231
|
+
listener: @listener,
|
232
|
+
wait_timeout: @core.wait_timeout,
|
233
|
+
wait_interval: @core.wait_interval
|
231
234
|
}
|
232
235
|
end
|
233
236
|
|
@@ -431,7 +434,7 @@ module Appium
|
|
431
434
|
# @return [Selenium::WebDriver] the new global driver
|
432
435
|
def start_driver(http_client_ops =
|
433
436
|
{ http_client: ::Appium::Http::Default.new, open_timeout: 999_999, read_timeout: 999_999 })
|
434
|
-
|
437
|
+
@core.quit_driver
|
435
438
|
|
436
439
|
# If automationName is set only in server side, then the following automation_name should be nil before
|
437
440
|
# starting driver.
|
@@ -9,6 +9,7 @@ module Appium
|
|
9
9
|
target.extend Appium::Ios::Device
|
10
10
|
target.extend Appium::Ios::Xcuitest
|
11
11
|
target.extend Appium::Ios::Xcuitest::Command
|
12
|
+
target.extend Appium::Ios::Xcuitest::Source
|
12
13
|
target.extend Appium::Ios::Xcuitest::Helper
|
13
14
|
target.extend Appium::Ios::Xcuitest::Gesture
|
14
15
|
target.extend Appium::Ios::Xcuitest::Element
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Appium
|
2
|
+
module Ios
|
3
|
+
module Xcuitest
|
4
|
+
module Source
|
5
|
+
# @param [String|Symbol] format :xml or :json. :xml is by default.
|
6
|
+
# @option opts [Element] :element Element to swipe on
|
7
|
+
#
|
8
|
+
# ```ruby
|
9
|
+
# xcuitest_source format: :json
|
10
|
+
# ```
|
11
|
+
def xcuitest_source(format: :xml)
|
12
|
+
format = format.to_s if format.is_a? Symbol
|
13
|
+
args = { format: format }
|
14
|
+
|
15
|
+
@driver.execute_script 'mobile: source', args
|
16
|
+
end
|
17
|
+
end # module Gesture
|
18
|
+
end # module Xcuitest
|
19
|
+
end # module Ios
|
20
|
+
end # module Appium
|
data/lib/appium_lib/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Appium
|
2
2
|
# Version and Date are defined on the 'Appium' module, not 'Appium::Common'
|
3
|
-
VERSION = '9.7.
|
4
|
-
DATE = '2017-10-
|
3
|
+
VERSION = '9.7.3'.freeze unless defined? ::Appium::VERSION
|
4
|
+
DATE = '2017-10-21'.freeze unless defined? ::Appium::DATE
|
5
5
|
end
|
data/readme.md
CHANGED
@@ -11,36 +11,34 @@
|
|
11
11
|
- [appium_lib on RubyGems](https://rubygems.org/gems/appium_lib)
|
12
12
|
- [Documentation for appium_lib](https://github.com/appium/ruby_lib/tree/master/docs)
|
13
13
|
- [Appium Ruby Console](https://github.com/appium/ruby_console)
|
14
|
-
- [
|
15
|
-
- [
|
14
|
+
- [Getting Started](https://github.com/appium/appium/blob/master/docs/en/about-appium/getting-started.md)
|
15
|
+
- [code examples](https://github.com/appium/sample-code/tree/master/sample-code/examples/ruby)
|
16
16
|
|
17
17
|
Helper methods for writing cross platform (iOS, Android) tests in Ruby using Appium. Note that user waits should not exceed 120 seconds if they're going to run on Sauce Labs.
|
18
18
|
|
19
19
|
Make sure you're using Appium 1.0.0 or newer and Ruby 2.2+ with upgraded rubygems and bundler.
|
20
20
|
|
21
|
-
XCUITest for iOS requires `Appium 1.6.0+`. `appium_lib9.1.0+` requires `selenium-webdriver3.0.2+`.(`appium_lib9.0.0` or less requires `selenium-webdriver2.x`)
|
22
|
-
|
23
21
|
#### Start appium server
|
24
22
|
|
25
|
-
|
23
|
+
```bash
|
24
|
+
$ npm install -g appium
|
25
|
+
$ appium
|
26
|
+
```
|
26
27
|
|
27
28
|
#### Install / Upgrade
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
gem update --system ;\
|
33
|
-
gem update bundler
|
29
|
+
- Update rubygems and bundler
|
30
|
+
```bash
|
31
|
+
$ gem update --system
|
32
|
+
$ gem update bundler
|
34
33
|
```
|
35
34
|
|
36
|
-
Install the latest gem release
|
37
|
-
|
38
|
-
|
39
|
-
gem uninstall -aIx appium_lib ;\
|
35
|
+
- Install the latest gem release
|
36
|
+
```bash
|
37
|
+
gem uninstall -aIx appium_lib
|
40
38
|
gem install --no-rdoc --no-ri appium_lib
|
41
39
|
```
|
42
40
|
|
43
|
-
#### Sauce Labs env vars
|
41
|
+
#### [Sauce Labs env vars](https://github.com/appium/ruby_lib/blob/master/lib/appium_lib/sauce_labs.rb)
|
44
42
|
|
45
43
|
- `SAUCE_USERNAME` Sauce username
|
46
44
|
- `SAUCE_ACCESS_KEY` Sauce API key
|
@@ -48,11 +46,6 @@ gem install --no-rdoc --no-ri appium_lib
|
|
48
46
|
|
49
47
|
(Note: If these variables are set, all tests will use Sauce Labs unless over-ridden in configuration.)
|
50
48
|
|
51
|
-
#### Troubleshooting
|
52
|
-
|
53
|
-
1. Does `adb kill-server; adb devices` list an active Android device?
|
54
|
-
3. Are you running appium from source? `node .`
|
55
|
-
|
56
49
|
#### Documentation
|
57
50
|
|
58
51
|
- [Installing Appium on OS X](https://github.com/appium/ruby_console/blob/master/osx.md)
|
@@ -62,13 +55,5 @@ gem install --no-rdoc --no-ri appium_lib
|
|
62
55
|
- [Tips for XCUITest for iOS](https://github.com/appium/ruby_lib/blob/master/docs/ios_xcuitest.md)
|
63
56
|
- [Appium Server docs](https://github.com/appium/appium/tree/master/docs)
|
64
57
|
|
65
|
-
#### Logging
|
66
|
-
|
67
|
-
[Log level](https://github.com/appium/ruby_lib/blob/1673a694121d2ae24ffd1530eb71b7015d44dc52/lib/appium_lib/logger.rb) can be adjusted. The default level is `Logger::WARN`
|
68
|
-
|
69
|
-
```ruby
|
70
|
-
Appium::Logger.level = Logger::INFO
|
71
|
-
```
|
72
|
-
|
73
58
|
#### Load Pry
|
74
59
|
`Pry.config.pager = false` is set if you have no `.pryrc` files and `Pry` is defined.
|