appium_lib 9.4.3 → 9.4.4

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.
@@ -0,0 +1,24 @@
1
+ language: objective-c
2
+ sudo: false
3
+ osx_image: xcode8.3
4
+
5
+ cache: bundler
6
+
7
+ rvm:
8
+ - 2.4
9
+
10
+ install:
11
+ - bundle install
12
+ - npm install -g appium@1.6.4
13
+
14
+ before_script:
15
+ - appium --log-level warn &
16
+
17
+ script:
18
+ - bundle exec rake rubocop
19
+ - cd ios_tests; rake ios
20
+
21
+ notifications:
22
+ email:
23
+ on_success: never
24
+ on_failure: never
@@ -34,7 +34,7 @@ def mobj_to_md obj
34
34
 
35
35
  indent = space 5
36
36
  params = obj.tags.select { |tag| tag.tag_name == 'param' }
37
- if !params.empty?
37
+ unless params.empty?
38
38
  out += "__Parameters:__\n\n"
39
39
  params.each do |param|
40
40
  param_types = param.types ? "[#{param.types.join ', '}] " : ''
@@ -44,7 +44,7 @@ def mobj_to_md obj
44
44
  end
45
45
 
46
46
  ret = obj.tag 'return'
47
- if ret
47
+ if ret&.types
48
48
  out += "__Returns:__\n\n"
49
49
  out += indent + "[#{ret.types.join ', '}] #{ret.text}\n\n"
50
50
  end
@@ -8,6 +8,20 @@ describe 'ios/xcuitest_gestures' do
8
8
  screen.must_equal catalog
9
9
  end
10
10
 
11
+ def open_alert_ok_cancel
12
+ wait_true do
13
+ find_element(:name, 'Show OK-Cancel').click
14
+ find_element(:name, 'UIActionSheet <title>').displayed?
15
+ end
16
+ end
17
+
18
+ def open_alert_custom
19
+ wait_true do
20
+ find_element(:name, 'Show Customized').click
21
+ find_element(:name, 'UIActionSheet <title>').displayed?
22
+ end
23
+ end
24
+
11
25
  t 'before_first' do
12
26
  before_first
13
27
  end
@@ -58,8 +72,31 @@ describe 'ios/xcuitest_gestures' do
58
72
  find_element(:name, 'Serena Auroux').displayed?.must_equal true
59
73
  end
60
74
 
61
- t 'after_last' do
75
+ t 'back to top' do
76
+ back_click
77
+ end
78
+
79
+ t 'alert' do
80
+ wait_true do
81
+ UI::Inventory.xcuitest? ? find_element(:name, 'Alerts').click : text('alerts').click
82
+ tag(UI::Inventory.navbar).name == 'Alerts' # wait for true
83
+ end
84
+
85
+ open_alert_ok_cancel
86
+ alert action: 'accept'
87
+
88
+ open_alert_ok_cancel
89
+ alert action: 'dismiss'
90
+
91
+ open_alert_custom
92
+ alert action: 'accept', button_label: 'Button1'
93
+ end
94
+
95
+ t 'back to top' do
62
96
  back_click
97
+ end
98
+
99
+ t 'after_last' do
63
100
  after_last
64
101
  end
65
102
  end
@@ -3,7 +3,7 @@ module Appium
3
3
  # @private
4
4
  # http://nokogiri.org/Nokogiri/XML/SAX.html
5
5
  class AndroidElements < Nokogiri::XML::SAX::Document
6
- attr_reader :result, :keys, :instance, :filter
6
+ attr_reader :result, :keys, :filter
7
7
 
8
8
  # convert to string to support symbols
9
9
  def filter=(value)
@@ -15,22 +15,17 @@ module Appium
15
15
  def initialize
16
16
  reset
17
17
  @filter = false
18
- @instance = Hash.new(-1)
19
18
  end
20
19
 
21
20
  def reset
22
21
  @result = ''
23
22
  @keys = %w(text resource-id content-desc)
24
- @instance = Hash.new(-1)
25
23
  end
26
24
 
27
25
  # http://nokogiri.org/Nokogiri/XML/SAX/Document.html
28
26
  def start_element(name, attrs = [])
29
27
  return if filter && !name.downcase.include?(filter)
30
28
 
31
- # instance numbers start at 0.
32
- number = instance[name] += 1
33
-
34
29
  attributes = {}
35
30
 
36
31
  attrs.each do |key, value|
@@ -78,39 +73,10 @@ module Appium
78
73
  string += " id: #{id}\n" unless id.nil?
79
74
  string += " strings.xml: #{string_ids}" unless string_ids.nil?
80
75
 
81
- @result += "\n#{name} (#{number})\n#{string}" unless attributes.empty?
76
+ @result += "\n#{name}\n#{string}" unless attributes.empty?
82
77
  end
83
78
  end # class AndroidElements
84
79
 
85
- # Fix uiautomator's xml dump.
86
- # https://github.com/appium/appium/issues/2822
87
- # https://code.google.com/p/android/issues/detail?id=74143
88
- def _fix_android_native_source(source)
89
- # <android.app.ActionBar$Tab
90
- # <android.app.ActionBar $ Tab
91
-
92
- # find each closing tag that contains a dollar sign.
93
- source.scan(/<\/([^>]*\$[^>]*)>/).flatten.uniq.each do |problem_tag|
94
- # "android.app.ActionBar$Tab"
95
- before, after = problem_tag.split('$')
96
- before.strip!
97
- after.strip!
98
-
99
- fixed = "#{before}.#{after}"
100
-
101
- # now escape . in before/after because they're used in regex
102
- before.gsub!('.', '\.')
103
- after.gsub!('.', '\.')
104
-
105
- # <android.app.ActionBar$Tab => <android.app.ActionBar.Tab
106
- # </android.app.ActionBar$Tab> => </android.app.ActionBar.Tab>
107
- source = source.gsub(/<#{before}\s*\$\s*#{after}/,
108
- "<#{fixed}").gsub(/<\/#{before}\s*\$\s*#{after}>/, "</#{fixed}>")
109
- end
110
-
111
- source
112
- end
113
-
114
80
  # Prints xml of the current page
115
81
  # @return [void]
116
82
  def source
@@ -400,14 +366,10 @@ module Appium
400
366
  find_elements :uiautomator, string_visible_exact(class_name, value)
401
367
  end
402
368
 
403
- # Returns XML string for the current page
404
- # Fixes uiautomator's $ in node names.
405
- # `android.app.ActionBar$Tab` becomes `android.app.ActionBar.Tab`
369
+ # Returns XML string for the current page via `page_source`
406
370
  # @return [String]
407
371
  def get_source
408
- src = @driver.page_source
409
- src = _fix_android_native_source src unless src && src.start_with?('<html>')
410
- src
372
+ @driver.page_source
411
373
  end
412
374
  end # module Android
413
375
  end # module Appium
@@ -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.4.3'.freeze unless defined? ::Appium::VERSION
4
- DATE = '2017-05-03'.freeze unless defined? ::Appium::DATE
3
+ VERSION = '9.4.4'.freeze unless defined? ::Appium::VERSION
4
+ DATE = '2017-05-13'.freeze unless defined? ::Appium::DATE
5
5
  end
@@ -64,10 +64,14 @@ module Appium
64
64
  # @!method hide_keyboard
65
65
  # Hide the onscreen keyboard
66
66
  # @param [String] close_key The name of the key which closes the keyboard.
67
- # Defaults to 'Done'.
67
+ # Defaults to 'Done' for iOS(except for XCUITest).
68
+ # @param [Symbol] strategy The symbol of the strategy which closes the keyboard.
69
+ # XCUITest ignore this argument.
70
+ # Default for iOS is `:pressKey`. Default for Android is `:tapOutside`.
68
71
  # ```ruby
69
72
  # hide_keyboard # Close a keyboard with the 'Done' button
70
73
  # hide_keyboard('Finished') # Close a keyboard with the 'Finished' button
74
+ # hide_keyboard(nil, :tapOutside) # Close a keyboard with tapping out side of keyboard
71
75
  # ```
72
76
 
73
77
  # @!method press_keycode
@@ -273,20 +277,20 @@ module Appium
273
277
  end
274
278
 
275
279
  add_endpoint_method(:hide_keyboard) do
276
- def hide_keyboard(close_key = nil)
277
- # Android can only tapOutside.
278
- if $driver.device_is_android?
279
- return execute :hide_keyboard, {}, strategy: :tapOutside
280
- end
281
-
282
- close_key ||= 'Done' # default to Done key.
283
- if $driver.automation_name_is_xcuitest?
284
- # strategy is not implemented in the following
285
- # https://github.com/appium/appium-xcuitest-driver/blob/v2.2.0/lib/commands/general.js#L51
286
- execute :hide_keyboard, {}, strategy: :grouped, key: close_key
280
+ def hide_keyboard(close_key = nil, strategy = nil)
281
+ option = {}
282
+
283
+ if $driver.device_is_android? # Android can only tapOutside.
284
+ option[:key] = close_key if close_key
285
+ option[:strategy] = strategy || :tapOutside # default to pressKey
286
+ elsif $driver.automation_name_is_xcuitest?
287
+ option[:key] = close_key if close_key
288
+ option[:strategy] = strategy if strategy
287
289
  else
288
- $driver.hide_ios_keyboard close_key
290
+ option[:key] = close_key || 'Done' # default to Done key.
291
+ option[:strategy] = strategy || :pressKey # default to pressKey
289
292
  end
293
+ execute :hide_keyboard, {}, option
290
294
  end
291
295
  end
292
296
 
@@ -406,11 +406,10 @@ module Appium
406
406
  # load common methods
407
407
  extend Appium::Common
408
408
  extend Appium::Device
409
+
409
410
  if device_is_android?
410
- # load Android specific methods
411
411
  extend Appium::Android
412
412
  else
413
- # load iOS specific methods
414
413
  extend Appium::Ios
415
414
  extend Appium::Ios::XcuitestGesture if automation_name_is_xcuitest? # Override touch actions
416
415
  end
@@ -527,62 +527,6 @@ module Appium
527
527
  eles_by_json string_visible_exact element, value
528
528
  end
529
529
 
530
- # @private
531
- # For Appium(automation name), not XCUITest
532
- # If there's no keyboard, then do nothing.
533
- # If there's no close key, fallback to window tap.
534
- # If close key is present then tap it.
535
- # @param close_key [String] close key to tap. Default value is 'Done'
536
- # @return [void]
537
- def hide_ios_keyboard(close_key = 'Done')
538
- #
539
- # TODO: there are many various ways to hide the keyboard that work in different
540
- # app specific circumstances. webview keyboard will require a window.tap for example.
541
- #
542
- # Find the top left corner of the keyboard and move up 10 pixels (origin.y - 10)
543
- # now swipe down until the end of the window - 10 pixels.
544
- # -10 to ensure we're not going outside the window bounds.
545
- #
546
- # Swiping inside the keyboard will not dismiss it.
547
- #
548
- # If the 'Done' key exists then that should be pressed to dismiss the keyboard
549
- # because swiping to dismiss works only if such key doesn't exist.
550
- #
551
- # Don't use window.tap. See https://github.com/appium/appium-uiauto/issues/28
552
- #
553
- dismiss_keyboard = <<-JS.strip
554
- if (!au.mainApp().keyboard().isNil()) {
555
- var key = au.mainApp().keyboard().buttons()['#{close_key}']
556
- if (key.isNil()) {
557
- var startY = au.mainApp().keyboard().rect().origin.y - 10;
558
- var endY = au.mainWindow().rect().size.height - 10;
559
- au.flickApp(0, startY, 0, endY);
560
- } else {
561
- key.tap();
562
- }
563
- au.delay(1000);
564
- }
565
- JS
566
-
567
- ignore do
568
- # wait 5 seconds for a wild keyboard to appear. if the textfield is disabled
569
- # then setValue will work, however the keyboard will never display
570
- # because users are normally not allowed to type into it.
571
- wait_true(5) do
572
- execute_script '!au.mainApp().keyboard().isNil()'
573
- end
574
-
575
- # dismiss keyboard
576
- execute_script dismiss_keyboard
577
- end
578
-
579
- # wait 5 seconds for keyboard to go away.
580
- # if the keyboard isn't dismissed then wait_true will error.
581
- wait_true(5) do
582
- execute_script 'au.mainApp().keyboard().isNil()'
583
- end
584
- end
585
-
586
530
  #
587
531
  # predicate - the predicate to evaluate on the main app
588
532
  #
@@ -142,6 +142,23 @@ module Appium
142
142
  args[:offset] = offset if offset
143
143
  execute_script 'mobile: selectPickerWheelValue', args
144
144
  end
145
+
146
+ # @param action [String] The following actions are supported: accept, dismiss and getButtons. Mandatory parameter
147
+ # @param button_label [String] The label text of an existing alert button to click on.
148
+ # This is an optional parameter and is only valid in combination with accept and dismiss actions.
149
+ # @return nil or Selenium::WebDriver::Error::NoSuchAlertError if no action sheet or alert
150
+ #
151
+ # ```ruby
152
+ # alert action: "accept"
153
+ # alert action: "dismiss"
154
+ # ```
155
+ def alert(action:, button_label: nil)
156
+ return 'Set "accept", "dismiss" or "getButtons" for :action' unless %w(accept dismiss getButtons).include?(action)
157
+
158
+ args = { action: action }
159
+ args[:button_label] if button_label
160
+ execute_script 'mobile: alert', args
161
+ end
145
162
  end # module XcuitestGesture
146
163
  end # module Ios
147
164
  end # module Appium
@@ -1,3 +1,15 @@
1
+ #### v9.4.3 2017-05-03
2
+
3
+ - [c413bd7](https://github.com/appium/ruby_lib/commit/c413bd77d0fec58e1c2cce6821694bcf659b9e1b) [Release 9 4 3 (#566)](https://github.com/appium/ruby_lib/issues/566)
4
+ - [8e600af](https://github.com/appium/ruby_lib/commit/8e600af469f0e00f1fb6cce331c72b13d11598c8) [fix tests for uiautomator2 (#565)](https://github.com/appium/ruby_lib/issues/565)
5
+ - [ab8ecf8](https://github.com/appium/ruby_lib/commit/ab8ecf860088f690777e7c8086c31753463577c8) [Update android_uiautomator.md (#564)](https://github.com/appium/ruby_lib/issues/564)
6
+ - [4f035d3](https://github.com/appium/ruby_lib/commit/4f035d39a0b3a3c39a9ef6a5cd0d2cb19d39f7d4) [Use uiautomator for uiautomator2 (#561)](https://github.com/appium/ruby_lib/issues/561)
7
+ - [71d8eb6](https://github.com/appium/ruby_lib/commit/71d8eb676bf5ac6d83c5da112d068865d76ebab4) [Add link to issue in generating release notes (#562)](https://github.com/appium/ruby_lib/issues/562)
8
+ - [915e75d](https://github.com/appium/ruby_lib/commit/915e75d08e89b4248ca104124f7430463c13ab22) [don't use selenium-webdriver 3.5+ (#559)](https://github.com/appium/ruby_lib/issues/559)
9
+ - [7e9c8ef](https://github.com/appium/ruby_lib/commit/7e9c8ef7fbed4e076fa6aec49f20d786fa6cbdf6) [update workaround (#557)](https://github.com/appium/ruby_lib/issues/557)
10
+ - [801a5a0](https://github.com/appium/ruby_lib/commit/801a5a07e5c1c062f5d108a844721c7a569765a3) [add workaround (#556)](https://github.com/appium/ruby_lib/issues/556)
11
+
12
+
1
13
  #### v9.4.2 2017-04-21
2
14
 
3
15
  - [0cd41ef](https://github.com/appium/ruby_lib/commit/0cd41ef58b6abf8444fcb95db59aebb2c6c2a890) [Release 9 4 2 (#554)](https://github.com/appium/ruby_lib/issues/554)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appium_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 9.4.3
4
+ version: 9.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - code@bootstraponline.com
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-03 00:00:00.000000000 Z
11
+ date: 2017-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: selenium-webdriver
@@ -261,6 +261,7 @@ files:
261
261
  - docs/ios_docs.md
262
262
  - docs/ios_xcuitest.md
263
263
  - docs/migration.md
264
+ - docs/travis.sample.yml
264
265
  - docs_gen/docs_from_js.md
265
266
  - docs_gen/make_docs.rb
266
267
  - ios_tests/Gemfile