pagetience 0.1.0 → 0.2.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 +4 -4
- data/.gitignore +1 -0
- data/README.md +13 -3
- data/lib/pagetience/exceptions.rb +3 -0
- data/lib/pagetience/{timer.rb → meditate.rb} +4 -3
- data/lib/pagetience/platforms/base.rb +26 -0
- data/lib/pagetience/platforms/element_platforms.rb +5 -0
- data/lib/pagetience/platforms/page-object-gem.rb +30 -0
- data/lib/pagetience/version.rb +1 -1
- data/lib/pagetience.rb +36 -30
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 108a062d3af7caac8148b20d6862d7b6b8a5663d
|
4
|
+
data.tar.gz: a08091eaf61fec1f8fc7f153f1cb98c408aada5a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5937d66687049bc3696cf9c03de038bc0484f2fb1a60fed4b70d1708f5a8094891e3535255485c7cba9db519e9609837a5e97dfe16d37b11e369e44667d2a21
|
7
|
+
data.tar.gz: afe6e463749d5206377e1e3e329273b9657598978206951e89e9287f7a2f75e5325b423314775cc097c754a0d08bf53da580ec2bb5ab5fa1b32bf16866635165
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Pagetience
|
2
|
-
|
2
|
+
[](https://travis-ci.org/dmcneil/pagetience)
|
3
|
+
|
4
|
+
Pronounced like "patience".
|
5
|
+
|
6
|
+
Using a simple DSL, you can declare which of your page object elements must be present and visible on the page before your code can consider it **loaded**.
|
3
7
|
|
4
8
|
## Installation
|
5
9
|
Add this line to your application's Gemfile:
|
@@ -47,9 +51,15 @@ class GooglePage
|
|
47
51
|
end
|
48
52
|
```
|
49
53
|
|
54
|
+
## Supported Platforms
|
55
|
+
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.
|
56
|
+
|
50
57
|
## Notes/Todo/Issues
|
51
|
-
|
52
|
-
|
58
|
+
1. Add platform support for Selenium WebDriver
|
59
|
+
2. Add platform support for Watir WebDriver
|
60
|
+
3. SitePrism?
|
61
|
+
4. Documentation
|
62
|
+
5. Organize unit tests
|
53
63
|
|
54
64
|
## Contributing
|
55
65
|
Bug reports and pull requests are welcome on GitHub at https://github.com/dmcneil/pagetience.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Pagetience
|
2
|
-
class
|
2
|
+
class Meditate
|
3
3
|
attr_accessor :timeout, :polling, :block
|
4
4
|
|
5
5
|
def initialize(timeout=30, polling=1, &block)
|
@@ -8,7 +8,7 @@ module Pagetience
|
|
8
8
|
@block = block
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def until_enlightened(expected=nil, msg='Timed out waiting for the expected result.')
|
12
12
|
raise ArgumentError, 'Timeout cannot be lower than the polling value.' unless @timeout > @polling
|
13
13
|
|
14
14
|
while @timeout > 0 && @timeout > @polling
|
@@ -18,8 +18,9 @@ module Pagetience
|
|
18
18
|
@timeout = @timeout - @polling
|
19
19
|
end
|
20
20
|
|
21
|
+
raise Pagetience::Exceptions::Timeout, msg unless @latest_result
|
22
|
+
|
21
23
|
@latest_result
|
22
24
|
end
|
23
|
-
alias_method :run, :run_until
|
24
25
|
end
|
25
26
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Pagetience
|
2
|
+
module ElementPlatforms
|
3
|
+
class Base
|
4
|
+
attr_reader :browser
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def find(klazz)
|
8
|
+
valid_ancestor = ANCESTORS.find { |a| a.present? klazz }
|
9
|
+
if valid_ancestor
|
10
|
+
valid_ancestor.new klazz
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(*args)
|
16
|
+
@browser = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def platform_initialize; end
|
20
|
+
|
21
|
+
def underlying_element_for(sym)
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Pagetience
|
2
|
+
module ElementPlatforms
|
3
|
+
class PageObjectGem < Base
|
4
|
+
attr_reader :page_object_instance
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def present?(klazz)
|
8
|
+
klazz.class.ancestors.include? PageObject
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(klazz)
|
13
|
+
super
|
14
|
+
|
15
|
+
@page_object_instance = klazz
|
16
|
+
@browser = @page_object_instance.browser
|
17
|
+
end
|
18
|
+
|
19
|
+
def platform_initialize
|
20
|
+
@page_object_instance.instance_eval do
|
21
|
+
PageObject.instance_method(:initialize).bind(self).call(@browser)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def underlying_element_for(sym)
|
26
|
+
@page_object_instance.send("#{sym}_element").element
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/pagetience/version.rb
CHANGED
data/lib/pagetience.rb
CHANGED
@@ -1,16 +1,37 @@
|
|
1
1
|
require 'pagetience/exceptions'
|
2
|
-
require 'pagetience/
|
2
|
+
require 'pagetience/meditate'
|
3
3
|
require 'pagetience/version'
|
4
4
|
|
5
|
+
require 'pagetience/platforms/base'
|
6
|
+
require 'pagetience/platforms/page-object-gem'
|
7
|
+
|
8
|
+
require 'pagetience/platforms/element_platforms'
|
9
|
+
|
5
10
|
module Pagetience
|
6
|
-
|
11
|
+
module ClassMethods
|
12
|
+
def required(*elements)
|
13
|
+
elements.keep_if { |e| e.is_a? Symbol }
|
14
|
+
define_method('_required_elements') do
|
15
|
+
elements
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def waiting(timeout, polling=1)
|
20
|
+
define_method('_waiting_timeout') do
|
21
|
+
timeout
|
22
|
+
end
|
23
|
+
define_method('_waiting_polling') do
|
24
|
+
polling
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
7
28
|
|
8
29
|
attr_accessor :_waiting_timeout, :_waiting_polling
|
9
30
|
|
10
31
|
attr_reader :browser
|
11
32
|
attr_reader :loaded
|
12
33
|
|
13
|
-
attr_reader :
|
34
|
+
attr_reader :element_platform
|
14
35
|
attr_reader :_poller, :_required_elements, :_underlying_elements
|
15
36
|
|
16
37
|
def self.included(base)
|
@@ -18,12 +39,11 @@ module Pagetience
|
|
18
39
|
end
|
19
40
|
|
20
41
|
def initialize(browser)
|
21
|
-
@
|
22
|
-
raise StandardError, 'Could not determine what page object platform is being used.' unless @element_lib
|
42
|
+
@browser = browser
|
23
43
|
|
24
|
-
|
44
|
+
determine_platform
|
45
|
+
@element_platform.platform_initialize
|
25
46
|
|
26
|
-
@browser = browser
|
27
47
|
@loaded = false
|
28
48
|
@_waiting_timeout = _waiting_timeout || 30
|
29
49
|
@_waiting_polling = _waiting_polling || 1
|
@@ -39,17 +59,13 @@ module Pagetience
|
|
39
59
|
end
|
40
60
|
|
41
61
|
def gather_underlying_elements
|
42
|
-
|
43
|
-
@
|
44
|
-
if respond_to? "#{e}_element"
|
45
|
-
@_underlying_elements << self.send("#{e}_element").element
|
46
|
-
end
|
47
|
-
end
|
62
|
+
@_required_elements.each do |e|
|
63
|
+
@_underlying_elements << @element_platform.underlying_element_for(e)
|
48
64
|
end
|
49
65
|
end
|
50
66
|
|
51
67
|
def wait_for_required_elements
|
52
|
-
@_poller = Pagetience::
|
68
|
+
@_poller = Pagetience::Meditate.new(@_waiting_timeout, @_waiting_polling) do
|
53
69
|
begin
|
54
70
|
unless @_underlying_elements.any? { |e| !e.visible? }
|
55
71
|
@loaded = true
|
@@ -58,28 +74,18 @@ module Pagetience
|
|
58
74
|
# TODO implement better strategy for certain platforms
|
59
75
|
end
|
60
76
|
end
|
61
|
-
@_poller.
|
77
|
+
@_poller.until_enlightened true
|
62
78
|
|
63
79
|
unless loaded?
|
64
80
|
raise Pagetience::Exceptions::Timeout, "Timed out after polling every #{@_poller.polling}s for #{@_poller.timeout}s waiting for the page to be loaded."
|
65
81
|
end
|
66
82
|
end
|
67
83
|
|
68
|
-
|
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
|
84
|
+
private
|
75
85
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
define_method('_waiting_polling') do
|
81
|
-
polling
|
82
|
-
end
|
83
|
-
end
|
86
|
+
def determine_platform
|
87
|
+
@element_platform = Pagetience::ElementPlatforms::Base.find(self)
|
88
|
+
|
89
|
+
raise Pagetience::Exceptions::Platform, 'Could not determine what element platform is being used.' unless @element_platform
|
84
90
|
end
|
85
91
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pagetience
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Derek McNeil
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -153,7 +153,10 @@ files:
|
|
153
153
|
- Rakefile
|
154
154
|
- lib/pagetience.rb
|
155
155
|
- lib/pagetience/exceptions.rb
|
156
|
-
- lib/pagetience/
|
156
|
+
- lib/pagetience/meditate.rb
|
157
|
+
- lib/pagetience/platforms/base.rb
|
158
|
+
- lib/pagetience/platforms/element_platforms.rb
|
159
|
+
- lib/pagetience/platforms/page-object-gem.rb
|
157
160
|
- lib/pagetience/version.rb
|
158
161
|
- pagetience.gemspec
|
159
162
|
homepage: http://www.github.com/dmcneil/pagetience
|
@@ -176,7 +179,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
176
179
|
version: '0'
|
177
180
|
requirements: []
|
178
181
|
rubyforge_project:
|
179
|
-
rubygems_version: 2.
|
182
|
+
rubygems_version: 2.5.1
|
180
183
|
signing_key:
|
181
184
|
specification_version: 4
|
182
185
|
summary: A simple gem for making page object waiting easy.
|