ae_page_objects 0.0.1.beta.6.0.0 → 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.
- data/lib/ae_page_objects/concerns/visitable.rb +5 -7
- data/lib/ae_page_objects/core/application.rb +17 -50
- data/lib/ae_page_objects/core/application_router.rb +1 -0
- data/lib/ae_page_objects/core/configuration.rb +2 -17
- data/lib/ae_page_objects/core/dsl/collection.rb +49 -43
- data/lib/ae_page_objects/core/dsl/element.rb +4 -2
- data/lib/ae_page_objects/core/rake_router.rb +4 -2
- data/lib/ae_page_objects/element.rb +25 -12
- data/lib/ae_page_objects/element_proxy.rb +21 -4
- data/lib/ae_page_objects/elements/collection.rb +5 -3
- data/lib/ae_page_objects/node.rb +0 -6
- data/lib/ae_page_objects/version.rb +1 -1
- metadata +28 -48
@@ -32,13 +32,11 @@ module AePageObjects
|
|
32
32
|
|
33
33
|
def can_load_from_current_url?
|
34
34
|
return true if paths.empty?
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
application.path_recognizes_url?(path, url)
|
41
|
-
end
|
35
|
+
|
36
|
+
url = current_url_without_params
|
37
|
+
|
38
|
+
paths.any? do |path|
|
39
|
+
application.path_recognizes_url?(path, url)
|
42
40
|
end
|
43
41
|
end
|
44
42
|
|
@@ -1,61 +1,42 @@
|
|
1
|
-
require "active_support/dependencies"
|
2
|
-
|
3
1
|
module AePageObjects
|
4
2
|
class Application
|
5
3
|
include Configurable
|
6
4
|
|
7
5
|
class << self
|
8
|
-
attr_accessor :called_from
|
9
6
|
private :new
|
10
7
|
|
11
|
-
|
8
|
+
delegate :initialize!, :to => :instance
|
9
|
+
|
10
|
+
def inherited(application_class)
|
12
11
|
super
|
13
|
-
|
14
|
-
base.called_from = begin
|
15
|
-
call_stack = caller.map { |p| p.sub(/:\d+.*/, '') }
|
16
|
-
File.dirname(call_stack.detect { |p| p !~ %r[railties[\w.-]*/lib/rails|rack[\w.-]*/lib/rack] })
|
17
|
-
end
|
18
|
-
|
19
|
-
base.parent.send(:include, ConstantResolver)
|
20
|
-
end
|
21
|
-
|
22
|
-
def initialize!
|
23
|
-
instance.initialize!
|
12
|
+
application_class.parent.send(:include, ConstantResolver)
|
24
13
|
end
|
25
14
|
end
|
26
|
-
|
15
|
+
|
16
|
+
delegate :router, :to => :config
|
17
|
+
delegate :path_recognizes_url?, :to => :router
|
18
|
+
delegate :generate_path, :to => :router
|
19
|
+
|
27
20
|
def initialize
|
28
|
-
|
21
|
+
ActiveSupport::Dependencies.autoload_paths.unshift(*all_autoload_paths)
|
22
|
+
|
23
|
+
# Freeze so future modifications will fail rather than do nothing mysteriously
|
24
|
+
config.eager_load_paths.freeze
|
29
25
|
end
|
30
26
|
|
31
27
|
def config
|
32
|
-
@config ||= Configuration.new(self
|
28
|
+
@config ||= Configuration.new(self)
|
33
29
|
end
|
34
30
|
|
35
31
|
def initialize!
|
36
32
|
eager_load!
|
37
33
|
end
|
38
|
-
|
39
|
-
delegate :path_recognizes_url?, :to => :router
|
40
|
-
delegate :generate_path, :to => :router
|
41
|
-
|
34
|
+
|
42
35
|
def all_autoload_paths
|
43
|
-
@all_autoload_paths ||=
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
def router
|
49
|
-
@router ||= config.router
|
36
|
+
@all_autoload_paths ||= config.eager_load_paths.uniq
|
50
37
|
end
|
51
|
-
|
52
|
-
def set_autoload_paths
|
53
|
-
ActiveSupport::Dependencies.autoload_paths.unshift(*all_autoload_paths)
|
54
38
|
|
55
|
-
|
56
|
-
config.autoload_paths.freeze
|
57
|
-
config.eager_load_paths.freeze
|
58
|
-
end
|
39
|
+
private
|
59
40
|
|
60
41
|
def eager_load!
|
61
42
|
config.eager_load_paths.each do |load_path|
|
@@ -67,19 +48,5 @@ module AePageObjects
|
|
67
48
|
end
|
68
49
|
end
|
69
50
|
end
|
70
|
-
|
71
|
-
def find_root_with_flag(flag, default=nil)
|
72
|
-
root_path = self.class.called_from
|
73
|
-
|
74
|
-
while root_path && File.directory?(root_path) && !File.exist?("#{root_path}/#{flag}")
|
75
|
-
parent = File.dirname(root_path)
|
76
|
-
root_path = parent != root_path && parent
|
77
|
-
end
|
78
|
-
|
79
|
-
root = File.exist?("#{root_path}/#{flag}") ? root_path : default
|
80
|
-
raise "Could not find root path for #{self}" unless root
|
81
|
-
|
82
|
-
Pathname.new(root).realpath
|
83
|
-
end
|
84
51
|
end
|
85
52
|
end
|
@@ -1,28 +1,13 @@
|
|
1
|
-
require 'rails/paths'
|
2
|
-
|
3
1
|
module AePageObjects
|
4
2
|
class Configuration
|
5
3
|
attr_writer :router
|
6
4
|
|
7
|
-
def initialize(application
|
5
|
+
def initialize(application)
|
8
6
|
@application = application
|
9
|
-
@root = root
|
10
7
|
end
|
11
8
|
|
12
|
-
def paths
|
13
|
-
@paths ||= begin
|
14
|
-
paths = Rails::Paths::Root.new(@root)
|
15
|
-
paths.add "test/page_objects", :eager_load => true
|
16
|
-
paths
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
9
|
def eager_load_paths
|
21
|
-
@eager_load_paths ||=
|
22
|
-
end
|
23
|
-
|
24
|
-
def autoload_paths
|
25
|
-
@autoload_paths ||= paths.autoload_paths
|
10
|
+
@eager_load_paths ||= ["test/page_objects"]
|
26
11
|
end
|
27
12
|
|
28
13
|
def router
|
@@ -11,74 +11,82 @@ module AePageObjects
|
|
11
11
|
# collection. collection() defines a method on the class that returns an instance of a collection
|
12
12
|
# class which contains instances of the collection's item class.
|
13
13
|
#
|
14
|
-
# Supported signatures are described below.
|
15
|
-
#
|
16
|
-
# ------------------------------------------------
|
17
|
-
# Signature: (:is, no :contains, no block)
|
18
|
-
#
|
19
|
-
# collection :addresses, :is => AddressList
|
20
|
-
#
|
21
|
-
# Collection class: AddressList
|
22
|
-
# Item class: AddressList.item_class
|
23
|
-
#
|
24
|
-
# ------------------------------------------------
|
25
|
-
# Signature: (no :is, :contains, no block)
|
26
|
-
#
|
27
|
-
# collection :addresses, :contains => Address
|
28
|
-
#
|
29
|
-
# Collection class: one-off subclass of ::AePageObjects::Collection
|
30
|
-
# Item class: Address
|
31
|
-
#
|
14
|
+
# Supported signatures are described below.
|
15
|
+
#
|
32
16
|
# ------------------------------------------------
|
33
|
-
# Signature: (:is, :contains, no block)
|
34
|
-
#
|
35
|
-
# collection :addresses
|
36
|
-
#
|
37
|
-
# Collection class:
|
38
|
-
# Item class:
|
39
|
-
#
|
17
|
+
# Signature: (no :is, no :contains, no block)
|
18
|
+
#
|
19
|
+
# collection :addresses
|
20
|
+
#
|
21
|
+
# Collection class: ::AePageObjects::Collection
|
22
|
+
# Item class: ::AePageObjects::Element
|
23
|
+
#
|
40
24
|
# ------------------------------------------------
|
41
25
|
# Signature: (no :is, no :contains, block)
|
42
|
-
#
|
26
|
+
#
|
43
27
|
# collection :addresses do
|
44
28
|
# element :city
|
45
29
|
# element :state
|
46
30
|
# end
|
47
|
-
#
|
31
|
+
#
|
48
32
|
# Collection class: one-off subclass of ::AePageObjects::Collection
|
49
33
|
# Item class: one-off subclass of ::AePageObjects::Element
|
50
34
|
# Methods defined on item class:
|
51
35
|
# city() # -> instance of ::AePageObjects::Element
|
52
36
|
# state() # -> instance of ::AePageObjects::Element
|
53
|
-
#
|
37
|
+
#
|
54
38
|
# ------------------------------------------------
|
55
|
-
# Signature: (:is,
|
56
|
-
#
|
57
|
-
#
|
39
|
+
# Signature: (no :is, :contains, no block)
|
40
|
+
#
|
41
|
+
# collection :addresses, :contains => Address
|
42
|
+
#
|
43
|
+
# Collection class: one-off subclass of ::AePageObjects::Collection
|
44
|
+
# Item class: Address
|
45
|
+
#
|
46
|
+
# ------------------------------------------------
|
47
|
+
# Signature: (no :is, :contains, block)
|
48
|
+
#
|
49
|
+
# collection :addresses, :contains => Address do
|
58
50
|
# element :longitude
|
59
51
|
# element :latitude
|
60
52
|
# end
|
61
|
-
#
|
62
|
-
# Collection class: one-off subclass of
|
63
|
-
# Item class: one-off subclass of
|
53
|
+
#
|
54
|
+
# Collection class: one-off subclass of ::AePageObjects::Collection element
|
55
|
+
# Item class: one-off subclass of Address
|
64
56
|
# Methods defined on item class:
|
65
57
|
# longitude() # -> instance of ::AePageObjects::Element
|
66
58
|
# latitude() # -> instance of ::AePageObjects::Element
|
67
|
-
#
|
59
|
+
#
|
68
60
|
# ------------------------------------------------
|
69
|
-
# Signature: (
|
70
|
-
#
|
71
|
-
#
|
61
|
+
# Signature: (:is, no :contains, no block)
|
62
|
+
#
|
63
|
+
# collection :addresses, :is => AddressList
|
64
|
+
#
|
65
|
+
# Collection class: AddressList
|
66
|
+
# Item class: AddressList.item_class
|
67
|
+
#
|
68
|
+
# ------------------------------------------------
|
69
|
+
# Signature: (:is, no :contains, block)
|
70
|
+
#
|
71
|
+
# collection :addresses, :is => AddressList do
|
72
72
|
# element :longitude
|
73
73
|
# element :latitude
|
74
74
|
# end
|
75
|
-
#
|
76
|
-
# Collection class: one-off subclass of
|
77
|
-
# Item class: one-off subclass of
|
75
|
+
#
|
76
|
+
# Collection class: one-off subclass of AddressList
|
77
|
+
# Item class: one-off subclass of AddressList.item_class
|
78
78
|
# Methods defined on item class:
|
79
79
|
# longitude() # -> instance of ::AePageObjects::Element
|
80
80
|
# latitude() # -> instance of ::AePageObjects::Element
|
81
|
+
#
|
82
|
+
# ------------------------------------------------
|
83
|
+
# Signature: (:is, :contains, no block)
|
81
84
|
#
|
85
|
+
# collection :addresses, :is => AddressList, :contains => ExtendedAddress
|
86
|
+
#
|
87
|
+
# Collection class: one-off subclass ofAddressList
|
88
|
+
# Item class: ExtendedAddress
|
89
|
+
#
|
82
90
|
# ------------------------------------------------
|
83
91
|
# Signature: (:is, :contains, block)
|
84
92
|
#
|
@@ -111,8 +119,6 @@ module AePageObjects
|
|
111
119
|
ensure_class_for_param!(:is, options[:is], ::AePageObjects::Collection)
|
112
120
|
else
|
113
121
|
options[:is] = ::AePageObjects::Collection
|
114
|
-
|
115
|
-
raise ArgumentError, "Must specify either a block or a :contains option." if options[:contains].blank? && block.blank?
|
116
122
|
end
|
117
123
|
|
118
124
|
item_class = options.delete(:contains) || options[:is].item_class
|
@@ -16,13 +16,15 @@ module AePageObjects
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def element(name, options = {}, &block)
|
19
|
-
options = options.dup
|
19
|
+
options = options.dup
|
20
|
+
options[:name] ||= name
|
21
|
+
|
20
22
|
klass = field_klass(options, &block)
|
21
23
|
|
22
24
|
self.element_attributes[name.to_sym] = klass
|
23
25
|
|
24
26
|
define_method name do |&block|
|
25
|
-
ElementProxy.new(klass, self,
|
27
|
+
ElementProxy.new(klass, self, options, &block)
|
26
28
|
end
|
27
29
|
|
28
30
|
klass
|
@@ -1,14 +1,23 @@
|
|
1
1
|
module AePageObjects
|
2
2
|
class Element < Node
|
3
|
-
attr_reader :parent
|
3
|
+
attr_reader :parent
|
4
4
|
|
5
|
-
|
5
|
+
class << self
|
6
|
+
def new(*args)
|
7
|
+
super(*args).tap do |me|
|
8
|
+
yield me if block_given?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(parent, options_or_locator = {})
|
6
14
|
@parent = parent
|
7
|
-
@default_name = name.to_s
|
8
15
|
@locator = nil
|
9
16
|
@name = nil
|
10
17
|
|
11
18
|
configure(parse_options(options_or_locator))
|
19
|
+
|
20
|
+
raise ArgumentError, ":name or :locator is required" unless @name || @locator
|
12
21
|
|
13
22
|
@locator ||= default_locator
|
14
23
|
|
@@ -26,26 +35,30 @@ module AePageObjects
|
|
26
35
|
node
|
27
36
|
end
|
28
37
|
end
|
29
|
-
|
38
|
+
|
30
39
|
def __full_name__
|
31
40
|
if parent.respond_to?(:__full_name__)
|
32
|
-
|
41
|
+
[ parent.__full_name__, __name__ ].compact.join('_')
|
33
42
|
else
|
34
43
|
__name__
|
35
44
|
end
|
36
45
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
46
|
+
|
47
|
+
def full_name
|
48
|
+
__full_name__
|
49
|
+
end
|
50
|
+
|
40
51
|
def __name__
|
41
|
-
@name
|
52
|
+
@name
|
53
|
+
end
|
54
|
+
|
55
|
+
def name
|
56
|
+
__name__
|
42
57
|
end
|
43
|
-
|
44
|
-
alias_method :name, :__name__
|
45
58
|
|
46
59
|
def to_s
|
47
60
|
super.tap do |str|
|
48
|
-
str << "
|
61
|
+
str << "@name:<#{@name}>; #@locator:<#{@locator}>"
|
49
62
|
end
|
50
63
|
end
|
51
64
|
|
@@ -30,14 +30,28 @@ module AePageObjects
|
|
30
30
|
!!presence.try(:visible?)
|
31
31
|
end
|
32
32
|
|
33
|
+
def not_visible?
|
34
|
+
Capybara.current_session.wait_until do
|
35
|
+
Capybara.using_wait_time(0) do
|
36
|
+
! visible?
|
37
|
+
end
|
38
|
+
end
|
39
|
+
rescue Capybara::TimeoutError
|
40
|
+
false
|
41
|
+
end
|
42
|
+
|
33
43
|
def present?
|
34
44
|
presence.present?
|
35
45
|
end
|
36
46
|
|
37
|
-
def not_present?
|
38
|
-
Capybara.
|
39
|
-
|
47
|
+
def not_present?
|
48
|
+
Capybara.current_session.wait_until do
|
49
|
+
Capybara.using_wait_time(0) do
|
50
|
+
! present?
|
51
|
+
end
|
40
52
|
end
|
53
|
+
rescue Capybara::TimeoutError
|
54
|
+
false
|
41
55
|
end
|
42
56
|
|
43
57
|
def presence
|
@@ -49,7 +63,10 @@ module AePageObjects
|
|
49
63
|
def is_a?(type)
|
50
64
|
type == @element_class || type == ElementProxy
|
51
65
|
end
|
52
|
-
|
66
|
+
|
67
|
+
def kind_of?(type)
|
68
|
+
is_a?(type)
|
69
|
+
end
|
53
70
|
|
54
71
|
def method_missing(name, *args, &block)
|
55
72
|
if name == "class"
|
@@ -7,11 +7,13 @@ module AePageObjects
|
|
7
7
|
if index >= size || index < 0
|
8
8
|
nil
|
9
9
|
else
|
10
|
-
self.item_class.new(self, index, [:xpath, "#{row_xpath}[#{index + 1}]"], &block)
|
10
|
+
self.item_class.new(self, :name => index, :locator => [:xpath, "#{row_xpath}[#{index + 1}]"], &block)
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
14
|
-
|
13
|
+
|
14
|
+
def [](index, &block)
|
15
|
+
at(index, &block)
|
16
|
+
end
|
15
17
|
|
16
18
|
def each(&block)
|
17
19
|
(0..(size - 1)).each do |index|
|
data/lib/ae_page_objects/node.rb
CHANGED
metadata
CHANGED
@@ -1,17 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ae_page_objects
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
- 0
|
9
8
|
- 1
|
10
|
-
- beta
|
11
|
-
- 6
|
12
|
-
- 0
|
13
9
|
- 0
|
14
|
-
version: 0.
|
10
|
+
version: 0.1.0
|
15
11
|
platform: ruby
|
16
12
|
authors:
|
17
13
|
- Donnie Tognazzini
|
@@ -19,12 +15,12 @@ autorequire:
|
|
19
15
|
bindir: bin
|
20
16
|
cert_chain: []
|
21
17
|
|
22
|
-
date: 2013-
|
18
|
+
date: 2013-05-24 00:00:00 Z
|
23
19
|
dependencies:
|
24
20
|
- !ruby/object:Gem::Dependency
|
21
|
+
type: :runtime
|
25
22
|
name: activesupport
|
26
|
-
|
27
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
28
24
|
none: false
|
29
25
|
requirements:
|
30
26
|
- - ">="
|
@@ -35,28 +31,12 @@ dependencies:
|
|
35
31
|
- 0
|
36
32
|
- 0
|
37
33
|
version: 3.0.0
|
38
|
-
|
39
|
-
version_requirements: *id001
|
40
|
-
- !ruby/object:Gem::Dependency
|
41
|
-
name: railties
|
34
|
+
requirement: *id001
|
42
35
|
prerelease: false
|
43
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
44
|
-
none: false
|
45
|
-
requirements:
|
46
|
-
- - ">="
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
hash: 7
|
49
|
-
segments:
|
50
|
-
- 3
|
51
|
-
- 0
|
52
|
-
- 0
|
53
|
-
version: 3.0.0
|
54
|
-
type: :runtime
|
55
|
-
version_requirements: *id002
|
56
36
|
- !ruby/object:Gem::Dependency
|
37
|
+
type: :runtime
|
57
38
|
name: capybara
|
58
|
-
|
59
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
39
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
60
40
|
none: false
|
61
41
|
requirements:
|
62
42
|
- - ~>
|
@@ -66,12 +46,12 @@ dependencies:
|
|
66
46
|
- 1
|
67
47
|
- 1
|
68
48
|
version: "1.1"
|
69
|
-
|
70
|
-
|
49
|
+
requirement: *id002
|
50
|
+
prerelease: false
|
71
51
|
- !ruby/object:Gem::Dependency
|
52
|
+
type: :development
|
72
53
|
name: appraisal
|
73
|
-
|
74
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
54
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
75
55
|
none: false
|
76
56
|
requirements:
|
77
57
|
- - ~>
|
@@ -82,28 +62,28 @@ dependencies:
|
|
82
62
|
- 5
|
83
63
|
- 1
|
84
64
|
version: 0.5.1
|
85
|
-
|
86
|
-
|
65
|
+
requirement: *id003
|
66
|
+
prerelease: false
|
87
67
|
- !ruby/object:Gem::Dependency
|
68
|
+
type: :development
|
88
69
|
name: mocha
|
89
|
-
|
90
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
70
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
91
71
|
none: false
|
92
72
|
requirements:
|
93
73
|
- - "="
|
94
74
|
- !ruby/object:Gem::Version
|
95
|
-
hash:
|
75
|
+
hash: 45
|
96
76
|
segments:
|
97
77
|
- 0
|
98
|
-
-
|
99
|
-
-
|
100
|
-
version: 0.
|
101
|
-
|
102
|
-
|
78
|
+
- 13
|
79
|
+
- 3
|
80
|
+
version: 0.13.3
|
81
|
+
requirement: *id004
|
82
|
+
prerelease: false
|
103
83
|
- !ruby/object:Gem::Dependency
|
84
|
+
type: :development
|
104
85
|
name: selenium-webdriver
|
105
|
-
|
106
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
86
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
107
87
|
none: false
|
108
88
|
requirements:
|
109
89
|
- - ">="
|
@@ -112,8 +92,8 @@ dependencies:
|
|
112
92
|
segments:
|
113
93
|
- 0
|
114
94
|
version: "0"
|
115
|
-
|
116
|
-
|
95
|
+
requirement: *id005
|
96
|
+
prerelease: false
|
117
97
|
description: Capybara Page Objects pattern
|
118
98
|
email:
|
119
99
|
- engineering@appfolio.com
|
@@ -177,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
177
157
|
requirements: []
|
178
158
|
|
179
159
|
rubyforge_project:
|
180
|
-
rubygems_version: 1.8.
|
160
|
+
rubygems_version: 1.8.25
|
181
161
|
signing_key:
|
182
162
|
specification_version: 3
|
183
163
|
summary: Capybara Page Objects pattern
|