testa_appium_driver 0.1.13 → 0.1.14

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +23 -0
  3. data/.gitignore +0 -2
  4. data/.rubocop.yml +1 -1
  5. data/Gemfile +1 -1
  6. data/Gemfile.lock +74 -0
  7. data/appium-driver.iml +72 -0
  8. data/lib/testa_appium_driver/android/class_selectors.rb +7 -7
  9. data/lib/testa_appium_driver/android/driver.rb +1 -0
  10. data/lib/testa_appium_driver/android/locator/attributes.rb +29 -25
  11. data/lib/testa_appium_driver/android/locator.rb +1 -1
  12. data/lib/testa_appium_driver/android/selenium_element.rb +6 -2
  13. data/lib/testa_appium_driver/common/constants.rb +2 -1
  14. data/lib/testa_appium_driver/common/locator/scroll_actions.rb +33 -33
  15. data/lib/testa_appium_driver/common/locator.rb +42 -25
  16. data/lib/testa_appium_driver/common/scroll_actions/json_wire_scroll_actions.rb +1 -1
  17. data/lib/testa_appium_driver/common/scroll_actions/w3c_scroll_actions.rb +87 -20
  18. data/lib/testa_appium_driver/common/scroll_actions.rb +26 -19
  19. data/lib/testa_appium_driver/common/selenium_element.rb +2 -2
  20. data/lib/testa_appium_driver/driver.rb +33 -19
  21. data/lib/testa_appium_driver/ios/locator/attributes.rb +24 -20
  22. data/lib/testa_appium_driver/ios/locator.rb +1 -0
  23. data/lib/testa_appium_driver/ios/selenium_element.rb +2 -2
  24. data/lib/testa_appium_driver/ios/type_selectors.rb +2 -2
  25. data/lib/testa_appium_driver/version.rb +1 -1
  26. data/testa_appium_driver.gemspec +1 -1
  27. metadata +7 -14
  28. data/.idea/deployment.xml +0 -22
  29. data/.idea/inspectionProfiles/Project_Default.xml +0 -9
  30. data/.idea/misc.xml +0 -6
  31. data/.idea/modules.xml +0 -8
  32. data/.idea/runConfigurations/Android_Test.xml +0 -42
  33. data/.idea/runConfigurations.xml +0 -10
  34. data/.idea/sshConfigs.xml +0 -13
  35. data/.idea/vcs.xml +0 -6
  36. data/.idea/webServers.xml +0 -21
  37. data/testa_appium_driver.iml +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f2c8a8e6fd795af67dac4592eaffc07d186102a19b9ffec5bce2c390ebefbeb
4
- data.tar.gz: 97a681eeb0170cd7563a83a9385d12b15af0af4d6fbbec535f7421d8fa0d8c49
3
+ metadata.gz: 42baeaf531486245427c9a3e2bc002e8c6bf659ec2f7e010cc7f46a56c863f2c
4
+ data.tar.gz: 31ea0d036c32405f744dfdbbce04d596ff3822cd54144270bed08fd4e7e6c90c
5
5
  SHA512:
6
- metadata.gz: 5602bfd12d6c4473b09a5454f20f246e51924f791974047951b2923276464184bf96a61895847bc69650d59582eb768e8b2e8a233876c3a8b13b1bba0a533ec7
7
- data.tar.gz: 0c20fa50c39cab7adb5462247a4eb1aeb6e9c8edaa1b6c47dd1e2894b8bfe6e4b12bae35ef7f179815dc37dfff34bfc393d3342c1153aa1fc8d45226f0863173
6
+ metadata.gz: 59ac915f5a1036eb9c943c8770295aaa5def6268685f9db2f7b802d9ac19128d39348c4a3cc9010d45fd0fea5f0ced98327f94a124b0eac55cfaff7b310193aa
7
+ data.tar.gz: aec59ca33a54aed586c832e82a5aa11ca9d331759aea810a89e6e6e0bd9193f48af7b69d6323427413dffba1d3e5bd693d726db4bc88d4f6f3d7439e55bcc00d
data/.gitattributes ADDED
@@ -0,0 +1,23 @@
1
+ # Set the default behavior, in case people don't have core.autocrlf set.
2
+ * text=auto
3
+
4
+ # Declare files that will always have LF line endings on checkout.
5
+ *.rb text eol=lf
6
+ *.yml text eol=lf
7
+ *.sh text eol=lf
8
+ *.Dockerfile eol=lf
9
+ *.dockerfile eol=lf
10
+ *.conf eol=lf
11
+ *.ru eol=lf
12
+ *.json eol=lf
13
+ *.js eol=lf
14
+ *.css eol=lf
15
+ *.erb eol=lf
16
+ *.html eol=lf
17
+ *.map eol=lf
18
+
19
+ # Denote all files that are truly binary and should not be modified.
20
+ *.png binary
21
+ *.jpg binary
22
+ *.bin binary
23
+ *.zip binary
data/.gitignore CHANGED
@@ -13,6 +13,4 @@
13
13
  /.idea/deployment.xml
14
14
  /.idea/workspace.xml
15
15
  /.idea/misc.xml
16
- Gemfile.lock
17
- testa_appium_driver.iml
18
16
  testa_appium_driver-*.gem
data/.rubocop.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.4
2
+ TargetRubyVersion: 2.7.6
3
3
 
4
4
  Style/StringLiterals:
5
5
  Enabled: true
data/Gemfile CHANGED
@@ -9,4 +9,4 @@ gem "rake", "~> 13.0"
9
9
 
10
10
  gem "rspec", "~> 3.0"
11
11
 
12
- gem "rubocop", "~> 1.7"
12
+ gem "rubocop", "~> 1.26.0", require: false
data/Gemfile.lock ADDED
@@ -0,0 +1,74 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ testa_appium_driver (0.1.131)
5
+ appium_lib_core (= 5.1.0)
6
+ json (~> 2.3)
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ appium_lib_core (5.1.0)
12
+ faye-websocket (~> 0.11.0)
13
+ selenium-webdriver (~> 4.0)
14
+ ast (2.4.2)
15
+ childprocess (4.1.0)
16
+ diff-lcs (1.5.0)
17
+ eventmachine (1.2.7)
18
+ faye-websocket (0.11.1)
19
+ eventmachine (>= 0.12.0)
20
+ websocket-driver (>= 0.5.1)
21
+ json (2.6.2)
22
+ parallel (1.22.1)
23
+ parser (3.1.2.0)
24
+ ast (~> 2.4.1)
25
+ rainbow (3.1.1)
26
+ rake (13.0.6)
27
+ regexp_parser (2.4.0)
28
+ rexml (3.2.5)
29
+ rspec (3.11.0)
30
+ rspec-core (~> 3.11.0)
31
+ rspec-expectations (~> 3.11.0)
32
+ rspec-mocks (~> 3.11.0)
33
+ rspec-core (3.11.0)
34
+ rspec-support (~> 3.11.0)
35
+ rspec-expectations (3.11.0)
36
+ diff-lcs (>= 1.2.0, < 2.0)
37
+ rspec-support (~> 3.11.0)
38
+ rspec-mocks (3.11.1)
39
+ diff-lcs (>= 1.2.0, < 2.0)
40
+ rspec-support (~> 3.11.0)
41
+ rspec-support (3.11.0)
42
+ rubocop (1.26.0)
43
+ parallel (~> 1.10)
44
+ parser (>= 3.1.0.0)
45
+ rainbow (>= 2.2.2, < 4.0)
46
+ regexp_parser (>= 1.8, < 3.0)
47
+ rexml
48
+ rubocop-ast (>= 1.16.0, < 2.0)
49
+ ruby-progressbar (~> 1.7)
50
+ unicode-display_width (>= 1.4.0, < 3.0)
51
+ rubocop-ast (1.18.0)
52
+ parser (>= 3.1.1.0)
53
+ ruby-progressbar (1.11.0)
54
+ rubyzip (2.3.2)
55
+ selenium-webdriver (4.1.0)
56
+ childprocess (>= 0.5, < 5.0)
57
+ rexml (~> 3.2, >= 3.2.5)
58
+ rubyzip (>= 1.2.2)
59
+ unicode-display_width (2.1.0)
60
+ websocket-driver (0.7.5)
61
+ websocket-extensions (>= 0.1.0)
62
+ websocket-extensions (0.1.5)
63
+
64
+ PLATFORMS
65
+ ruby
66
+
67
+ DEPENDENCIES
68
+ rake (~> 13.0)
69
+ rspec (~> 3.0)
70
+ rubocop (~> 1.26.0)
71
+ testa_appium_driver!
72
+
73
+ BUNDLED WITH
74
+ 2.1.2
data/appium-driver.iml ADDED
@@ -0,0 +1,72 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="RUBY_MODULE" version="4">
3
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
4
+ <exclude-output />
5
+ <content url="file://$MODULE_DIR$">
6
+ <sourceFolder url="file://$MODULE_DIR$/lib" isTestSource="false" />
7
+ <sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
8
+ </content>
9
+ <orderEntry type="jdk" jdkName="RVM: ruby-2.7.6" jdkType="RUBY_SDK" />
10
+ <orderEntry type="sourceFolder" forTests="false" />
11
+ <orderEntry type="library" scope="PROVIDED" name="appium_lib_core (v5.1.0, RVM: ruby-2.7.6) [gem]" level="application" />
12
+ <orderEntry type="library" scope="PROVIDED" name="ast (v2.4.2, RVM: ruby-2.7.6) [gem]" level="application" />
13
+ <orderEntry type="library" scope="PROVIDED" name="childprocess (v4.1.0, RVM: ruby-2.7.6) [gem]" level="application" />
14
+ <orderEntry type="library" scope="PROVIDED" name="diff-lcs (v1.5.0, RVM: ruby-2.7.6) [gem]" level="application" />
15
+ <orderEntry type="library" scope="PROVIDED" name="eventmachine (v1.2.7, RVM: ruby-2.7.6) [gem]" level="application" />
16
+ <orderEntry type="library" scope="PROVIDED" name="faye-websocket (v0.11.1, RVM: ruby-2.7.6) [gem]" level="application" />
17
+ <orderEntry type="library" scope="PROVIDED" name="json (v2.6.2, RVM: ruby-2.7.6) [gem]" level="application" />
18
+ <orderEntry type="library" scope="PROVIDED" name="parallel (v1.22.1, RVM: ruby-2.7.6) [gem]" level="application" />
19
+ <orderEntry type="library" scope="PROVIDED" name="parser (v3.1.2.0, RVM: ruby-2.7.6) [gem]" level="application" />
20
+ <orderEntry type="library" scope="PROVIDED" name="rainbow (v3.1.1, RVM: ruby-2.7.6) [gem]" level="application" />
21
+ <orderEntry type="library" scope="PROVIDED" name="rake (v13.0.6, RVM: ruby-2.7.6) [gem]" level="application" />
22
+ <orderEntry type="library" scope="PROVIDED" name="regexp_parser (v2.4.0, RVM: ruby-2.7.6) [gem]" level="application" />
23
+ <orderEntry type="library" scope="PROVIDED" name="rexml (v3.2.5, RVM: ruby-2.7.6) [gem]" level="application" />
24
+ <orderEntry type="library" scope="PROVIDED" name="rspec (v3.11.0, RVM: ruby-2.7.6) [gem]" level="application" />
25
+ <orderEntry type="library" scope="PROVIDED" name="rspec-core (v3.11.0, RVM: ruby-2.7.6) [gem]" level="application" />
26
+ <orderEntry type="library" scope="PROVIDED" name="rspec-expectations (v3.11.0, RVM: ruby-2.7.6) [gem]" level="application" />
27
+ <orderEntry type="library" scope="PROVIDED" name="rspec-mocks (v3.11.1, RVM: ruby-2.7.6) [gem]" level="application" />
28
+ <orderEntry type="library" scope="PROVIDED" name="rspec-support (v3.11.0, RVM: ruby-2.7.6) [gem]" level="application" />
29
+ <orderEntry type="library" scope="PROVIDED" name="rubocop (v1.26.0, RVM: ruby-2.7.6) [gem]" level="application" />
30
+ <orderEntry type="library" scope="PROVIDED" name="rubocop-ast (v1.18.0, RVM: ruby-2.7.6) [gem]" level="application" />
31
+ <orderEntry type="library" scope="PROVIDED" name="ruby-progressbar (v1.11.0, RVM: ruby-2.7.6) [gem]" level="application" />
32
+ <orderEntry type="library" scope="PROVIDED" name="rubyzip (v2.3.2, RVM: ruby-2.7.6) [gem]" level="application" />
33
+ <orderEntry type="library" scope="PROVIDED" name="selenium-webdriver (v4.1.0, RVM: ruby-2.7.6) [gem]" level="application" />
34
+ <orderEntry type="library" scope="PROVIDED" name="unicode-display_width (v2.1.0, RVM: ruby-2.7.6) [gem]" level="application" />
35
+ <orderEntry type="library" scope="PROVIDED" name="websocket-driver (v0.7.5, RVM: ruby-2.7.6) [gem]" level="application" />
36
+ <orderEntry type="library" scope="PROVIDED" name="websocket-extensions (v0.1.5, RVM: ruby-2.7.6) [gem]" level="application" />
37
+ </component>
38
+ <component name="RakeTasksCache">
39
+ <option name="myRootTask">
40
+ <RakeTaskImpl id="rake">
41
+ <subtasks>
42
+ <RakeTaskImpl description="Build testa_appium_driver-0.1.131.gem into the pkg directory" fullCommand="build" id="build" />
43
+ <RakeTaskImpl description="Remove any temporary products" fullCommand="clean" id="clean" />
44
+ <RakeTaskImpl description="Remove any generated files" fullCommand="clobber" id="clobber" />
45
+ <RakeTaskImpl description="Build and install testa_appium_driver-0.1.131.gem into system gems" fullCommand="install" id="install" />
46
+ <RakeTaskImpl id="install">
47
+ <subtasks>
48
+ <RakeTaskImpl description="Build and install testa_appium_driver-0.1.131.gem into system gems without network access" fullCommand="install:local" id="local" />
49
+ </subtasks>
50
+ </RakeTaskImpl>
51
+ <RakeTaskImpl description="Create tag v0.1.131 and build and push testa_appium_driver-0.1.131.gem to rubygems.org" fullCommand="release[remote]" id="release[remote]" />
52
+ <RakeTaskImpl description="Run RuboCop" fullCommand="rubocop" id="rubocop" />
53
+ <RakeTaskImpl id="rubocop">
54
+ <subtasks>
55
+ <RakeTaskImpl description="Auto-correct RuboCop offenses" fullCommand="rubocop:auto_correct" id="auto_correct" />
56
+ </subtasks>
57
+ </RakeTaskImpl>
58
+ <RakeTaskImpl description="Run RSpec code examples" fullCommand="spec" id="spec" />
59
+ <RakeTaskImpl description="" fullCommand="default" id="default" />
60
+ <RakeTaskImpl description="" fullCommand="release" id="release" />
61
+ <RakeTaskImpl id="release">
62
+ <subtasks>
63
+ <RakeTaskImpl description="" fullCommand="release:guard_clean" id="guard_clean" />
64
+ <RakeTaskImpl description="" fullCommand="release:rubygem_push" id="rubygem_push" />
65
+ <RakeTaskImpl description="" fullCommand="release:source_control_push" id="source_control_push" />
66
+ </subtasks>
67
+ </RakeTaskImpl>
68
+ </subtasks>
69
+ </RakeTaskImpl>
70
+ </option>
71
+ </component>
72
+ </module>
@@ -1,14 +1,14 @@
1
- module TestaAppiumDriver
1
+ module ::TestaAppiumDriver
2
2
  #noinspection ALL
3
3
  module ClassSelectors
4
4
 
5
5
  # @return [TestaAppiumDriver::Locator]
6
6
  def add_selector(*args, &block)
7
7
  # if class selector is executed from driver, create new locator instance
8
- if self.kind_of?(TestaAppiumDriver::Driver) || self.instance_of?(Selenium::WebDriver::Element)
8
+ if self.kind_of?(TestaAppiumDriver::Driver) || self.instance_of?(::Selenium::WebDriver::Element) || self.instance_of?(::Appium::Core::Element)
9
9
  args.last[:default_find_strategy] = @default_find_strategy
10
10
  args.last[:default_scroll_strategy] = @default_scroll_strategy
11
- if self.instance_of?(Selenium::WebDriver::Element)
11
+ if self.instance_of?(::Selenium::WebDriver::Element) || self.instance_of?(::Appium::Core::Element)
12
12
  driver = self.get_driver
13
13
  else
14
14
  driver = self
@@ -117,17 +117,17 @@ module TestaAppiumDriver
117
117
  add_selector(params)
118
118
  end
119
119
 
120
- # first android.widget.ViewGroup element that match given selectors
120
+ # first android.view.ViewGroup element that match given selectors
121
121
  # @return [TestaAppiumDriver::Locator]
122
122
  def view_group(params = {})
123
- params[:class] = "android.widget.ViewGroup"
123
+ params[:class] = "android.view.ViewGroup"
124
124
  add_selector(params)
125
125
  end
126
126
 
127
- # all android.widget.ViewGroup elements that match given selectors
127
+ # all android.view.ViewGroup elements that match given selectors
128
128
  # @return [TestaAppiumDriver::Locator]
129
129
  def view_groups(params = {})
130
- params[:class] = "android.widget.ViewGroup"
130
+ params[:class] = "android.view.ViewGroup"
131
131
  params[:single] = false
132
132
  add_selector(params)
133
133
  end
@@ -8,6 +8,7 @@ module TestaAppiumDriver
8
8
  include ClassSelectors
9
9
 
10
10
 
11
+
11
12
  # executes shell command
12
13
  # @param [String] command Shell command name to execute for example echo or rm
13
14
  # @param [Array<String>] args Array of command arguments, example: ['-f', '/sdcard/my_file.txt']
@@ -2,12 +2,18 @@ module TestaAppiumDriver
2
2
  module Attributes
3
3
 
4
4
  #noinspection RubyNilAnalysis
5
- def attribute(name, *args)
6
- elements = execute(*args)
5
+ def testa_attribute(name, *args)
6
+ if self.instance_of?(::Selenium::WebDriver::Element) || self.instance_of?(::Appium::Core::Element)
7
+ @driver = get_driver # does not get correct driver
8
+ elements = self
9
+ else
10
+ elements = execute(*args)
11
+ raise "Element not found" if elements.nil?
12
+ end
7
13
 
8
- @driver = get_driver if self.instance_of?(Selenium::WebDriver::Element)
9
14
 
10
- if elements.kind_of?(Selenium::WebDriver::Element)
15
+
16
+ if elements.kind_of?(::Selenium::WebDriver::Element) || elements.kind_of?(::Appium::Core::Element)
11
17
  r = elements.send(:attribute, name.to_s)
12
18
  r = TestaAppiumDriver::Bounds.from_android(r, @driver) if name.to_s == "bounds"
13
19
  else
@@ -18,86 +24,84 @@ module TestaAppiumDriver
18
24
  end
19
25
 
20
26
  def text(*args)
21
- attribute("text", *args)
27
+ testa_attribute("text", *args)
22
28
  end
23
29
 
24
30
  def package(*args)
25
- attribute("package", *args)
31
+ testa_attribute("package", *args)
26
32
  end
27
33
 
28
34
  def class_name(*args)
29
- attribute("className", *args)
35
+ testa_attribute("className", *args)
30
36
  end
31
37
 
32
38
  def checkable?(*args)
33
- attribute("checkable", *args).to_s == "true"
39
+ testa_attribute("checkable", *args).to_s == "true"
34
40
  end
35
41
 
36
42
  def checked?(*args)
37
- attribute("checked", *args).to_s == "true"
43
+ testa_attribute("checked", *args).to_s == "true"
38
44
  end
39
45
 
40
46
  def clickable?(*args)
41
- attribute("clickable", *args).to_s == "true"
47
+ testa_attribute("clickable", *args).to_s == "true"
42
48
  end
43
49
 
44
50
  def desc(*args)
45
- attribute("contentDescription", *args)
51
+ testa_attribute("contentDescription", *args)
46
52
  end
47
53
 
48
54
  def enabled?(*args)
49
- attribute("enabled", *args).to_s == "true"
55
+ testa_attribute("enabled", *args).to_s == "true"
50
56
  end
51
57
 
52
58
  def focusable?(*args)
53
- attribute("focusable", *args).to_s == "true"
59
+ testa_attribute("focusable", *args).to_s == "true"
54
60
  end
55
61
 
56
62
  def focused?(*args)
57
- attribute("focused", *args).to_s == "true"
63
+ testa_attribute("focused", *args).to_s == "true"
58
64
  end
59
65
 
60
66
  def long_clickable?(*args)
61
- attribute("longClickable", *args).to_s == "true"
67
+ testa_attribute("longClickable", *args).to_s == "true"
62
68
  end
63
69
 
64
70
  def password?(*args)
65
- attribute("password", *args).to_s == "true"
71
+ testa_attribute("password", *args).to_s == "true"
66
72
  end
67
73
 
68
74
  def id(*args)
69
- attribute("resourceId", *args)
75
+ testa_attribute("resourceId", *args)
70
76
  end
71
77
 
72
78
  def scrollable?(*args)
73
- attribute("scrollable", *args).to_s == "true"
79
+ testa_attribute("scrollable", *args).to_s == "true"
74
80
  end
75
81
 
76
82
  def selected?(*args)
77
- attribute("selected", *args).to_s == "true"
83
+ testa_attribute("selected", *args).to_s == "true"
78
84
  end
79
85
 
80
86
  def displayed?(*args)
81
- attribute("displayed", *args).to_s == "true"
87
+ testa_attribute("displayed", *args).to_s == "true"
82
88
  end
83
89
 
84
90
  def selection_start(*args)
85
- attribute("selection-start", *args)
91
+ testa_attribute("selection-start", *args)
86
92
  end
87
93
 
88
94
  def selection_end(*args)
89
- attribute("selection-end", *args)
95
+ testa_attribute("selection-end", *args)
90
96
  end
91
97
 
92
98
  def bounds(*args)
93
- attribute("bounds", *args)
99
+ testa_attribute("bounds", *args)
94
100
  end
95
101
 
96
102
  end
97
103
 
98
104
  class Locator
99
- include TestaAppiumDriver::Attributes
100
-
101
105
 
102
106
  # element index in parent element, starts from 0
103
107
  #noinspection RubyNilAnalysis,RubyYardReturnMatch
@@ -5,6 +5,7 @@ module TestaAppiumDriver
5
5
  class Locator
6
6
  attr_accessor :closing_parenthesis
7
7
  include ClassSelectors
8
+ include Attributes
8
9
 
9
10
  def init(params, selectors, single)
10
11
  @closing_parenthesis = 0
@@ -12,7 +13,6 @@ module TestaAppiumDriver
12
13
 
13
14
  @ui_selector = hash_to_uiautomator(selectors, single)
14
15
 
15
-
16
16
  if is_scrollable_selector?(selectors, single)
17
17
  if selectors[:class] == "android.widget.HorizontalScrollView"
18
18
  @scroll_orientation = :horizontal
@@ -1,8 +1,12 @@
1
- module Selenium
2
- module WebDriver
1
+ module ::Appium
2
+ module Core
3
3
  class Element
4
4
  include TestaAppiumDriver::ClassSelectors
5
5
  include TestaAppiumDriver::Attributes
6
+
7
+ def parent
8
+ self.find_element(xpath: "./..")
9
+ end
6
10
  end
7
11
  end
8
12
  end
@@ -24,7 +24,8 @@ module TestaAppiumDriver
24
24
  DEFAULT_UIAUTOMATOR_MAX_SWIPES = 20
25
25
 
26
26
  DEFAULT_ANDROID_FIND_STRATEGY = FIND_STRATEGY_UIAUTOMATOR
27
- DEFAULT_ANDROID_SCROLL_STRATEGY = SCROLL_STRATEGY_UIAUTOMATOR
27
+ #DEFAULT_ANDROID_SCROLL_STRATEGY = SCROLL_STRATEGY_UIAUTOMATOR
28
+ DEFAULT_ANDROID_SCROLL_STRATEGY = SCROLL_STRATEGY_W3C
28
29
 
29
30
 
30
31
  DEFAULT_IOS_FIND_STRATEGY = FIND_STRATEGY_XPATH
@@ -20,7 +20,7 @@ module TestaAppiumDriver
20
20
  # scrolls to the start of the scrollable containers and scrolls to the end,
21
21
  # everytime a locator element is found the given block is executed
22
22
  # @return [Array<Selenium::WebDriver::Element>]
23
- def each(top: nil, bottom: nil, right: nil, left: nil, direction: nil, &block)
23
+ def scroll_each(top: nil, bottom: nil, right: nil, left: nil, direction: nil, &block)
24
24
  deadzone = _process_deadzone(top, bottom, right, left)
25
25
  raise "Each can only be performed on multiple elements locator" if @single
26
26
  deadzone = @scrollable_locator.scroll_deadzone if deadzone.nil? && !@scrollable_locator.nil?
@@ -29,38 +29,38 @@ module TestaAppiumDriver
29
29
  deadzone: deadzone,
30
30
  default_scroll_strategy: @default_scroll_strategy)
31
31
  if direction.nil?
32
- sa.each(&block)
32
+ sa.scroll_each(&block)
33
33
  else
34
- sa.send("each_#{direction}", &block)
34
+ sa.send("scroll_each_#{direction}", &block)
35
35
  end
36
36
  end
37
37
 
38
38
  # scrolls down from the current page view (without prior scrolling to the top) and
39
39
  # everytime a locator element is found the given block is executed
40
40
  # @return [Array<Selenium::WebDriver::Element>]
41
- def each_down(top: nil, bottom: nil, right: nil, left: nil, &block)
42
- each(top: top, bottom: bottom, right: right, left: left, direction: :down, &block)
41
+ def scroll_each_down(top: nil, bottom: nil, right: nil, left: nil, &block)
42
+ scroll_each(top: top, bottom: bottom, right: right, left: left, direction: :down, &block)
43
43
  end
44
44
 
45
45
  # scrolls up from the current page view (without prior scrolling to the bottom) and
46
46
  # everytime a locator element is found the given block is executed
47
47
  # @return [Array<Selenium::WebDriver::Element>]
48
- def each_up(top: nil, bottom: nil, right: nil, left: nil, &block)
49
- each(top: top, bottom: bottom, right: right, left: left, direction: :up, &block)
48
+ def scroll_each_up(top: nil, bottom: nil, right: nil, left: nil, &block)
49
+ scroll_each(top: top, bottom: bottom, right: right, left: left, direction: :up, &block)
50
50
  end
51
51
 
52
52
  # scrolls right from the current page view (without prior scrolling to the left) and
53
53
  # everytime a locator element is found the given block is executed
54
54
  # @return [Array<Selenium::WebDriver::Element>]
55
- def each_right(top: nil, bottom: nil, right: nil, left: nil, &block)
56
- each(top: top, bottom: bottom, right: right, left: left, direction: :right, &block)
55
+ def scroll_each_right(top: nil, bottom: nil, right: nil, left: nil, &block)
56
+ scroll_each(top: top, bottom: bottom, right: right, left: left, direction: :right, &block)
57
57
  end
58
58
 
59
59
  # scrolls left from the current page view (without prior scrolling to the right) and
60
60
  # everytime a locator element is found the given block is executed
61
61
  # @return [Array<Selenium::WebDriver::Element>]
62
- def each_left(top: nil, bottom: nil, right: nil, left: nil, &block)
63
- each(top: top, bottom: bottom, right: right, left: left, direction: :left, &block)
62
+ def scroll_each_left(top: nil, bottom: nil, right: nil, left: nil, &block)
63
+ scroll_each(top: top, bottom: bottom, right: right, left: left, direction: :left, &block)
64
64
  end
65
65
 
66
66
 
@@ -69,14 +69,14 @@ module TestaAppiumDriver
69
69
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
70
70
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
71
71
  # @return [TestaAppiumDriver::Locator]
72
- def align(with = :top, top: nil, bottom: nil, right: nil, left: nil, scroll_to_find: false)
72
+ def align(with = :top, top: nil, bottom: nil, right: nil, left: nil, scroll_to_find: false, max_attempts: 3)
73
73
  deadzone = _process_deadzone(top, bottom, right, left)
74
74
  deadzone = @scrollable_locator.scroll_deadzone if deadzone.nil? && !@scrollable_locator.nil?
75
75
  sa = ScrollActions.new(@scrollable_locator,
76
76
  locator: self,
77
77
  deadzone: deadzone,
78
78
  default_scroll_strategy: @default_scroll_strategy)
79
- sa.align(with, scroll_to_find)
79
+ sa.align(with, scroll_to_find, max_attempts)
80
80
  self
81
81
  end
82
82
 
@@ -85,8 +85,8 @@ module TestaAppiumDriver
85
85
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
86
86
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
87
87
  # @return [TestaAppiumDriver::Locator]
88
- def align_top(top: nil, bottom: nil, right: nil, left: nil)
89
- align(:top, top: top, bottom: bottom, right: right, left: left)
88
+ def align_top(top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
89
+ align(:top, top: top, bottom: bottom, right: right, left: left, max_attempts: max_attempts)
90
90
  end
91
91
 
92
92
  # Aligns element on bottom of the scrollable container, if the element does not exists it will scroll to find it
@@ -94,8 +94,8 @@ module TestaAppiumDriver
94
94
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
95
95
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
96
96
  # @return [TestaAppiumDriver::Locator]
97
- def align_bottom(top: nil, bottom: nil, right: nil, left: nil)
98
- align(:bottom, top: top, bottom: bottom, right: right, left: left)
97
+ def align_bottom(top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
98
+ align(:bottom, top: top, bottom: bottom, right: right, left: left, max_attempts: max_attempts)
99
99
  end
100
100
 
101
101
  # Aligns element on left of the scrollable container, if the element does not exists it will scroll to find it
@@ -103,8 +103,8 @@ module TestaAppiumDriver
103
103
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
104
104
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
105
105
  # @return [TestaAppiumDriver::Locator]
106
- def align_left(top: nil, bottom: nil, right: nil, left: nil)
107
- align(:left, top: top, bottom: bottom, right: right, left: left)
106
+ def align_left(top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
107
+ align(:left, top: top, bottom: bottom, right: right, left: left, max_attempts: max_attempts)
108
108
  end
109
109
 
110
110
  # Aligns element on right of the scrollable container, if the element does not exists it will scroll to find it
@@ -112,8 +112,8 @@ module TestaAppiumDriver
112
112
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
113
113
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
114
114
  # @return [TestaAppiumDriver::Locator]
115
- def align_right(top: nil, bottom: nil, right: nil, left: nil)
116
- align(:right, top: top, bottom: bottom, right: right, left: left)
115
+ def align_right(top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
116
+ align(:right, top: top, bottom: bottom, right: right, left: left, max_attempts: max_attempts)
117
117
  end
118
118
 
119
119
  # Aligns element (by default) on top of the scrollable container, if the element does not exists it raise an exception
@@ -121,8 +121,8 @@ module TestaAppiumDriver
121
121
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
122
122
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
123
123
  # @return [TestaAppiumDriver::Locator]
124
- def align!(with = :top, top: nil, bottom: nil, right: nil, left: nil)
125
- align(with, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true)
124
+ def align!(with = :top, top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
125
+ align(with, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true, max_attempts: max_attempts)
126
126
  end
127
127
 
128
128
  # Aligns element on top of the scrollable container, if the element does not exists it raise an exception
@@ -130,8 +130,8 @@ module TestaAppiumDriver
130
130
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
131
131
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
132
132
  # @return [TestaAppiumDriver::Locator]
133
- def align_top!(top: nil, bottom: nil, right: nil, left: nil)
134
- align(:top, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true)
133
+ def align_top!(top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
134
+ align(:top, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true, max_attempts: max_attempts)
135
135
  end
136
136
 
137
137
  # Aligns element on bottom of the scrollable container, if the element does not exists it raise an exception
@@ -139,8 +139,8 @@ module TestaAppiumDriver
139
139
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
140
140
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
141
141
  # @return [TestaAppiumDriver::Locator]
142
- def align_bottom!(top: nil, bottom: nil, right: nil, left: nil)
143
- align(:bottom, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true)
142
+ def align_bottom!(top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
143
+ align(:bottom, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true, max_attempts: max_attempts)
144
144
  end
145
145
 
146
146
  # Aligns element on left of the scrollable container, if the element does not exists it raise an exception
@@ -148,8 +148,8 @@ module TestaAppiumDriver
148
148
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
149
149
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
150
150
  # @return [TestaAppiumDriver::Locator]
151
- def align_left!(top: nil, bottom: nil, right: nil, left: nil)
152
- align(:left, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true)
151
+ def align_left!(top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
152
+ align(:left, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true, max_attempts: max_attempts)
153
153
  end
154
154
 
155
155
  # Aligns element on right of the scrollable container, if the element does not exists it raise an exception
@@ -157,8 +157,8 @@ module TestaAppiumDriver
157
157
  # If the distance is greater than the threshold, it will attempt to realign it up to 2 more times.
158
158
  # The retry mechanism allows alignment even for dynamic layouts when elements are hidden/show when scrolling to certain direction
159
159
  # @return [TestaAppiumDriver::Locator]
160
- def align_right!(top: nil, bottom: nil, right: nil, left: nil)
161
- align(:right, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true)
160
+ def align_right!(top: nil, bottom: nil, right: nil, left: nil, max_attempts: 3)
161
+ align(:right, top: top, bottom: bottom, right: right, left: left, scroll_to_find: true, max_attempts: max_attempts)
162
162
  end
163
163
 
164
164
 
@@ -271,10 +271,10 @@ module TestaAppiumDriver
271
271
  # @param [TestaAppiumDriver::Locator, Hash, Selenium::WebDriver::Element, String] to
272
272
  #noinspection RubyYardParamTypeMatch,RubyScope
273
273
  def drag_to(to)
274
- if !to.kind_of?(Selenium::WebDriver::Element) && !to.kind_of?(TestaAppiumDriver::Locator) && !to.kind_of?(Hash)
274
+ if !to.kind_of?(::Selenium::WebDriver::Element) && !to.kind_of?(::Appium::Core::Element) && !to.kind_of?(TestaAppiumDriver::Locator) && !to.kind_of?(Hash)
275
275
  raise "Parameter not accepted, acceptable instances of [TestaAppiumDriver::Locator, Hash, Selenium::WebDriver::Element]"
276
276
  end
277
- if to.kind_of?(Selenium::WebDriver::Element)
277
+ if to.kind_of?(::Selenium::WebDriver::Element) || to.kind_of?(::Appium::Core::Element)
278
278
  bounds = TestaAppiumDriver::Bounds.from_android(to.bounds, @driver)
279
279
  x = bounds.center.x
280
280
  y = bounds.center.y