pagetience 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.iml
11
+ /.idea/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.0
5
+ before_install: gem install bundler -v 1.12.4
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pagetience.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,9 @@
1
+ guard :rspec, cmd: 'bundle exec rspec' do
2
+ watch(%r{^lib/(.+).rb$}) do |m|
3
+ "spec/#{m[1]}_spec.rb"
4
+ end
5
+
6
+ watch(%r{^spec/(.+).rb$}) do |m|
7
+ "spec/#{m[1]}.rb"
8
+ end
9
+ end
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,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,6 @@
1
+ module Pagetience
2
+ module Exceptions
3
+ class Timeout < StandardError
4
+ end
5
+ end
6
+ end
@@ -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
@@ -0,0 +1,3 @@
1
+ module Pagetience
2
+ VERSION = "0.1.0"
3
+ 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
@@ -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: []