terminus_spec 0.5.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/.gitignore +26 -0
- data/.rspec +1 -0
- data/.rvmrc +2 -0
- data/.travis.yml +6 -0
- data/Gemfile +7 -0
- data/HISTORY.md +54 -0
- data/LICENSE +20 -0
- data/README.md +13 -0
- data/Rakefile +43 -0
- data/cucumber.yml +6 -0
- data/lib/terminus_spec.rb +200 -0
- data/lib/terminus_spec/factory.rb +27 -0
- data/lib/terminus_spec/generators.rb +80 -0
- data/lib/terminus_spec/locators.rb +23 -0
- data/lib/terminus_spec/logger.rb +7 -0
- data/lib/terminus_spec/matchers.rb +41 -0
- data/lib/terminus_spec/platform_selenium.rb +18 -0
- data/lib/terminus_spec/platform_selenium/platform_object.rb +214 -0
- data/lib/terminus_spec/platform_selenium/web_objects/all.rb +98 -0
- data/lib/terminus_spec/platform_selenium/web_objects/button.rb +13 -0
- data/lib/terminus_spec/platform_selenium/web_objects/link.rb +13 -0
- data/lib/terminus_spec/platform_selenium/web_objects/text_field.rb +14 -0
- data/lib/terminus_spec/platform_watir.rb +18 -0
- data/lib/terminus_spec/platform_watir/platform_object.rb +190 -0
- data/lib/terminus_spec/platform_watir/web_objects/all.rb +88 -0
- data/lib/terminus_spec/platform_watir/web_objects/text_field.rb +13 -0
- data/lib/terminus_spec/platforms.rb +25 -0
- data/lib/terminus_spec/version.rb +3 -0
- data/lib/terminus_spec/web_objects/all.rb +172 -0
- data/lib/terminus_spec/web_objects/button.rb +32 -0
- data/lib/terminus_spec/web_objects/link.rb +40 -0
- data/lib/terminus_spec/web_objects/text_field.rb +45 -0
- data/spec/spec_helper.rb +37 -0
- data/spec/terminus_spec/factory_spec.rb +40 -0
- data/spec/terminus_spec/generators_spec.rb +179 -0
- data/spec/terminus_spec/locators_spec.rb +30 -0
- data/spec/terminus_spec/platform_selenium_spec.rb +28 -0
- data/spec/terminus_spec/platform_watir_spec.rb +32 -0
- data/spec/terminus_spec/platforms_spec.rb +43 -0
- data/spec/terminus_spec/terminus_spec.rb +271 -0
- data/spec/terminus_spec/web_objects/all_spec.rb +87 -0
- data/spec/terminus_spec/web_objects/button_spec.rb +35 -0
- data/spec/terminus_spec/web_objects/link_spec.rb +46 -0
- data/spec/terminus_spec/web_objects/text_field_spec.rb +48 -0
- data/spec/terminus_spec/webobject_selenium_spec.rb +154 -0
- data/spec/terminus_spec/webobject_watir_spec.rb +120 -0
- data/specs/app/favicon.ico +0 -0
- data/specs/app/images/mass_extinction.jpg +0 -0
- data/specs/app/index.html +20 -0
- data/specs/app/modal_1.html +41 -0
- data/specs/app/modal_2.html +29 -0
- data/specs/app/server.rb +25 -0
- data/specs/app/style.css +18 -0
- data/specs/app/success_1.html +12 -0
- data/specs/app/success_2.html +12 -0
- data/specs/app/test_event.html +39 -0
- data/specs/app/test_form.html +114 -0
- data/specs/app/test_frame.html +15 -0
- data/specs/app/test_iframe.html +15 -0
- data/specs/app/test_static.html +92 -0
- data/specs/engine/borg.rb +27 -0
- data/specs/engine/hooks.rb +23 -0
- data/terminus_spec.gemspec +31 -0
- metadata +198 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
module TerminusSpec
|
2
|
+
module Locators
|
3
|
+
|
4
|
+
# Returns a link object.
|
5
|
+
# @param [Hash] locator how the link can be found
|
6
|
+
def link_web_object(locator)
|
7
|
+
@platform.get_link_for(locator.clone)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns a text field object.
|
11
|
+
# @param [Hash] locator how the link can be found
|
12
|
+
def text_field_web_object(locator)
|
13
|
+
@platform.get_text_field_for(locator.clone)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns a button object.
|
17
|
+
# @param [Hash] locator how the button can be found
|
18
|
+
def button_web_object(locator)
|
19
|
+
@platform.get_button_for(locator.clone)
|
20
|
+
end
|
21
|
+
|
22
|
+
end # module Locators
|
23
|
+
end # module TerminusSpec
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module TerminusSpec
|
2
|
+
module Matchers
|
3
|
+
|
4
|
+
RSpec::Matchers.define :have_title do |text|
|
5
|
+
match do |the_page|
|
6
|
+
the_page =~ Regexp.new(text)
|
7
|
+
end
|
8
|
+
|
9
|
+
failure_message_for_should do |actual|
|
10
|
+
"Expected that '#{text}' would be the title of the page; found '#{actual}' instead."
|
11
|
+
end
|
12
|
+
|
13
|
+
failure_message_for_should_not do |actual|
|
14
|
+
"Expected that '#{text}' would not be the title of the page; it was, however."
|
15
|
+
end
|
16
|
+
|
17
|
+
description do
|
18
|
+
"checking for a title of #{text}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
RSpec::Matchers.define :contain do |text|
|
23
|
+
match do |the_page|
|
24
|
+
the_page =~ Regexp.new(text)
|
25
|
+
end
|
26
|
+
|
27
|
+
failure_message_for_should do |actual|
|
28
|
+
"Expected that '#{text}' would be in the page content; it was not found."
|
29
|
+
end
|
30
|
+
|
31
|
+
failure_message_for_should_not do |actual|
|
32
|
+
"Expected that '#{text}' would not be in the page content; it was, however."
|
33
|
+
end
|
34
|
+
|
35
|
+
description do
|
36
|
+
"checking for #{text}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end # module Matchers
|
41
|
+
end # module TerminusSpec
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module TerminusSpec
|
2
|
+
module Platforms
|
3
|
+
module SeleniumWebDriver
|
4
|
+
|
5
|
+
def self.create_platform_object_for(browser)
|
6
|
+
require 'terminus_spec/platform_selenium/platform_object'
|
7
|
+
return SeleniumWebDriver::PlatformObject.new(browser)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.works_for?(browser)
|
11
|
+
browser.is_a?(Selenium::WebDriver::Driver)
|
12
|
+
end
|
13
|
+
|
14
|
+
end # module SeleniumWebDriver
|
15
|
+
end # module Platforms
|
16
|
+
end # module TerminusSpec
|
17
|
+
|
18
|
+
TerminusSpec::Platforms.associate(:selenium_webdriver, TerminusSpec::Platforms::SeleniumWebDriver)
|
@@ -0,0 +1,214 @@
|
|
1
|
+
module TerminusSpec
|
2
|
+
module Platforms
|
3
|
+
module SeleniumWebDriver
|
4
|
+
|
5
|
+
class PlatformObject
|
6
|
+
|
7
|
+
attr_reader :browser
|
8
|
+
|
9
|
+
def initialize(browser)
|
10
|
+
@browser = browser
|
11
|
+
end
|
12
|
+
|
13
|
+
# Platform method to navigate to a specified URL.
|
14
|
+
# See TerminusSpec#navigate_to
|
15
|
+
def navigate_to(url)
|
16
|
+
@browser.navigate.to url
|
17
|
+
end
|
18
|
+
|
19
|
+
# Platform method to retrieve the title for the current page.
|
20
|
+
# See TerminusSpec#title
|
21
|
+
def title
|
22
|
+
@browser.title
|
23
|
+
end
|
24
|
+
|
25
|
+
# Platform method to retrieve text from the current page.
|
26
|
+
# See TerminusSpec#text
|
27
|
+
def text
|
28
|
+
@browser.find_element(:tag_name, 'body').text
|
29
|
+
end
|
30
|
+
|
31
|
+
# Platform method to retrieve the HTML markup for the current page.
|
32
|
+
# See TerminusSpec#html
|
33
|
+
def html
|
34
|
+
@browser.page_source
|
35
|
+
end
|
36
|
+
|
37
|
+
# Platform method to get the current URL.
|
38
|
+
# See TerminusSpec#current_url
|
39
|
+
def current_url
|
40
|
+
@browser.current_url
|
41
|
+
end
|
42
|
+
|
43
|
+
# Platform method to refresh the page.
|
44
|
+
# See TerminusSpec#refresh
|
45
|
+
def refresh
|
46
|
+
@browser.navigate.refresh
|
47
|
+
end
|
48
|
+
|
49
|
+
# Platform method to go to the preceding page in history.
|
50
|
+
# See TerminusSpec#back
|
51
|
+
def back
|
52
|
+
@browser.navigate.back
|
53
|
+
end
|
54
|
+
|
55
|
+
# Platform method to go to the succeeding page in history.
|
56
|
+
# See TerminusSpec#forward
|
57
|
+
def forward
|
58
|
+
@browser.navigate.forward
|
59
|
+
end
|
60
|
+
|
61
|
+
# Platform method to clear the cookies from the browser.
|
62
|
+
# See TerminusSpec#clear_cookies
|
63
|
+
def clear_cookies
|
64
|
+
@browser.manage.delete_all_cookies
|
65
|
+
end
|
66
|
+
|
67
|
+
# Platform method to save the current screenshot to a file.
|
68
|
+
# See TerminusSpec#save_screenshot
|
69
|
+
def save_screenshot(file_name)
|
70
|
+
@browser.save_screenshot(file_name)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Platform method to wait for a condition on a page to be true.
|
74
|
+
# See TerminusSpec#wait_until
|
75
|
+
def wait_until(timeout, message, &block)
|
76
|
+
wait = Selenium::WebDriver::Wait.new({:timeout=>timeout, :message=>message})
|
77
|
+
wait.until(&block)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Platform method to handle an alert popup message box.
|
81
|
+
# See TerminusSpec#alert
|
82
|
+
def will_alert(&block)
|
83
|
+
@browser.execute_script "window.alert = function(msg) { window.__lastWatirAlert = msg; }"
|
84
|
+
yield
|
85
|
+
value = @browser.execute_script "return window.__lastWatirAlert"
|
86
|
+
value
|
87
|
+
end
|
88
|
+
|
89
|
+
# Platform method to handle an confirmation popup message box.
|
90
|
+
# See TerminusSpec#will_confirm
|
91
|
+
def will_confirm(response, &block)
|
92
|
+
@browser.execute_script "window.confirm = function(msg) { window.__lastWatirConfirm=msg; return #{!!response} }"
|
93
|
+
yield
|
94
|
+
value = @browser.execute_script "return window.__lastWatirConfirm"
|
95
|
+
value
|
96
|
+
end
|
97
|
+
|
98
|
+
# Platform method to handle a prompt popup message box.
|
99
|
+
# See TerminusSpec#will_prompt
|
100
|
+
def will_prompt(response, &block)
|
101
|
+
@browser.execute_script "window.prompt = function(text, value) { window.__lastWatirPrompt = { message: text, default_value: value }; return #{response.to_json}; }"
|
102
|
+
yield
|
103
|
+
result = @browser.execute_script "return window.__lastWatirPrompt"
|
104
|
+
result && result.dup.each_key { |k| result[k.to_sym] = result.delete(k) }
|
105
|
+
result
|
106
|
+
end
|
107
|
+
|
108
|
+
# Platform method to attach to a displayed window.
|
109
|
+
# See TerminusSpec#attach_to_window
|
110
|
+
def attach_to_window(identifier, &block)
|
111
|
+
value = identifier.values.first
|
112
|
+
key = identifier.keys.first
|
113
|
+
handles = @browser.window_handles
|
114
|
+
handles.each do |handle|
|
115
|
+
@browser.switch_to.window handle
|
116
|
+
if (key == :title and value == @browser.title) or (key == :url and value == @browser.current_url)
|
117
|
+
return @browser.switch_to.window handle, &block
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# Platform method to return a link object.
|
123
|
+
# Link objects are of type: TerminusSpec::WebObjects::Link
|
124
|
+
# See TerminusSpec::Generators#link
|
125
|
+
def get_link_for(locator)
|
126
|
+
key, value = get_platform_locator_for(locator, WebObjects::Link, 'a')
|
127
|
+
web_object = @browser.find_element(key, value)
|
128
|
+
WebObjects::Link.new(web_object, :platform => :selenium_webdriver)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Platform method to click a link object.
|
132
|
+
# See TerminusSpec::Generators#link
|
133
|
+
def click_link_for(locator)
|
134
|
+
key, value = get_platform_locator_for(locator, WebObjects::Link, 'a')
|
135
|
+
@browser.find_element(key, value).click
|
136
|
+
end
|
137
|
+
|
138
|
+
# Platform method to return a text field object.
|
139
|
+
# Text field objects are of type: TerminusSpec::WebObjects::TextField
|
140
|
+
# See TerminusSpec::Generators#text_field
|
141
|
+
def get_text_field_for(locator)
|
142
|
+
key, value = get_platform_locator_for(locator, WebObjects::TextField, 'input', :type => 'text')
|
143
|
+
web_object = @browser.find_element(key, value)
|
144
|
+
WebObjects::TextField.new(web_object, :platform => :selenium_webdriver)
|
145
|
+
end
|
146
|
+
|
147
|
+
# Platform method to get the value in a text field object.
|
148
|
+
# See TerminusSpec::Generators#text_field
|
149
|
+
def get_text_field_value_for(locator)
|
150
|
+
key, value = get_platform_locator_for(locator, WebObjects::TextField, 'input', :type => 'text')
|
151
|
+
value = @browser.find_element(key, value).attribute('value')
|
152
|
+
value
|
153
|
+
end
|
154
|
+
|
155
|
+
# Platform method to set a value in a text field object.
|
156
|
+
# See TerminusSpec::Generators#text_field
|
157
|
+
def set_text_field_value_for(locator, text)
|
158
|
+
key, value = get_platform_locator_for(locator, WebObjects::TextField, 'input', :type => 'text')
|
159
|
+
@browser.find_element(key, value).clear
|
160
|
+
@browser.find_element(key, value).send_keys(text)
|
161
|
+
end
|
162
|
+
|
163
|
+
# Platform method to return a button object.
|
164
|
+
# Button objects are of type: TerminusSpec::WebObjects::Button
|
165
|
+
# See TerminusSpec::Generators#button
|
166
|
+
def get_button_for(locator)
|
167
|
+
key, value = get_platform_locator_for(locator, WebObjects::Button, 'input', :type => 'submit')
|
168
|
+
web_object = @browser.find_element(key, value)
|
169
|
+
WebObjects::Button.new(web_object, :platform => :selenium_webdriver)
|
170
|
+
end
|
171
|
+
|
172
|
+
# Platform method to click a button object.
|
173
|
+
# See TerminusSpec::Generators#button
|
174
|
+
def click_button_for(locator)
|
175
|
+
key, value = get_platform_locator_for(locator, WebObjects::Button, 'input', :type => 'submit')
|
176
|
+
@browser.find_element(key, value).click
|
177
|
+
end
|
178
|
+
|
179
|
+
protected
|
180
|
+
|
181
|
+
def get_platform_locator_for(locator, web_object, tag=nil, qualifier=nil)
|
182
|
+
locator = qualify_with_tagname_for locator, tag, qualifier if tag
|
183
|
+
key, value = web_object.have_selenium_find_object_with locator
|
184
|
+
return key, value
|
185
|
+
end
|
186
|
+
|
187
|
+
def qualify_with_tagname_for(locator, tag, qualifier=nil)
|
188
|
+
return locator if locator.length < 2 and support_is_provided_for locator, tag, qualifier
|
189
|
+
locator[:tag_name] = tag
|
190
|
+
if qualifier
|
191
|
+
qualifier.each do |key, value|
|
192
|
+
locator[key] = value
|
193
|
+
end
|
194
|
+
end
|
195
|
+
locator
|
196
|
+
end
|
197
|
+
|
198
|
+
def support_is_provided_for(locator, tag, qualifier)
|
199
|
+
return false if locator[:index]
|
200
|
+
return false if locator[:text] and tag == 'input' and qualifier[:type] == 'hidden'
|
201
|
+
return false if locator[:href] and tag == 'a'
|
202
|
+
return false if locator[:text] and ['div', 'span', 'td'].include? tag
|
203
|
+
return false if locator[:value] and tag == 'input' and qualifier[:type] == 'submit'
|
204
|
+
return false if locator[:value] and tag == 'input' and qualifier[:type] == 'radio'
|
205
|
+
true
|
206
|
+
end
|
207
|
+
|
208
|
+
end # class PlatformObject
|
209
|
+
|
210
|
+
end # module SeleniumWebDriver
|
211
|
+
end # module Platforms
|
212
|
+
end # module TerminusSpec
|
213
|
+
|
214
|
+
Dir["#{File.dirname(__FILE__)}/../web_objects/**/*.rb"].each { |file| require file }
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module TerminusSpec
|
2
|
+
module Platforms
|
3
|
+
module SeleniumWebDriver
|
4
|
+
module WebObject
|
5
|
+
|
6
|
+
def ==(other)
|
7
|
+
@web_object == other # other.element??
|
8
|
+
end
|
9
|
+
|
10
|
+
def visible?
|
11
|
+
@web_object.displayed?
|
12
|
+
end
|
13
|
+
|
14
|
+
def exists?
|
15
|
+
nil != @web_object
|
16
|
+
end
|
17
|
+
|
18
|
+
def text
|
19
|
+
@web_object.text
|
20
|
+
end
|
21
|
+
|
22
|
+
def value
|
23
|
+
@web_object.attribute('value')
|
24
|
+
end
|
25
|
+
|
26
|
+
def tag_name
|
27
|
+
@web_object.tag_name
|
28
|
+
end
|
29
|
+
|
30
|
+
def clear
|
31
|
+
@web_object.clear
|
32
|
+
end
|
33
|
+
|
34
|
+
def right_click
|
35
|
+
@web_object.context_click
|
36
|
+
end
|
37
|
+
|
38
|
+
# Send keystrokes to the object.
|
39
|
+
# @param [String, Symbol, Array]
|
40
|
+
# @examples
|
41
|
+
# web_object.send_keys "test" #=> value: 'foo'
|
42
|
+
# web_object.send_keys "tet", :arrow_left, "s" #=> value: 'test'
|
43
|
+
# web_object.send_keys [:control, 'a'], :space #=> value: ' '
|
44
|
+
# @see Selenium::WebDriver::Keys::KEYS
|
45
|
+
def send_keys(*args)
|
46
|
+
@web_object.send_keys(*args)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Waits until an object is present on the screen.
|
50
|
+
# @param [Integer] (defaults to: 5) seconds to wait before timing out
|
51
|
+
def when_present(timeout=5)
|
52
|
+
wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => "Object not present in #{timeout} seconds"})
|
53
|
+
wait.until do
|
54
|
+
self.exists?
|
55
|
+
end
|
56
|
+
self
|
57
|
+
end
|
58
|
+
|
59
|
+
# Waits until an object is visible on the screen.
|
60
|
+
# @param [Integer] (defaults to: 5) seconds to wait before timing out
|
61
|
+
def when_visible(timeout=5)
|
62
|
+
wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => "Object not present in #{timeout} seconds"})
|
63
|
+
wait.until do
|
64
|
+
self.visible?
|
65
|
+
end
|
66
|
+
self
|
67
|
+
end
|
68
|
+
|
69
|
+
# Waits until an object is not visible on the screen.
|
70
|
+
# @param [Integer] (defaults to: 5) seconds to wait before timing out
|
71
|
+
def when_not_visible(timeout=5)
|
72
|
+
wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => "Object not present in #{timeout} seconds"})
|
73
|
+
wait.until do
|
74
|
+
not self.visible?
|
75
|
+
end
|
76
|
+
self
|
77
|
+
end
|
78
|
+
|
79
|
+
# Waits until a given returns true (and thus was executed).
|
80
|
+
# @param [Integer] (defaults to: 5) seconds to wait before timing out
|
81
|
+
# @param [String] the message to display if the event times out
|
82
|
+
# @param the block to execute when the event occurs
|
83
|
+
def wait_until(timeout=5, message=nil, &block)
|
84
|
+
wait = Object::Selenium::WebDriver::Wait.new({:timeout => timeout, :message => message})
|
85
|
+
wait.until(&block)
|
86
|
+
end
|
87
|
+
|
88
|
+
# Get the value of a the given attribute of the object.
|
89
|
+
# @param [String] attribute name
|
90
|
+
# @return [String,nil] attribute value
|
91
|
+
def attribute(attribute_name)
|
92
|
+
@web_object.attribute attribute_name
|
93
|
+
end
|
94
|
+
|
95
|
+
end # module WebObject
|
96
|
+
end # module SeleniumWebDriver
|
97
|
+
end # module Platforms
|
98
|
+
end # module TerminusSpec
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module TerminusSpec
|
2
|
+
module Platforms
|
3
|
+
module SeleniumWebDriver
|
4
|
+
module Button
|
5
|
+
|
6
|
+
def text
|
7
|
+
raise "Returning text from a button element in Selenium is not possible."
|
8
|
+
end
|
9
|
+
|
10
|
+
end # module Button
|
11
|
+
end # module SeleniumWebDriver
|
12
|
+
end # module Platforms
|
13
|
+
end # module TerminusSpec
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module TerminusSpec
|
2
|
+
module Platforms
|
3
|
+
module SeleniumWebDriver
|
4
|
+
module Link
|
5
|
+
|
6
|
+
def value
|
7
|
+
raise "Returning value from a link element in Selenium is not possible."
|
8
|
+
end
|
9
|
+
|
10
|
+
end # module Link
|
11
|
+
end # module SeleniumWebDriver
|
12
|
+
end # module Platforms
|
13
|
+
end # module TerminusSpec
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module TerminusSpec
|
2
|
+
module Platforms
|
3
|
+
module SeleniumWebDriver
|
4
|
+
module TextField
|
5
|
+
|
6
|
+
def value=(this)
|
7
|
+
@web_object.clear
|
8
|
+
@web_object.send_keys(this)
|
9
|
+
end
|
10
|
+
|
11
|
+
end # module TextField
|
12
|
+
end # module SeleniumWebDriver
|
13
|
+
end # module Platforms
|
14
|
+
end # module TerminusSpec
|