ae_page_objects 1.0.2 → 1.1.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
  SHA1:
3
- metadata.gz: 7a18e3851747da830279cb221c6e8396be49bd7f
4
- data.tar.gz: d928b79a0cf1c1803fe6fe5dfaa11bdf09be89da
3
+ metadata.gz: 5334b6a4fd2514a439fa323284a5893cb21005ca
4
+ data.tar.gz: 64a263fd884d0e933ebf8000ad88ed689dc3f601
5
5
  SHA512:
6
- metadata.gz: d3c1e84440a35294ddb0b75e980c604e76f79bfdc79161cbd37808afa0c59e35ba43d6024c2babe4e4cd5f24584787c2d610d1225ede69dc1ff567f95f28d0bb
7
- data.tar.gz: de8501df5e1f010dc72ef281fbc5038fca1cf683b8ba61c3c62b84585537afbe8811ac2cfdf8e4a6d0147d91a6a068b2e8deaeb589568a03e1609bebc1905588
6
+ metadata.gz: 3af8bd7d6c91c8865641f2673cba8244ccc4d5db142bc95591f70dc57fdc2ecec8f924dfc71fe6fc38627b36fc5e1a1e8007d970b06a65ff17113f5b7f915fe3
7
+ data.tar.gz: 2b3d973eb84a26923bd6db1dcbec1bcdc18a85a923f98e3f60dfeed2b44e7ffaffa886fb88c6bc9695f565baa12fc5a0ea7a3818e311ff004a299072388b1e6f
@@ -23,17 +23,49 @@ module AePageObjects
23
23
  autoload :Staleable, 'ae_page_objects/concerns/staleable'
24
24
  autoload :Visitable, 'ae_page_objects/concerns/visitable'
25
25
  end
26
-
26
+
27
+ module MultipleWindows
28
+ autoload :Browser, 'ae_page_objects/multiple_windows/browser'
29
+ autoload :Window, 'ae_page_objects/multiple_windows/window'
30
+ autoload :CrossWindowLoaderStrategy, 'ae_page_objects/multiple_windows/cross_window_loader_strategy'
31
+ autoload :WindowList, 'ae_page_objects/multiple_windows/window_list'
32
+ autoload :WindowHandleManager, 'ae_page_objects/multiple_windows/window_handle_manager'
33
+ end
34
+
35
+ module SingleWindow
36
+ autoload :Browser, 'ae_page_objects/single_window/browser'
37
+ autoload :Window, 'ae_page_objects/single_window/window'
38
+ autoload :SameWindowLoaderStrategy, 'ae_page_objects/single_window/same_window_loader_strategy'
39
+ end
40
+
27
41
  autoload :Window, 'ae_page_objects/window'
42
+
43
+ autoload :DocumentQuery, 'ae_page_objects/document_query'
44
+ autoload :DocumentLoader, 'ae_page_objects/document_loader'
45
+
28
46
  autoload :Node, 'ae_page_objects/node'
29
47
  autoload :Document, 'ae_page_objects/document'
48
+ autoload :DocumentProxy, 'ae_page_objects/document_proxy'
30
49
  autoload :Element, 'ae_page_objects/element'
31
50
  autoload :ElementProxy, 'ae_page_objects/element_proxy'
32
51
 
33
52
  autoload :Collection, 'ae_page_objects/elements/collection'
34
53
  autoload :Form, 'ae_page_objects/elements/form'
35
54
  autoload :Select, 'ae_page_objects/elements/select'
36
- autoload :Checkbox, 'ae_page_objects/elements/checkbox'
55
+ autoload :Checkbox, 'ae_page_objects/elements/checkbox'
56
+
57
+ def self.browser
58
+ @browser ||= begin
59
+ driver = Capybara.current_session.driver
60
+
61
+ case driver
62
+ when Capybara::Selenium::Driver then
63
+ MultipleWindows::Browser.new
64
+ else
65
+ SingleWindow::Browser.new
66
+ end
67
+ end
68
+ end
37
69
  end
38
70
 
39
71
  require 'ae_page_objects/core_ext/module'
@@ -93,6 +93,19 @@ module AePageObjects
93
93
  [url, router]
94
94
  end
95
95
  end
96
+
97
+ class Rails4 < Rails32
98
+
99
+ private
100
+ def url_and_router(url)
101
+ require 'action_dispatch/journey'
102
+ url = ActionDispatch::Journey::Router::Utils.normalize_path(url) unless url =~ %r{://}
103
+ router = Rails.application.routes.router
104
+
105
+ [url, router]
106
+ end
107
+ end
108
+
96
109
  end
97
110
 
98
111
  def path_recognizes_url?(path, url)
@@ -121,6 +134,9 @@ module AePageObjects
121
134
  Recognizer::Rails3.new
122
135
  elsif Rails.version =~ /\A3\.2/
123
136
  Recognizer::Rails32.new
137
+ elsif Rails.version =~ /\A4\.[01]/
138
+ warn "[WARNING]: AePageObjects works but is not thoroughly tested against Rails 4. Caveat emptor."
139
+ Recognizer::Rails4.new
124
140
  else
125
141
  warn "[WARNING]: AePageObjects is not tested against Rails #{Rails.version} and may behave in an undefined manner."
126
142
  Recognizer::Rails32.new
@@ -2,25 +2,23 @@ module AePageObjects
2
2
  class Document < Node
3
3
  include Concerns::Visitable
4
4
 
5
+ attr_reader :window
6
+
5
7
  def initialize
6
8
  super(Capybara.current_session)
7
- end
8
9
 
9
- if defined? Selenium::WebDriver
10
- attr_reader :window
11
-
12
- def initialize
13
- super(Capybara.current_session)
10
+ @window = browser.current_window
11
+ @window.current_document = self
12
+ end
14
13
 
15
- @window = Window.current
16
- @window.current_document = self
17
- end
14
+ def browser
15
+ AePageObjects.browser
18
16
  end
19
-
17
+
20
18
  def document
21
19
  self
22
20
  end
23
-
21
+
24
22
  class << self
25
23
  private
26
24
  def site
@@ -28,4 +26,4 @@ module AePageObjects
28
26
  end
29
27
  end
30
28
  end
31
- end
29
+ end
@@ -0,0 +1,30 @@
1
+ module AePageObjects
2
+ class DocumentLoader
3
+ def initialize(query, strategy)
4
+ @query = query
5
+ @strategy = strategy
6
+ end
7
+
8
+ def default_document_class
9
+ @default_document_class ||= @query.conditions.first.document_class
10
+ end
11
+
12
+ def permitted_types_dump
13
+ @permitted_types_dump ||= @query.conditions.map(&:document_class).map(&:name).inspect
14
+ end
15
+
16
+ def load
17
+ Waiter.wait_for do
18
+ @query.conditions.each do |document_condition|
19
+ if document = @strategy.load_document_with_condition(document_condition)
20
+ return document
21
+ end
22
+ end
23
+
24
+ nil
25
+ end
26
+
27
+ raise @strategy.document_not_loaded_error(self)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,47 @@
1
+ module AePageObjects
2
+ class DocumentProxy
3
+
4
+ # Remove all instance methods so even things like class()
5
+ # get handled by method_missing(). <lifted from activerecord>
6
+ instance_methods.each do |m|
7
+ unless m.to_s =~ /^(?:nil\?|send|object_id|to_a|tap)$|^__|^respond_to|is_a?|instance_variable_get/
8
+ undef_method m
9
+ end
10
+ end
11
+
12
+ def initialize(loaded_page, document_loader)
13
+ @loaded_page = loaded_page
14
+ @document_loader = document_loader
15
+ end
16
+
17
+ def is_a?(document_class)
18
+ super || @loaded_page.is_a?(document_class)
19
+ end
20
+
21
+ def as_a(document_class)
22
+ if @loaded_page.is_a?(document_class)
23
+ return @loaded_page
24
+ end
25
+
26
+ raise DocumentLoadError, "#{document_class.name} not expected. Allowed types: #{@document_loader.permitted_types_dump}"
27
+ end
28
+
29
+ private
30
+
31
+ def implicit_document
32
+ @implicit_document ||= as_a(implicit_document_class)
33
+ end
34
+
35
+ def implicit_document_class
36
+ @implicit_document_class ||= @document_loader.default_document_class
37
+ end
38
+
39
+ def method_missing(name, *args, &block)
40
+ implicit_document.__send__(name, *args, &block)
41
+ end
42
+
43
+ def respond_to?(*args)
44
+ super || implicit_document_class.allocate.respond_to?(*args)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,68 @@
1
+ module AePageObjects
2
+ class DocumentQuery
3
+ class Condition
4
+ attr_reader :document_class, :document_conditions
5
+
6
+ def initialize(document_class, document_conditions = {}, &block_condition)
7
+ @document_class = document_class
8
+
9
+ @document_conditions = document_conditions || {}
10
+ @document_conditions[:block] = block_condition if block_condition
11
+ end
12
+
13
+ def match?(document)
14
+ @document_conditions.each do |type, value|
15
+ case type
16
+ when :title then
17
+ return false unless Capybara.current_session.driver.browser.title.include?(value)
18
+ when :url then
19
+ return false unless document.current_url.include?(value)
20
+ when :block then
21
+ return false unless value.call(document)
22
+ end
23
+ end
24
+
25
+ true
26
+ end
27
+ end
28
+
29
+ attr_reader :conditions
30
+
31
+ def initialize(*document_classes, &block)
32
+ @conditions = []
33
+
34
+ if document_classes.empty?
35
+ raise ArgumentError, "block expected" if block.nil?
36
+ block.call(self)
37
+
38
+ raise ArgumentError, "conditions expected" if @conditions.empty?
39
+ else
40
+
41
+ all_documents = document_classes.all? do |document_class|
42
+ document_class.is_a?(Class) && document_class < Document
43
+ end
44
+
45
+ if all_documents
46
+ if document_classes.size == 1
47
+ matches(document_classes.first, {}, &block)
48
+ else
49
+ raise ArgumentError, "block unexpected for multiple documents" unless block.nil?
50
+
51
+ document_classes.each do |document_class|
52
+ matches(document_class)
53
+ end
54
+ end
55
+ else
56
+ raise ArgumentError, "Expected (Document, document_options)" unless document_classes.size == 2
57
+ raise ArgumentError, "Expected (Document, document_options)" unless (document_classes.first < Document) && document_classes.last.is_a?(Hash)
58
+
59
+ matches(document_classes.first, document_classes.last, &block)
60
+ end
61
+ end
62
+ end
63
+
64
+ def matches(document_class, conditions = {}, &block_condition)
65
+ @conditions << Condition.new(document_class, conditions, &block_condition)
66
+ end
67
+ end
68
+ end
@@ -28,6 +28,14 @@ module AePageObjects
28
28
  end
29
29
  end
30
30
 
31
+ def browser
32
+ @browser ||= document.browser
33
+ end
34
+
35
+ def window
36
+ @window ||= document.window
37
+ end
38
+
31
39
  def __full_name__
32
40
  if parent.respond_to?(:__full_name__)
33
41
  name_parts = [ parent.__full_name__, __name__ ].compact
@@ -1,10 +1,15 @@
1
1
  module AePageObjects
2
- class StalePageObject < StandardError
2
+ class Error < StandardError; end
3
+
4
+ class StalePageObject < Error
5
+ end
6
+
7
+ class LoadingFailed < Error
3
8
  end
4
9
 
5
- class LoadingFailed < StandardError
10
+ class PathNotResolvable < Error
6
11
  end
7
12
 
8
- class PathNotResolvable < StandardError
13
+ class DocumentLoadError < Error
9
14
  end
10
15
  end
@@ -0,0 +1,22 @@
1
+ module AePageObjects
2
+ module MultipleWindows
3
+ class Browser
4
+ attr_reader :windows
5
+
6
+ def initialize
7
+ @windows = WindowList.new
8
+ end
9
+
10
+ def current_window
11
+ @windows.current_window
12
+ end
13
+
14
+ def find_document(*document_classes, &block)
15
+ query = DocumentQuery.new(*document_classes, &block)
16
+ document_loader = DocumentLoader.new(query, CrossWindowLoaderStrategy.new(@windows))
17
+
18
+ DocumentProxy.new(document_loader.load, document_loader)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,49 @@
1
+ module AePageObjects
2
+ module MultipleWindows
3
+ class CrossWindowLoaderStrategy
4
+
5
+ def initialize(window_list)
6
+ @window_list = window_list
7
+ @original_window = window_list.current_window
8
+
9
+ @current_window_loader = SingleWindow::SameWindowLoaderStrategy.new
10
+ end
11
+
12
+ def load_document_with_condition(condition)
13
+ # Look in the current window first unless told not to
14
+ unless condition.document_conditions[:ignore_current]
15
+ @original_window.switch_to
16
+
17
+ if document = @current_window_loader.load_document_with_condition(condition)
18
+ return document
19
+ end
20
+ end
21
+
22
+ # Loop through all the windows and attempt to instantiate the Document. Continue to loop around
23
+ # until finding a Document that can be instantiated or timing out.
24
+ @window_list.opened.each do |window|
25
+ next if window == @original_window
26
+
27
+ window.switch_to
28
+
29
+ if document = @current_window_loader.load_document_with_condition(condition)
30
+ return document
31
+ end
32
+ end
33
+
34
+ @original_window.switch_to
35
+
36
+ nil
37
+ end
38
+
39
+ def document_not_loaded_error(document_loader)
40
+ all_windows = @window_list.opened.map do |window|
41
+ name = window.current_document && window.current_document.to_s || "<none>"
42
+ {:window_handle => window.handle, :document => name }
43
+ end
44
+
45
+ DocumentLoadError.new("Couldn't find document with type in #{document_loader.permitted_types_dump} in any of the open windows: #{all_windows.inspect}")
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,28 @@
1
+ module AePageObjects
2
+ module MultipleWindows
3
+ class Window < SingleWindow::Window
4
+ attr_reader :handle
5
+
6
+ def initialize(registry, handle)
7
+ @registry = registry
8
+ @handle = handle
9
+
10
+ @registry.add(self)
11
+
12
+ super()
13
+ end
14
+
15
+ def switch_to
16
+ WindowHandleManager.switch_to(handle)
17
+ current_document
18
+ end
19
+
20
+ def close
21
+ if WindowHandleManager.close(@handle)
22
+ self.current_document = nil
23
+ @registry.remove(self)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,50 @@
1
+ module AePageObjects
2
+ module MultipleWindows
3
+ class WindowHandleManager
4
+ def self.all
5
+ browser.window_handles
6
+ end
7
+
8
+ def self.current
9
+ # Accessing browser.window_handle tries to find an existing page, which will blow up
10
+ # if there isn't one. So... we look at the collection first as a guard.
11
+ if all.empty?
12
+ nil
13
+ else
14
+ browser.window_handle
15
+ end
16
+ end
17
+
18
+ def self.switch_to(handle)
19
+ browser.switch_to.window(handle)
20
+ end
21
+
22
+ def self.browser
23
+ Capybara.current_session.driver.browser
24
+ end
25
+
26
+ def self.close(handle)
27
+ all_handles_before_close = all()
28
+ more_than_one_window = (all_handles_before_close.size > 1)
29
+
30
+ # We must protect against closing the last window as doing so will quit the entire browser
31
+ # which would mess up subsequent tests.
32
+ # http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebDriver.html#close()
33
+ return false unless more_than_one_window
34
+
35
+ current_handle_before_switch = current
36
+
37
+ # switch to the window to close
38
+ switch_to(handle)
39
+
40
+ browser.close
41
+
42
+ # need to switch back to something. Use whatever was switched from originally unless we just
43
+ # closed that window, in which case just pick something else.
44
+ switch_to(current_handle_before_switch == handle ? all.first : current_handle_before_switch)
45
+
46
+ true
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,43 @@
1
+ module AePageObjects
2
+ module MultipleWindows
3
+ class WindowList
4
+ def initialize
5
+ @windows = {}
6
+ end
7
+
8
+ def add(window)
9
+ @windows[window.handle] = window
10
+ end
11
+
12
+ def remove(window)
13
+ @windows.delete(window.handle)
14
+ end
15
+
16
+ def opened
17
+ WindowHandleManager.all.map do |handle|
18
+ find(handle)
19
+ end
20
+ end
21
+
22
+ def current_window
23
+ current_handle = WindowHandleManager.current
24
+
25
+ find(current_handle) if current_handle
26
+ end
27
+
28
+ def close_all
29
+ opened.each(&:close)
30
+ end
31
+
32
+ private
33
+
34
+ def find(handle)
35
+ @windows[handle] || create_window(handle)
36
+ end
37
+
38
+ def create_window(handle)
39
+ Window.new(self, handle)
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,11 @@
1
+ module AePageObjects
2
+ module SingleWindow
3
+ class Browser
4
+ attr_reader :current_window
5
+
6
+ def initialize
7
+ @current_window = Window.new
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ module AePageObjects
2
+ module SingleWindow
3
+ class SameWindowLoaderStrategy
4
+ def load_document_with_condition(condition)
5
+ document = load_document(condition.document_class)
6
+
7
+ if document && condition_matches?(document, condition)
8
+ document
9
+ else
10
+ nil
11
+ end
12
+ end
13
+
14
+ def document_not_loaded_error(document_loader)
15
+ DocumentLoadError.new("Current window does not contain document with type in #{document_loader.permitted_types_dump}.")
16
+ end
17
+
18
+ private
19
+
20
+ def load_document(document_class)
21
+ document_class.new
22
+ rescue AePageObjects::LoadingFailed
23
+ nil
24
+ end
25
+
26
+ def condition_matches?(document, condition)
27
+ condition.match?(document)
28
+ rescue Capybara::ElementNotFound
29
+ false
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,23 @@
1
+ module AePageObjects
2
+ module SingleWindow
3
+ class Window
4
+ attr_reader :current_document
5
+
6
+ def initialize
7
+ @current_document = nil
8
+ end
9
+
10
+ def current_document=(document)
11
+ @current_document.send(:stale!) if @current_document
12
+ @current_document = document
13
+ end
14
+
15
+ def change_to(*document_classes, &block)
16
+ query = DocumentQuery.new(*document_classes, &block)
17
+ document_loader = DocumentLoader.new(query, SameWindowLoaderStrategy.new)
18
+
19
+ DocumentProxy.new(document_loader.load, document_loader)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module AePageObjects
2
- VERSION = '1.0.2'.freeze
2
+ VERSION = '1.1.0'.freeze
3
3
  end
@@ -1,125 +1,18 @@
1
+ unless AePageObjects.respond_to?(:browser)
2
+ raise "Deprecation warnings out of date."
3
+ end
4
+
1
5
  module AePageObjects
2
6
  class Window
3
-
4
- class Registry < Hash
5
- def [](window_or_handle)
6
- if window_or_handle.is_a?(Window)
7
- super(window_or_handle.handle)
8
- else
9
- super(window_or_handle)
10
- end
11
- end
12
-
13
- def add(window)
14
- self[window.handle] = window
15
- end
16
-
17
- def remove(window)
18
- self.delete(window.handle)
19
- end
20
- end
21
-
22
- class HandleManager
23
- def self.all
24
- browser.window_handles
25
- end
26
-
27
- def self.current
28
- # Accessing browser.window_handle tries to find an existing page, which will blow up
29
- # if there isn't one. So... we look at the collection first as a guard.
30
- if all.empty?
31
- nil
32
- else
33
- browser.window_handle
34
- end
35
- end
36
-
37
- def self.switch_to(handle)
38
- browser.switch_to.window(handle)
39
- end
40
-
41
- def self.browser
42
- Capybara.current_session.driver.browser
43
- end
44
-
45
- def self.close(handle)
46
- all_handles_before_close = all()
47
- more_than_one_window = (all_handles_before_close.size > 1)
48
-
49
- # We must protect against closing the last window as doing so will quit the entire browser
50
- # which would mess up subsequent tests.
51
- # http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/WebDriver.html#close()
52
- return false unless more_than_one_window
53
-
54
- current_handle_before_switch = current
55
-
56
- # switch to the window to close
57
- switch_to(handle)
58
-
59
- browser.close
60
-
61
- # need to switch back to something. Use whatever was switched from originally unless we just
62
- # closed that window, in which case just pick something else.
63
- switch_to(current_handle_before_switch == handle ? all.first : current_handle_before_switch)
64
-
65
- true
66
- end
67
- end
68
-
69
7
  class << self
70
- def registry
71
- @registry ||= Registry.new
72
- end
73
-
74
- def close_all
75
- all.each(&:close)
76
- end
77
-
78
8
  def all
79
- HandleManager.all.map do |handle|
80
- find(handle)
81
- end
82
- end
83
-
84
- def find(handle)
85
- registry[handle] || create(handle)
86
- end
87
-
88
- def current
89
- current_handle = HandleManager.current
90
-
91
- find(current_handle) if current_handle
9
+ warn "[DEPRECATION WARNING]: AePageObjects::Window.all is deprecated. Use AePageObjects.browser.windows()"
10
+ AePageObjects.browser.windows
92
11
  end
93
12
 
94
- def create(handle)
95
- new(registry, handle)
96
- end
97
- end
98
-
99
- attr_reader :current_document, :handle
100
-
101
- def initialize(registry, handle)
102
- @registry = registry
103
- @handle = handle
104
- @current_document = nil
105
-
106
- @registry.add(self)
107
- end
108
-
109
- def current_document=(document)
110
- @current_document.send(:stale!) if @current_document
111
- @current_document = document
112
- end
113
-
114
- def switch_to
115
- HandleManager.switch_to(handle)
116
- current_document
117
- end
118
-
119
- def close
120
- if HandleManager.close(@handle)
121
- self.current_document = nil
122
- @registry.remove(self)
13
+ def close_all
14
+ warn "[DEPRECATION WARNING]: AePageObjects::Window.close_all is deprecated. Use AePageObjects.browser.windows.close_all()"
15
+ all.close_all
123
16
  end
124
17
  end
125
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ae_page_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Donnie Tognazzini
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-15 00:00:00.000000000 Z
11
+ date: 2014-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: capybara
@@ -49,6 +49,9 @@ files:
49
49
  - lib/ae_page_objects/core/universe.rb
50
50
  - lib/ae_page_objects/core_ext/module.rb
51
51
  - lib/ae_page_objects/document.rb
52
+ - lib/ae_page_objects/document_loader.rb
53
+ - lib/ae_page_objects/document_proxy.rb
54
+ - lib/ae_page_objects/document_query.rb
52
55
  - lib/ae_page_objects/element.rb
53
56
  - lib/ae_page_objects/element_proxy.rb
54
57
  - lib/ae_page_objects/elements/checkbox.rb
@@ -56,7 +59,15 @@ files:
56
59
  - lib/ae_page_objects/elements/form.rb
57
60
  - lib/ae_page_objects/elements/select.rb
58
61
  - lib/ae_page_objects/exceptions.rb
62
+ - lib/ae_page_objects/multiple_windows/browser.rb
63
+ - lib/ae_page_objects/multiple_windows/cross_window_loader_strategy.rb
64
+ - lib/ae_page_objects/multiple_windows/window.rb
65
+ - lib/ae_page_objects/multiple_windows/window_handle_manager.rb
66
+ - lib/ae_page_objects/multiple_windows/window_list.rb
59
67
  - lib/ae_page_objects/node.rb
68
+ - lib/ae_page_objects/single_window/browser.rb
69
+ - lib/ae_page_objects/single_window/same_window_loader_strategy.rb
70
+ - lib/ae_page_objects/single_window/window.rb
60
71
  - lib/ae_page_objects/util/hash_symbolizer.rb
61
72
  - lib/ae_page_objects/util/inflector.rb
62
73
  - lib/ae_page_objects/util/internal_helpers.rb