appom 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7dfe63bdf19bf6f40316e2936d3999a4b38c318fea12b9c6c4da67349ac0e5d5
4
- data.tar.gz: 0fd90a46359d87728ef19c10369710a47957ce23773e7b850531e9751a5656c9
3
+ metadata.gz: a2f17ca36a2cd4e5621ecf4f2d2d842f229494df5cb2ca7629fb02faba05115f
4
+ data.tar.gz: 646ba303457e66fd2517b45100efac3e15bd97d1fd3ced1d7bc9cccccdacc4aa
5
5
  SHA512:
6
- metadata.gz: 257d602e52213df6d7cf4bc87c8b40aa97926047bfa0af025f226c68c215a8261cf6e8e6327de02c12ddec8acf14b8b5455e6daa4197156cb2c5c7c91c4236fc
7
- data.tar.gz: d8ddb29f6881a3e9ab4204917642f36f2767359f77e614fe43785c36e24bd8cef8331500edc0c8c8f2f669cf97f1527485d918b4bbba102740f3c808032fe71c
6
+ metadata.gz: aad052c0abe308b033616d60e94598c500d2eebba065677a49ac59fe170227305fea83f7a918c3be2f7265fec82fed4920c5257de92057cf36d759ddc1564540
7
+ data.tar.gz: 50b469a37d97e15f9a001b7e9cda5c7e5ea7a37598b7667259bbac93d6c9cdee999c6e5584fccf7afd4e57514bba6194f6e19ce9fdf2c699ee01b489cc8c4fc4
data/README.md CHANGED
@@ -45,6 +45,12 @@ end
45
45
  ```
46
46
  `appium_lib_options` and `caps` are options to initiate a appium driver. You can follow [Appium Ruby Client](https://github.com/appium/ruby_lib)
47
47
 
48
+ ### Change default max wait time
49
+ ```ruby
50
+ Appom.configure do |config|
51
+ config.max_wait_time = 30
52
+ end
53
+ ```
48
54
 
49
55
  ### Define a page
50
56
  ```ruby
@@ -55,6 +61,9 @@ class LoginPage < Appom::Page
55
61
  end
56
62
  ```
57
63
 
64
+ The Appom Wiki has lots of additional information about Appom. Please browse the Wiki after finishing this README:
65
+ https://github.com/hoangtaiki/appom/wiki
66
+
58
67
  ## Example
59
68
  [authentication-appom-appium](https://github.com/hoangtaiki/authentication-appom-appium) is an example about using Appom with Appium.
60
69
 
data/lib/appom.rb CHANGED
@@ -5,16 +5,28 @@ require 'appium_lib'
5
5
  require 'appom/cucumber'
6
6
 
7
7
  module Appom
8
- # A item was defined without a selector
8
+ # A item was defined without a selector.
9
9
  class InvalidElementError < StandardError; end
10
- # A block was passed to the method, which it cannot interpret
10
+ # A block was passed to the method, which it cannot interpreter.
11
11
  class UnsupportedBlockError < StandardError; end
12
+ # The condition that was being evaluated inside the block did not evaluate
13
+ # to true within the time limit.
14
+ class TimeoutError < StandardError; end
15
+ # An element could not be located on the page using the given search parameters.
16
+ class NoSuchElementError < StandardError; end
12
17
 
13
18
  autoload :ElementContainer, 'appom/element_container'
14
19
  autoload :Page, 'appom/page'
20
+ autoload :Wait, 'appom/wait'
15
21
 
16
22
  class << self
17
23
  attr_accessor :driver
24
+ attr_accessor :max_wait_time
25
+
26
+ # Configure appom
27
+ def configure
28
+ yield self
29
+ end
18
30
 
19
31
  # Register a new appium driver for Appom.
20
32
  # @return [Appium::Driver] A appium driver instance
@@ -41,6 +53,8 @@ module Appom
41
53
  end
42
54
  end
43
55
  end
56
+
57
+ @max_wait_time = 20
44
58
  end
45
59
 
46
60
  World(Appom)
@@ -36,7 +36,7 @@ module Appom
36
36
  # element :email, :accessibility_id, 'email_text_field'
37
37
  #
38
38
  # @param name Element name
39
- # @param *find_args An array contain information to find the element. It contains locator stratery and search target
39
+ # @param *find_args An array contain information to find the element. It contains locator strategy and search target
40
40
  # http://appium.io/docs/en/commands/element/find-element/
41
41
  #
42
42
  # Element doesn't support block so that will raise if pass a block when declare
@@ -57,7 +57,7 @@ module Appom
57
57
  # elements :contact_cell, :accessibility_id, 'contact_cell'
58
58
  #
59
59
  # @param name Element name
60
- # @param *find_args An array contain information to find the elements. It contains locator stratery and search target
60
+ # @param *find_args An array contain information to find the elements. It contains locator strategy and search target
61
61
  # http://appium.io/docs/en/commands/element/find-element/
62
62
  #
63
63
  # Elements doesn't support block so that will raise if pass a block when declare
@@ -83,7 +83,7 @@ module Appom
83
83
 
84
84
  private
85
85
 
86
- # Add item to @mapped_items or define mothod to notify that we can't find item without args
86
+ # Add item to @mapped_items or define method to notify that we can't find item without args
87
87
  def build(name, *find_args)
88
88
  if find_args.empty?
89
89
  create_error_method(name)
@@ -91,14 +91,72 @@ module Appom
91
91
  add_to_mapped_items(name)
92
92
  yield
93
93
  end
94
+ add_helper_methods(name, *find_args)
94
95
  end
95
96
 
96
- # Define mothod to notify that we can't find item without args
97
+ # Define method to notify that we can't find item without args
97
98
  def create_error_method(name)
98
99
  define_method(name) do
99
100
  raise Appom::InvalidElementError
100
101
  end
101
102
  end
103
+
104
+ def add_helper_methods(name, *find_args)
105
+ create_existence_checker(name, *find_args)
106
+ create_nonexistence_checker(name, *find_args)
107
+ create_get_all_elements(name, *find_args)
108
+ end
109
+
110
+ def create_helper_method(proposed_method_name, *find_args)
111
+ if find_args.empty?
112
+ create_error_method(proposed_method_name)
113
+ else
114
+ yield
115
+ end
116
+ end
117
+
118
+ ##
119
+ # Check element exist
120
+ # We will try to find all elements with *find_args
121
+ # Condition is pass when response is not empty
122
+ #
123
+ def create_existence_checker(element_name, *find_args)
124
+ method_name = "has_#{element_name}?"
125
+ create_helper_method(method_name, *find_args) do
126
+ define_method(method_name) do |*runtime_args|
127
+ args = merge_args(find_args, runtime_args)
128
+ wait_check_util_not_empty(*args)
129
+ end
130
+ end
131
+ end
132
+
133
+ ##
134
+ # Check element non-existent
135
+ # We will try to find all elements with *find_args
136
+ # Condition is pass when response is empty
137
+ #
138
+ def create_nonexistence_checker(element_name, *find_args)
139
+ method_name = "has_no_#{element_name}?"
140
+ create_helper_method(method_name, *find_args) do
141
+ define_method(method_name) do |*runtime_args|
142
+ args = merge_args(find_args, runtime_args)
143
+ wait_check_util_empty(*args)
144
+ end
145
+ end
146
+ end
147
+
148
+ ##
149
+ # Try to get all elements until not get empty array
150
+ #
151
+ def create_get_all_elements(element_name, *find_args)
152
+ method_name = "get_all_#{element_name}"
153
+ create_helper_method(method_name, *find_args) do
154
+ define_method(method_name) do |*runtime_args|
155
+ args = merge_args(find_args, runtime_args)
156
+ wait_check_util_empty(*args)
157
+ end
158
+ end
159
+ end
102
160
  end
103
161
  end
104
162
  end
data/lib/appom/page.rb CHANGED
@@ -5,12 +5,52 @@ module Appom
5
5
 
6
6
  # Find an element
7
7
  def find(*find_args)
8
- Appom.driver.find_element(*find_args)
8
+ wait = Wait.new(timeout: Appom.max_wait_time)
9
+ wait.until { Appom.driver.find_element(*find_args) }
9
10
  end
10
11
 
11
12
  # Find elements
12
13
  def all(*find_args)
13
14
  Appom.driver.find_elements(*find_args)
14
15
  end
16
+
17
+ ##
18
+ # Use wait to check element non-exist
19
+ # Before timeout we will try to find elements and check response is empty
20
+ #
21
+ def wait_check_util_empty(*find_args)
22
+ wait = Wait.new(timeout: Appom.max_wait_time)
23
+ wait.until do
24
+ Appom.driver.find_elements(*find_args).empty?
25
+ end
26
+ end
27
+
28
+ ##
29
+ # Use wait to check element exist
30
+ # Before timeout we will try to find elements and check response is not empty
31
+ #
32
+ def wait_check_util_not_empty(*find_args)
33
+ wait = Wait.new(timeout: Appom.max_wait_time)
34
+ wait.until do
35
+ !Appom.driver.find_elements(*find_args).empty?
36
+ end
37
+ end
38
+
39
+ ##
40
+ # Use wait to get elements
41
+ # Before timeout we will try to find elements until response is not empty
42
+ #
43
+ def wait_util_get_not_empty(*find_args)
44
+ wait = Wait.new(timeout: Appom.max_wait_time)
45
+ wait.until do
46
+ result = Appom.driver.find_elements(*find_args)
47
+ # If reponse is empty we will return false to make it not pass Wait condition
48
+ if result.empty?
49
+ return false
50
+ end
51
+ # Return result
52
+ return result
53
+ end
54
+ end
15
55
  end
16
- end
56
+ end
data/lib/appom/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Appom
2
- VERSION = '0.4.0'.freeze
2
+ VERSION = '0.5.0'.freeze
3
3
  end
data/lib/appom/wait.rb ADDED
@@ -0,0 +1,40 @@
1
+ module Appom
2
+ class Wait
3
+ DEFAULT_TIMEOUT = 5
4
+ DEFAULT_INTERVAL = 0.25
5
+
6
+ ##
7
+ # Create a new Wait instance
8
+ #
9
+ # @param [Hash] opts Options for this instance
10
+ # @option opts [Numeric] :timeout (5) Seconds to wait before timing out.
11
+ # @option opts [Numeric] :interval (0.25) Seconds to sleep between polls.
12
+ #
13
+ def initialize(opts = {})
14
+ @timeout = opts.fetch(:timeout, DEFAULT_TIMEOUT)
15
+ @interval = opts.fetch(:interval, DEFAULT_INTERVAL)
16
+ end
17
+
18
+ ##
19
+ # Wait until the given block returns a true value.
20
+ #
21
+ # @raise [Error::TimeOutError]
22
+ # @return [Object] the result of the block
23
+ #
24
+ def until
25
+ end_time = Time.now + @timeout
26
+
27
+ until Time.now > end_time
28
+ begin
29
+ result = yield
30
+ return result if result
31
+ rescue
32
+ end
33
+
34
+ sleep @interval
35
+ end
36
+
37
+ raise Appom::TimeoutError, "Timed out after #{@timeout}s."
38
+ end
39
+ end
40
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harry.Tran
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-10-24 00:00:00.000000000 Z
11
+ date: 2018-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: appium_lib
@@ -67,6 +67,7 @@ files:
67
67
  - lib/appom/element_container.rb
68
68
  - lib/appom/page.rb
69
69
  - lib/appom/version.rb
70
+ - lib/appom/wait.rb
70
71
  homepage: https://github.com/hoangtaiki/appom
71
72
  licenses:
72
73
  - MIT