pagetience 0.1.0
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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Guardfile +9 -0
- data/LICENSE.txt +21 -0
- data/README.md +60 -0
- data/Rakefile +6 -0
- data/lib/pagetience/exceptions.rb +6 -0
- data/lib/pagetience/timer.rb +25 -0
- data/lib/pagetience/version.rb +3 -0
- data/lib/pagetience.rb +85 -0
- data/pagetience.gemspec +31 -0
- metadata +183 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 004f4ab33f47df3056f939497b29b16c12105985
|
4
|
+
data.tar.gz: c2ccc08d0088664a2c5ede5dc686adcaee6563ff
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e70f0e4b6837fcba9b3ea2e3e7582c3b1e792750c41f8fe50157c216044737ada154bdd5c7be6c4b98ac4187c561f0d88de05e2e17427b314ecab81757795eb4
|
7
|
+
data.tar.gz: 183ac9d6f088af1335d12fc3c7cea3452a95578d3de27ab36e6e66ceaedb23be4bb294752614d0cf8489853f5cca315287762c482441f56ffad05b44ad16e373
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2016 Derek McNeil
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# Pagetience
|
2
|
+
A simple gem to verify pages and important elements are loaded.
|
3
|
+
|
4
|
+
## Installation
|
5
|
+
Add this line to your application's Gemfile:
|
6
|
+
|
7
|
+
```ruby
|
8
|
+
gem 'pagetience'
|
9
|
+
```
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle install
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install pagetience
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
To use **Pagetience**, simply `include Pagetience` in your page object class and then use the `required` method to set which elements must be visible on the page for it to be considered loaded.
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
class GooglePage
|
24
|
+
include PageObject
|
25
|
+
include Pagetience
|
26
|
+
|
27
|
+
text_field :search, name: 'q'
|
28
|
+
required :search
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
When an instance of your page object is created then the required elements will be checked for.
|
33
|
+
|
34
|
+
#### Adjusting the Timeout/Polling
|
35
|
+
You can use the `waiting` method to specify how long you want to wait and, optionally, at what interval to poll the page for element visibility.
|
36
|
+
|
37
|
+
The default timeout is **30** seconds, polling every second.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
class GooglePage
|
41
|
+
include PageObject
|
42
|
+
include Pagetience
|
43
|
+
|
44
|
+
text_field :search, name: 'q'
|
45
|
+
required :search
|
46
|
+
waiting 60, 5 # wait up to 60 seconds, polling every 5 seconds
|
47
|
+
end
|
48
|
+
```
|
49
|
+
|
50
|
+
## Notes/Todo/Issues
|
51
|
+
### IMPORTANT
|
52
|
+
Currently, this gem only works with the [page-object](https://github.com/cheezy/page-object)gem. It's a high priority to make working with other page object/webdriver libraries easier.
|
53
|
+
|
54
|
+
## Contributing
|
55
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/dmcneil/pagetience.
|
56
|
+
|
57
|
+
|
58
|
+
## License
|
59
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
60
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Pagetience
|
2
|
+
class Timer
|
3
|
+
attr_accessor :timeout, :polling, :block
|
4
|
+
|
5
|
+
def initialize(timeout=30, polling=1, &block)
|
6
|
+
@timeout = timeout
|
7
|
+
@polling = polling
|
8
|
+
@block = block
|
9
|
+
end
|
10
|
+
|
11
|
+
def run_until(expected=nil)
|
12
|
+
raise ArgumentError, 'Timeout cannot be lower than the polling value.' unless @timeout > @polling
|
13
|
+
|
14
|
+
while @timeout > 0 && @timeout > @polling
|
15
|
+
@latest_result = @block.call
|
16
|
+
break unless expected && @latest_result != expected
|
17
|
+
sleep @polling
|
18
|
+
@timeout = @timeout - @polling
|
19
|
+
end
|
20
|
+
|
21
|
+
@latest_result
|
22
|
+
end
|
23
|
+
alias_method :run, :run_until
|
24
|
+
end
|
25
|
+
end
|
data/lib/pagetience.rb
ADDED
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'pagetience/exceptions'
|
2
|
+
require 'pagetience/timer'
|
3
|
+
require 'pagetience/version'
|
4
|
+
|
5
|
+
module Pagetience
|
6
|
+
SUPPORTED_ELEMENT_LIBS = [PageObject]
|
7
|
+
|
8
|
+
attr_accessor :_waiting_timeout, :_waiting_polling
|
9
|
+
|
10
|
+
attr_reader :browser
|
11
|
+
attr_reader :loaded
|
12
|
+
|
13
|
+
attr_reader :element_lib
|
14
|
+
attr_reader :_poller, :_required_elements, :_underlying_elements
|
15
|
+
|
16
|
+
def self.included(base)
|
17
|
+
base.extend ClassMethods
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(browser)
|
21
|
+
@element_lib = self.class.ancestors.find { |m| SUPPORTED_ELEMENT_LIBS.include? m }
|
22
|
+
raise StandardError, 'Could not determine what page object platform is being used.' unless @element_lib
|
23
|
+
|
24
|
+
PageObject.instance_method(:initialize).bind(self).call(browser) if @element_lib == PageObject
|
25
|
+
|
26
|
+
@browser = browser
|
27
|
+
@loaded = false
|
28
|
+
@_waiting_timeout = _waiting_timeout || 30
|
29
|
+
@_waiting_polling = _waiting_polling || 1
|
30
|
+
|
31
|
+
@_required_elements = _required_elements || []
|
32
|
+
@_underlying_elements = []
|
33
|
+
gather_underlying_elements
|
34
|
+
wait_for_required_elements
|
35
|
+
end
|
36
|
+
|
37
|
+
def loaded?
|
38
|
+
!!@loaded
|
39
|
+
end
|
40
|
+
|
41
|
+
def gather_underlying_elements
|
42
|
+
if @element_lib == PageObject
|
43
|
+
@_required_elements.each do |e|
|
44
|
+
if respond_to? "#{e}_element"
|
45
|
+
@_underlying_elements << self.send("#{e}_element").element
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def wait_for_required_elements
|
52
|
+
@_poller = Pagetience::Timer.new(@_waiting_timeout, @_waiting_polling) do
|
53
|
+
begin
|
54
|
+
unless @_underlying_elements.any? { |e| !e.visible? }
|
55
|
+
@loaded = true
|
56
|
+
end
|
57
|
+
rescue
|
58
|
+
# TODO implement better strategy for certain platforms
|
59
|
+
end
|
60
|
+
end
|
61
|
+
@_poller.run_until true
|
62
|
+
|
63
|
+
unless loaded?
|
64
|
+
raise Pagetience::Exceptions::Timeout, "Timed out after polling every #{@_poller.polling}s for #{@_poller.timeout}s waiting for the page to be loaded."
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
module ClassMethods
|
69
|
+
def required(*elements)
|
70
|
+
elements.keep_if { |e| e.is_a? Symbol }
|
71
|
+
define_method('_required_elements') do
|
72
|
+
elements
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def waiting(timeout, polling=1)
|
77
|
+
define_method('_waiting_timeout') do
|
78
|
+
timeout
|
79
|
+
end
|
80
|
+
define_method('_waiting_polling') do
|
81
|
+
polling
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
data/pagetience.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'pagetience/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = 'pagetience'
|
8
|
+
spec.version = Pagetience::VERSION
|
9
|
+
spec.authors = ['Derek McNeil']
|
10
|
+
spec.email = ['derek.mcneil90@gmail.com']
|
11
|
+
|
12
|
+
spec.summary = %q{A simple gem for making page object waiting easy.}
|
13
|
+
spec.homepage = 'http://www.github.com/dmcneil/pagetience'
|
14
|
+
spec.license = 'MIT'
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
|
+
spec.bindir = 'exe'
|
18
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
+
spec.require_paths = ['lib']
|
20
|
+
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.12'
|
22
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
24
|
+
spec.add_development_dependency 'guard', '~> 2.13.0'
|
25
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.6.5'
|
26
|
+
spec.add_development_dependency 'pry'
|
27
|
+
spec.add_development_dependency 'pry-byebug'
|
28
|
+
|
29
|
+
spec.add_dependency 'page-object' , '~> 1.1.1'
|
30
|
+
spec.add_dependency 'watir-webdriver', '~> 0.9.0'
|
31
|
+
end
|
metadata
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pagetience
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Derek McNeil
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-05-21 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.12'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.12'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: guard
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.13.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.13.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard-rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 4.6.5
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 4.6.5
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: pry
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry-byebug
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: page-object
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 1.1.1
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 1.1.1
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: watir-webdriver
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 0.9.0
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 0.9.0
|
139
|
+
description:
|
140
|
+
email:
|
141
|
+
- derek.mcneil90@gmail.com
|
142
|
+
executables: []
|
143
|
+
extensions: []
|
144
|
+
extra_rdoc_files: []
|
145
|
+
files:
|
146
|
+
- ".gitignore"
|
147
|
+
- ".rspec"
|
148
|
+
- ".travis.yml"
|
149
|
+
- Gemfile
|
150
|
+
- Guardfile
|
151
|
+
- LICENSE.txt
|
152
|
+
- README.md
|
153
|
+
- Rakefile
|
154
|
+
- lib/pagetience.rb
|
155
|
+
- lib/pagetience/exceptions.rb
|
156
|
+
- lib/pagetience/timer.rb
|
157
|
+
- lib/pagetience/version.rb
|
158
|
+
- pagetience.gemspec
|
159
|
+
homepage: http://www.github.com/dmcneil/pagetience
|
160
|
+
licenses:
|
161
|
+
- MIT
|
162
|
+
metadata: {}
|
163
|
+
post_install_message:
|
164
|
+
rdoc_options: []
|
165
|
+
require_paths:
|
166
|
+
- lib
|
167
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
168
|
+
requirements:
|
169
|
+
- - ">="
|
170
|
+
- !ruby/object:Gem::Version
|
171
|
+
version: '0'
|
172
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: '0'
|
177
|
+
requirements: []
|
178
|
+
rubyforge_project:
|
179
|
+
rubygems_version: 2.6.4
|
180
|
+
signing_key:
|
181
|
+
specification_version: 4
|
182
|
+
summary: A simple gem for making page object waiting easy.
|
183
|
+
test_files: []
|