spectest 0.0.2 → 0.0.3
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/HISTORY.md +11 -0
- data/lib/spectest.rb +14 -1
- data/lib/spectest/generators.rb +78 -0
- data/lib/spectest/platform_selenium/platform_object.rb +88 -1
- data/lib/spectest/platform_watir/platform_object.rb +72 -1
- data/lib/spectest/version.rb +1 -1
- data/lib/spectest/web_objects/all.rb +53 -0
- data/lib/spectest/web_objects/button.rb +17 -0
- data/lib/spectest/web_objects/link.rb +24 -0
- data/lib/spectest/web_objects/text_field.rb +25 -0
- data/spec/generators_spec.rb +182 -0
- data/specs/engine/hooks.rb +1 -1
- data/specs/pages/form_examples_page.rb +7 -0
- data/specs/pages/landing_page.rb +4 -1
- data/specs/pages/static_examples_page.rb +4 -0
- data/specs/pages/success_1_page.rb +3 -0
- data/specs/steps/button_steps.rb +3 -0
- data/specs/steps/link_steps.rb +3 -0
- data/specs/steps/object_steps.rb +3 -0
- data/specs/steps/page_steps.rb +23 -2
- data/specs/steps/text_field_steps.rb +8 -0
- data/specs/tests/button.feature +13 -0
- data/specs/tests/link.feature +12 -0
- data/specs/tests/page.feature +6 -6
- data/specs/tests/text_field.feature +21 -0
- metadata +28 -12
data/HISTORY.md
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
Change Log and History
|
2
2
|
======================
|
3
3
|
|
4
|
+
|
5
|
+
## Version 0.0.3 / 2011-11-14
|
6
|
+
|
7
|
+
This update put in place the basic functionality of allowing the platform object to query and manipulate objects. This required the creation of a web object structure. Here "web objects" refer to any elements that appear on a browser web page. When I say "query" these objects, I essentially mean checking if they in fact exist. When I say "manipulate" these objects, I mean do something with them, such as click them or enter information into them. Each platform object has its own identification mechanisms in place.
|
8
|
+
|
9
|
+
* Web Objects Supported:
|
10
|
+
* Links
|
11
|
+
* Text Fields
|
12
|
+
* Buttons
|
13
|
+
|
14
|
+
|
4
15
|
## Version 0.0.2 / 2011-11-13
|
5
16
|
|
6
17
|
Platform object structure added. This allows browsers to be associated with a particular driver. That combination is called a "platform object." It's this object that directs the execution of tests against the browser. A full RSpec and Cucumber testing infrastructure has been added. The Cucumber file layout will match what users of the gem would have to create.
|
data/lib/spectest.rb
CHANGED
@@ -2,6 +2,7 @@ require "spectest/version"
|
|
2
2
|
require "spectest/logger"
|
3
3
|
require "spectest/matchers"
|
4
4
|
require "spectest/platforms"
|
5
|
+
require "spectest/generators"
|
5
6
|
|
6
7
|
module SpecTest
|
7
8
|
include Matchers
|
@@ -15,9 +16,17 @@ module SpecTest
|
|
15
16
|
"SpecTest version #{SpecTest::VERSION}"
|
16
17
|
end
|
17
18
|
|
18
|
-
|
19
|
+
# This makes sure that any page classes that include SpecTest will be
|
20
|
+
# given access to the generator methods based on web objects that are
|
21
|
+
# declared in the page class.
|
22
|
+
def self.included(caller)
|
23
|
+
caller.extend SpecTest::Generators
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(browser, visit=nil)
|
19
27
|
@browser = browser
|
20
28
|
establish_platform_driver_for browser
|
29
|
+
goto if visit && respond_to?(:goto)
|
21
30
|
end
|
22
31
|
|
23
32
|
# Navigate to the specified URL. The URL can be specified as a domain
|
@@ -47,4 +56,8 @@ module SpecTest
|
|
47
56
|
def establish_platform_driver_for(browser)
|
48
57
|
@platform = platform_for browser, SpecTest::Platforms.list
|
49
58
|
end
|
59
|
+
|
60
|
+
def process_block(&block)
|
61
|
+
block.arity == 1 ? block.call(self) : self.instance_eval(&block)
|
62
|
+
end
|
50
63
|
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module Generators
|
3
|
+
|
4
|
+
# Allows you to specify a direct URL as part of a page object.
|
5
|
+
# @param [String] url the address for the page.
|
6
|
+
def url_is(url)
|
7
|
+
define_method("goto") do
|
8
|
+
@platform.navigate_to url
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
# Create methods to do the following:
|
13
|
+
# Select a link object.
|
14
|
+
# Return a link object.
|
15
|
+
# @param [String] identifier how a link will be referred to
|
16
|
+
# @param [Hash] locator how a link will be recognized
|
17
|
+
# @param [optional] block to be invoked when object method is called
|
18
|
+
def link(identifier, locator=nil, &block)
|
19
|
+
define_method(identifier) do
|
20
|
+
return @platform.click_link_for locator.clone unless block_given?
|
21
|
+
self.send("#{identifier}_object").click
|
22
|
+
end
|
23
|
+
|
24
|
+
define_method("#{identifier}_object") do
|
25
|
+
return process_block(&block) if block_given?
|
26
|
+
@platform.get_link_for locator.clone
|
27
|
+
end
|
28
|
+
|
29
|
+
alias_method "#{identifier}_link".to_sym, "#{identifier}_object".to_sym
|
30
|
+
end
|
31
|
+
|
32
|
+
# Creates methods to do the following:
|
33
|
+
# Enter text into a text field object
|
34
|
+
# Get the text that is in a text field object
|
35
|
+
# Return a text field object.
|
36
|
+
# @param [String] identifier how a text field will be referred to
|
37
|
+
# @param [Hash] locator how a text field will be recognized
|
38
|
+
# @param [optional] block to be invoked when object method is called
|
39
|
+
def text_field(identifier, locator=nil, &block)
|
40
|
+
define_method(identifier) do
|
41
|
+
return @platform.get_text_field_value_for locator.clone unless block_given?
|
42
|
+
self.send("#{identifier}_object").value
|
43
|
+
end
|
44
|
+
|
45
|
+
define_method("#{identifier}=") do |value|
|
46
|
+
return @platform.set_text_field_value_for(locator.clone, value) unless block_given?
|
47
|
+
self.send("{identifier}_object").value = value
|
48
|
+
end
|
49
|
+
|
50
|
+
define_method("#{identifier}_object") do
|
51
|
+
return process_block(&block) if block_given?
|
52
|
+
@platform.get_text_field_for locator.clone
|
53
|
+
end
|
54
|
+
|
55
|
+
alias_method "#{identifier}_text_field".to_sym, "#{identifier}_object".to_sym
|
56
|
+
end
|
57
|
+
|
58
|
+
# Creates methods to do the following:
|
59
|
+
# Click a button object.
|
60
|
+
# Return a button object.
|
61
|
+
# @param [String] identifier how a button will be referred to
|
62
|
+
# @param [Hash] locator how a button will be recognized
|
63
|
+
# @param []optional] block to be invoked when object method is called
|
64
|
+
def button(identifier, locator=nil, &block)
|
65
|
+
define_method(identifier) do
|
66
|
+
return @platform.click_button_for locator.clone unless block_given?
|
67
|
+
self.send("#{identifer}_object").click
|
68
|
+
end
|
69
|
+
|
70
|
+
define_method("#{identifier}_object") do
|
71
|
+
return process_block(&block) if block_given?
|
72
|
+
@platform.get_button_for locator.clone
|
73
|
+
end
|
74
|
+
|
75
|
+
alias_method "#{identifier}_button".to_sym, "#{identifier}_object".to_sym
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -25,7 +25,94 @@ module SpecTest
|
|
25
25
|
@browser.find_element(:tag_name, 'body').text
|
26
26
|
end
|
27
27
|
|
28
|
+
# Platform method to return a link object.
|
29
|
+
# Link objects are of type: SpecTest::WebObjects::Link
|
30
|
+
# See SpecTest::Generators#link
|
31
|
+
def get_link_for(locator)
|
32
|
+
key, value = get_platform_locator_for(locator, WebObjects::Link, 'a')
|
33
|
+
web_object = @browser.find_element(key, value)
|
34
|
+
WebObjects::Link.new(web_object, :platform => :selenium_webdriver)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Platform method to click a link object.
|
38
|
+
# See SpecTest::Generators#link
|
39
|
+
def click_link_for(locator)
|
40
|
+
key, value = get_platform_locator_for(locator, WebObjects::Link, 'a')
|
41
|
+
@browser.find_element(key, value).click
|
42
|
+
end
|
43
|
+
|
44
|
+
# Platform method to return a text field object.
|
45
|
+
# Text field objects are of type: SpecTest::WebObjects::TextField
|
46
|
+
# See SpecTest::Generators#text_field
|
47
|
+
def get_text_field_for(locator)
|
48
|
+
key, value = get_platform_locator_for(locator, WebObjects::TextField, 'input', :type => 'text')
|
49
|
+
web_object = @browser.find_element(key, value)
|
50
|
+
WebObjects::TextField.new(web_object, :platform => :selenium_webdriver)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Platform method to get the value in a text field object.
|
54
|
+
# See SpecTest::Generators#text_field
|
55
|
+
def get_text_field_value_for(locator)
|
56
|
+
key, value = get_platform_locator_for(locator, WebObjects::TextField, 'input', :type => 'text')
|
57
|
+
value = @browser.find_element(key, value).attribute('value')
|
58
|
+
value
|
59
|
+
end
|
60
|
+
|
61
|
+
# Platform method to set a value in a text field object.
|
62
|
+
# See SpecTest::Generators#text_field
|
63
|
+
def set_text_field_value_for(locator, text)
|
64
|
+
key, value = get_platform_locator_for(locator, WebObjects::TextField, 'input', :type => 'text')
|
65
|
+
@browser.find_element(key, value).clear
|
66
|
+
@browser.find_element(key, value).send_keys(text)
|
67
|
+
end
|
68
|
+
|
69
|
+
# Platform method to return a button object.
|
70
|
+
# Button objects are of type: SpecTest::WebObjects::Button
|
71
|
+
# See SpecTest::Generators#button
|
72
|
+
def get_button_for(locator)
|
73
|
+
key, value = get_platform_locator_for(locator, WebObjects::Button, 'input', :type => 'submit')
|
74
|
+
web_object = @browser.find_element(key, value)
|
75
|
+
WebObjects::Button.new(web_object, :platform => :selenium_webdriver)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Platform method to click a button object.
|
79
|
+
# See SpecTest::Generators#button
|
80
|
+
def click_button_for(locator)
|
81
|
+
key, value = get_platform_locator_for(locator, WebObjects::Button, 'input', :type => 'submit')
|
82
|
+
@browser.find_element(key, value).click
|
83
|
+
end
|
84
|
+
|
85
|
+
protected
|
86
|
+
|
87
|
+
def get_platform_locator_for(locator, web_object, tag=nil, qualifier=nil)
|
88
|
+
locator = qualify_with_tagname_for locator, tag, qualifier if tag
|
89
|
+
key, value = web_object.have_selenium_find_object_with locator
|
90
|
+
return key, value
|
91
|
+
end
|
92
|
+
|
93
|
+
def qualify_with_tagname_for(locator, tag, qualifier=nil)
|
94
|
+
return locator if locator.length < 2 and support_is_provided_for locator, tag, qualifier
|
95
|
+
locator[:tag_name] = tag
|
96
|
+
if qualifier
|
97
|
+
qualifier.each do |key, value|
|
98
|
+
locator[key] = value
|
99
|
+
end
|
100
|
+
end
|
101
|
+
locator
|
102
|
+
end
|
103
|
+
|
104
|
+
def support_is_provided_for(locator, tag, qualifier)
|
105
|
+
return false if locator[:index]
|
106
|
+
return false if locator[:text] and tag == 'input' and qualifier[:type] == 'hidden'
|
107
|
+
return false if locator[:href] and tag == 'a'
|
108
|
+
return false if locator[:text] and ['div', 'span', 'td'].include? tag
|
109
|
+
return false if locator[:value] and tag == 'input' and qualifier[:type] == 'submit'
|
110
|
+
return false if locator[:value] and tag == 'input' and qualifier[:type] == 'radio'
|
111
|
+
true
|
112
|
+
end
|
28
113
|
end
|
29
114
|
end
|
30
115
|
end
|
31
|
-
end
|
116
|
+
end
|
117
|
+
|
118
|
+
Dir["#{File.dirname(__FILE__)}/../web_objects/**/*.rb"].each { |file| require file }
|
@@ -27,7 +27,78 @@ module SpecTest
|
|
27
27
|
@browser.text
|
28
28
|
end
|
29
29
|
|
30
|
+
# Platform method to return a link object.
|
31
|
+
# Link objects are of type: SpecTest::WebObjects::Link
|
32
|
+
# See SpecTest::Generators#link
|
33
|
+
def get_link_for(locator)
|
34
|
+
locator = get_platform_locator_for(locator, WebObjects::Link)
|
35
|
+
web_object = @browser.instance_eval "link(locator)"
|
36
|
+
WebObjects::Link.new(web_object, :platform => :watir_webdriver)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Platform method to click a link object.
|
40
|
+
# See SpecTest::Generators#link
|
41
|
+
def click_link_for(locator)
|
42
|
+
locator = get_platform_locator_for(locator, WebObjects::Link)
|
43
|
+
@browser.instance_eval "link(locator).click if locator"
|
44
|
+
end
|
45
|
+
|
46
|
+
# Platform method to return a text field object.
|
47
|
+
# Text field objects are of type: SpecTest::WebObjects::TextField
|
48
|
+
# See SpecTest::Generators#text_field
|
49
|
+
def get_text_field_for(locator)
|
50
|
+
identifier = get_platform_locator_for(locator, WebObjects::TextField)
|
51
|
+
web_object = @browser.instance_eval "text_field(locator)"
|
52
|
+
WebObjects::TextField.new(web_object, :platform => :watir_webdriver)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Platform method to get the value in a text field object.
|
56
|
+
# See SpecTest::Generators#text_field
|
57
|
+
def get_text_field_value_for(locator)
|
58
|
+
identifier = get_platform_locator_for(locator, WebObjects::TextField)
|
59
|
+
value = @browser.instance_eval "text_field(locator).value"
|
60
|
+
value
|
61
|
+
end
|
62
|
+
|
63
|
+
# Platform method to set a value in a text field object.
|
64
|
+
# See SpecTest::Generators#text_field
|
65
|
+
def set_text_field_value_for(locator, text)
|
66
|
+
identifier = get_platform_locator_for(locator, WebObjects::TextField)
|
67
|
+
@browser.instance_eval "text_field(locator).set(text)"
|
68
|
+
end
|
69
|
+
|
70
|
+
# Platform method to return a button object.
|
71
|
+
# Button objects are of type: SpecTest::WebObjects::Button
|
72
|
+
# See SpecTest::Generators#button
|
73
|
+
def get_button_for(locator)
|
74
|
+
identifier = get_platform_locator_for(locator, WebObjects::Button)
|
75
|
+
web_object = @browser.instance_eval "button(locator)"
|
76
|
+
WebObjects::Button.new(web_object, :platform => :watir_webdriver)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Platform method to click a button object.
|
80
|
+
# See SpecTest::Generators#button
|
81
|
+
def click_button_for(locator)
|
82
|
+
identifier = get_platform_locator_for(locator, WebObjects::Button)
|
83
|
+
@browser.instance_eval "button(locator).click"
|
84
|
+
end
|
85
|
+
|
86
|
+
protected
|
87
|
+
|
88
|
+
def get_platform_locator_for(locator, web_object, tag=nil)
|
89
|
+
locator = qualify_with_tagname_for locator, tag if tag
|
90
|
+
locator = web_object.have_watir_find_object_with locator
|
91
|
+
return locator
|
92
|
+
end
|
93
|
+
|
94
|
+
def qualify_with_tagname_for(locator, tag)
|
95
|
+
return locator if locator.length < 2 and not locator[:name]
|
96
|
+
locator[:tag_name] = tag if locator[:name]
|
97
|
+
locator
|
98
|
+
end
|
30
99
|
end
|
31
100
|
end
|
32
101
|
end
|
33
|
-
end
|
102
|
+
end
|
103
|
+
|
104
|
+
Dir["#{File.dirname(__FILE__)}/../web_objects/**/*.rb"].each { |file| require file }
|
data/lib/spectest/version.rb
CHANGED
@@ -0,0 +1,53 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module WebObjects
|
3
|
+
class WebObject
|
4
|
+
def self.have_watir_find_object_with(locator)
|
5
|
+
locator_list = {}
|
6
|
+
|
7
|
+
locator.each do |key, value|
|
8
|
+
current = {key => value}
|
9
|
+
SpecTest::trace("What I got: #{current}")
|
10
|
+
object_locator = locator_for(current, locators_for_watir, mappings_for_watir)
|
11
|
+
SpecTest::trace("What I gave: #{object_locator}")
|
12
|
+
locator_list[object_locator.keys.first] = object_locator.values.first
|
13
|
+
end
|
14
|
+
|
15
|
+
locator_list
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.have_selenium_find_object_with(locator)
|
19
|
+
if locator.length == 1
|
20
|
+
SpecTest::trace("What I got: #{locator}")
|
21
|
+
object_locator = locator_for(locator, locators_for_selenium, mappings_for_selenium)
|
22
|
+
SpecTest::trace("What I gave: #{object_locator}")
|
23
|
+
return object_locator.keys.first, object_locator.values.first
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def self.locator_for(locator, direct_find, mapping_find)
|
30
|
+
key, value = locator.keys.first, locator.values.first
|
31
|
+
return key => value if direct_find.include? key
|
32
|
+
return mapping_find[key] => value if mapping_find[key]
|
33
|
+
return nil => value
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.locators_for_watir
|
37
|
+
[:class, :id, :index, :name, :xpath]
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.mappings_for_watir
|
41
|
+
{}
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.locators_for_selenium
|
45
|
+
[:class, :id, :index, :name, :xpath]
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.mappings_for_selenium
|
49
|
+
{}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module WebObjects
|
3
|
+
class Link < WebObject
|
4
|
+
|
5
|
+
protected
|
6
|
+
|
7
|
+
def self.locators_for_watir
|
8
|
+
super + [:href, :text]
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.mappings_for_watir
|
12
|
+
super.merge({:link => :text, :link_text => :text})
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.locators_for_selenium
|
16
|
+
super + [:link, :link_text]
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.mappings_for_selenium
|
20
|
+
super.merge(:text => :link_text)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module WebObjects
|
3
|
+
class TextField < WebObject
|
4
|
+
|
5
|
+
protected
|
6
|
+
|
7
|
+
def self.locators_for_watir
|
8
|
+
super + [:tag_name]
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.mappings_for_watir
|
12
|
+
super.merge({:css => :tag_name})
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.locators_for_selenium
|
16
|
+
super + [:css]
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.mappings_for_selenium
|
20
|
+
super.merge({:tag_name => :css})
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
class TestPage
|
4
|
+
include SpecTest
|
5
|
+
|
6
|
+
url_is "http://localhost:1234"
|
7
|
+
|
8
|
+
link :static_text_examples, :text => "Static Text Examples"
|
9
|
+
link :static_text_examples_b do |this| "testing" end
|
10
|
+
text_field :server, :id => "server"
|
11
|
+
text_field :server_b do |this| "testing" end
|
12
|
+
button :submit, :id => "submit"
|
13
|
+
button :submit_b do |content| "testing" end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TestingPage
|
17
|
+
include SpecTest
|
18
|
+
end
|
19
|
+
|
20
|
+
describe SpecTest::Generators do
|
21
|
+
let(:watir_browser) { mock_browser_with_watir }
|
22
|
+
let(:selenium_browser) { mock_browser_with_selenium }
|
23
|
+
let(:watir_page) { TestPage.new(watir_browser) }
|
24
|
+
let(:selenium_page) { TestPage.new(selenium_browser) }
|
25
|
+
|
26
|
+
describe "there are page objects that contain location information" do
|
27
|
+
context "which means" do
|
28
|
+
it "it should navigate to a page when requested" do
|
29
|
+
watir_browser.should_receive(:goto)
|
30
|
+
page = TestPage.new(watir_browser, true)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "it should not navigate to a page when not requested" do
|
34
|
+
watir_browser.should_not_receive(:goto)
|
35
|
+
page = TestPage.new(watir_browser)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "it should not navigate to a page when a url is not specified" do
|
39
|
+
watir_browser.should_not_receive(:goto)
|
40
|
+
page = TestingPage.new(watir_browser, true)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "there are link generators" do
|
46
|
+
context "and when a link is declared on a page" do
|
47
|
+
it "methods for querying and manipulating the link should be generated" do
|
48
|
+
watir_page.should respond_to(:static_text_examples)
|
49
|
+
watir_page.should respond_to(:static_text_examples_object)
|
50
|
+
watir_page.should respond_to(:static_text_examples_link)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "blocks declared with the object will be executed" do
|
54
|
+
watir_page.static_text_examples_b_link.should == "testing"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "and when used on the watir platform implementation" do
|
59
|
+
it "it should be possible to find a link object" do
|
60
|
+
watir_browser.should_receive(:link).and_return(watir_browser)
|
61
|
+
web_object = watir_page.static_text_examples_object
|
62
|
+
web_object.should be_instance_of SpecTest::WebObjects::Link
|
63
|
+
end
|
64
|
+
|
65
|
+
it "it should be possible to select (and thus click) a link" do
|
66
|
+
watir_browser.stub_chain(:link, :click)
|
67
|
+
watir_page.static_text_examples
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "and when used on the selenium platform implementation" do
|
72
|
+
it "it should be possible to find a link object" do
|
73
|
+
selenium_browser.should_receive(:find_element).and_return(selenium_browser)
|
74
|
+
web_object = selenium_page.static_text_examples_object
|
75
|
+
web_object.should be_instance_of SpecTest::WebObjects::Link
|
76
|
+
end
|
77
|
+
|
78
|
+
it "it should be possible to select (and thus click) a link" do
|
79
|
+
selenium_browser.stub_chain(:find_element, :click)
|
80
|
+
selenium_page.static_text_examples
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe "there are text field generators" do
|
86
|
+
context "and when a text field is declared on a page" do
|
87
|
+
it "methods for querying and manipulating the text field should be generated" do
|
88
|
+
watir_page.should respond_to(:server)
|
89
|
+
watir_page.should respond_to(:server=)
|
90
|
+
watir_page.should respond_to(:server_object)
|
91
|
+
watir_page.should respond_to(:server_text_field)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "blocks declared with the object will be executed" do
|
95
|
+
watir_page.server_b_object.should == "testing"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "and when used on the watir platform implementation" do
|
100
|
+
it "it should be possible to find a text field object" do
|
101
|
+
watir_browser.should_receive(:text_field).and_return(watir_browser)
|
102
|
+
web_object = watir_page.server_object
|
103
|
+
web_object.should be_instance_of SpecTest::WebObjects::TextField
|
104
|
+
end
|
105
|
+
|
106
|
+
it "it should be possible to get the text from a text field" do
|
107
|
+
watir_browser.should_receive(:text_field).and_return(watir_browser)
|
108
|
+
watir_browser.should_receive(:value).and_return("Testing")
|
109
|
+
watir_page.server.should == "Testing"
|
110
|
+
end
|
111
|
+
|
112
|
+
it "it should be possible to type text into a text field" do
|
113
|
+
watir_browser.should_receive(:text_field).and_return(watir_browser)
|
114
|
+
watir_browser.should_receive(:set).with("Testing")
|
115
|
+
watir_page.server = "Testing"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "and when used on the selenium platform implementation" do
|
120
|
+
it "it should be possible to find a text field object" do
|
121
|
+
selenium_browser.should_receive(:find_element).and_return(selenium_browser)
|
122
|
+
web_object = selenium_page.server_object
|
123
|
+
web_object.should be_instance_of SpecTest::WebObjects::TextField
|
124
|
+
end
|
125
|
+
|
126
|
+
it "it should be possible to get the text from a text field" do
|
127
|
+
selenium_browser.should_receive(:find_element).and_return(selenium_browser)
|
128
|
+
selenium_browser.should_receive(:attribute).with('value').and_return("Testing")
|
129
|
+
selenium_page.server.should == "Testing"
|
130
|
+
end
|
131
|
+
|
132
|
+
it "it should be possible to type text into a text field" do
|
133
|
+
selenium_browser.should_receive(:find_element).twice.and_return(selenium_browser)
|
134
|
+
selenium_browser.should_receive(:clear)
|
135
|
+
selenium_browser.should_receive(:send_keys).with("Testing")
|
136
|
+
selenium_page.server = "Testing"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "there are button generators" do
|
142
|
+
context "and when a button is declared on a page" do
|
143
|
+
it "methods for querying and manipulating the button should be generated" do
|
144
|
+
watir_page.should respond_to(:submit)
|
145
|
+
watir_page.should respond_to(:submit_object)
|
146
|
+
watir_page.should respond_to(:submit_button)
|
147
|
+
end
|
148
|
+
|
149
|
+
it "blocks declared with the object will be executed" do
|
150
|
+
watir_page.submit_b_object.should == "testing"
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
context "and when used on the watir platform implementation" do
|
155
|
+
it "it should be possible to find a button object" do
|
156
|
+
watir_browser.should_receive(:button).and_return(watir_browser)
|
157
|
+
web_object = watir_page.submit_object
|
158
|
+
web_object.should be_instance_of SpecTest::WebObjects::Button
|
159
|
+
end
|
160
|
+
|
161
|
+
it "it should be possible to click a button object" do
|
162
|
+
watir_browser.should_receive(:button).and_return(watir_browser)
|
163
|
+
watir_browser.should_receive(:click)
|
164
|
+
watir_page.submit
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context "and when used on the selenium platform implementation" do
|
169
|
+
it "it should be possible to find a button object" do
|
170
|
+
selenium_browser.should_receive(:find_element).and_return(selenium_browser)
|
171
|
+
web_object = selenium_page.submit_object
|
172
|
+
web_object.should be_instance_of SpecTest::WebObjects::Button
|
173
|
+
end
|
174
|
+
|
175
|
+
it "it should be possible to click a button object" do
|
176
|
+
selenium_browser.should_receive(:find_element).and_return(selenium_browser)
|
177
|
+
selenium_browser.should_receive(:click)
|
178
|
+
selenium_page.submit
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
data/specs/engine/hooks.rb
CHANGED
@@ -6,7 +6,7 @@ After do |scenario|
|
|
6
6
|
# I don't believe the following line works at all because I don't think Cucumber
|
7
7
|
# (on Windows at least) actually runs the After logic unless a scenario is either
|
8
8
|
# failing or succeeding. I'll keep this line in until I can investigate further.
|
9
|
-
|
9
|
+
#@KEEP_OPEN = true if scenario.status == :pending or scenario.status == :undefined
|
10
10
|
end
|
11
11
|
|
12
12
|
AfterConfiguration do |config|
|
data/specs/pages/landing_page.rb
CHANGED
data/specs/steps/page_steps.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
Given /^I have gone to the test app site$/ do
|
2
|
-
@page = LandingPage.new(@browser)
|
3
|
-
|
2
|
+
@page = LandingPage.new(@browser, true)
|
3
|
+
#@page.navigate_to("http://localhost:1234")
|
4
|
+
end
|
5
|
+
|
6
|
+
Given /^I am on the landing page$/ do
|
7
|
+
step %{I have gone to the test app site}
|
8
|
+
end
|
9
|
+
|
10
|
+
Given /^I am on the form examples page$/ do
|
11
|
+
step %{I have gone to the test app site}
|
12
|
+
@page.form_examples
|
13
|
+
@page = FormExamplesPage.new(@browser)
|
4
14
|
end
|
5
15
|
|
6
16
|
Then /^I should be on the landing page$/ do
|
@@ -8,4 +18,15 @@ Then /^I should be on the landing page$/ do
|
|
8
18
|
#@page.title.should match(/^Test App$/)
|
9
19
|
@page.text.should contain("Landing Page")
|
10
20
|
@page.title.should have_title("Test App")
|
21
|
+
end
|
22
|
+
|
23
|
+
Then /^I should be on the static text examples page$/ do
|
24
|
+
@page = StaticExamplesPage.new(@browser)
|
25
|
+
@page.text.should contain("Static Text Page")
|
26
|
+
@page.title.should have_title("Static Text Testing")
|
27
|
+
end
|
28
|
+
|
29
|
+
Then /^I should be taken to the first success page$/ do
|
30
|
+
@page = Success1Page.new(@browser)
|
31
|
+
@page.text.should contain("first success page")
|
11
32
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: Ability to support buttons.
|
2
|
+
|
3
|
+
As a test writer
|
4
|
+
I need the ability to click a button
|
5
|
+
so that I can generate events
|
6
|
+
and so that I can submit forms.
|
7
|
+
|
8
|
+
Background:
|
9
|
+
Given I am on the form examples page
|
10
|
+
|
11
|
+
Scenario: Clicking a button. (Specific test step.)
|
12
|
+
When I click the log in button
|
13
|
+
Then I should be taken to the first success page
|
@@ -0,0 +1,12 @@
|
|
1
|
+
Feature: Ability to support links.
|
2
|
+
|
3
|
+
As a test writer
|
4
|
+
I need the ability to click on links
|
5
|
+
so that I can use link-based navigation while testing.
|
6
|
+
|
7
|
+
Background:
|
8
|
+
Given I am on the landing page
|
9
|
+
|
10
|
+
Scenario: Selecting a link. (Specific test step.)
|
11
|
+
When I select the static text examples link
|
12
|
+
Then I should be on the static text examples page
|
data/specs/tests/page.feature
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Feature: Ability to support page viewing.
|
2
2
|
|
3
|
-
As a test writer,
|
4
|
-
I need the ability to get to pages
|
5
|
-
so that I can actually do some testing.
|
3
|
+
As a test writer,
|
4
|
+
I need the ability to get to pages
|
5
|
+
so that I can actually do some testing.
|
6
6
|
|
7
|
-
Scenario: Navigating to a page.
|
8
|
-
|
9
|
-
|
7
|
+
Scenario: Navigating to a page.
|
8
|
+
Given I have gone to the test app site
|
9
|
+
Then I should be on the landing page
|
@@ -0,0 +1,21 @@
|
|
1
|
+
Feature: Ability to support text fields.
|
2
|
+
|
3
|
+
As a test writer
|
4
|
+
I need the ability to get the text from a text field
|
5
|
+
so that I can verify default text
|
6
|
+
and so that I can verify text I have entered.
|
7
|
+
|
8
|
+
As a test writer
|
9
|
+
I need the ability to enter text into a text field
|
10
|
+
so that I can manipulate form elements.
|
11
|
+
|
12
|
+
Background:
|
13
|
+
Given I am on the form examples page
|
14
|
+
|
15
|
+
Scenario: Getting the value from a text field
|
16
|
+
When I check the text of the server text field
|
17
|
+
Then I should see the text "Test"
|
18
|
+
|
19
|
+
Scenario: Setting the value of a text field
|
20
|
+
When I enter "QA" in the customer code text field
|
21
|
+
Then I should see the text "QA"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spectest
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-11-
|
12
|
+
date: 2011-11-14 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: watir-webdriver
|
16
|
-
requirement: &
|
16
|
+
requirement: &16039692 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.3.9
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *16039692
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: selenium-webdriver
|
27
|
-
requirement: &
|
27
|
+
requirement: &16038840 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 2.12.1
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *16038840
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &16038348 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 2.7.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *16038348
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: cucumber
|
49
|
-
requirement: &
|
49
|
+
requirement: &16037904 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.1.2
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *16037904
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: simplecov
|
60
|
-
requirement: &
|
60
|
+
requirement: &16037172 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: 0.5.4
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *16037172
|
69
69
|
description: Test framework for specifying tests and executing tests.
|
70
70
|
email:
|
71
71
|
- jeffnyman@gmail.com
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- Rakefile
|
83
83
|
- cucumber.yml
|
84
84
|
- lib/spectest.rb
|
85
|
+
- lib/spectest/generators.rb
|
85
86
|
- lib/spectest/logger.rb
|
86
87
|
- lib/spectest/matchers.rb
|
87
88
|
- lib/spectest/platform_selenium.rb
|
@@ -90,7 +91,12 @@ files:
|
|
90
91
|
- lib/spectest/platform_watir/platform_object.rb
|
91
92
|
- lib/spectest/platforms.rb
|
92
93
|
- lib/spectest/version.rb
|
94
|
+
- lib/spectest/web_objects/all.rb
|
95
|
+
- lib/spectest/web_objects/button.rb
|
96
|
+
- lib/spectest/web_objects/link.rb
|
97
|
+
- lib/spectest/web_objects/text_field.rb
|
93
98
|
- spec/browser_level_spec.rb
|
99
|
+
- spec/generators_spec.rb
|
94
100
|
- spec/page_level_spec.rb
|
95
101
|
- spec/platform_object_spec.rb
|
96
102
|
- spec/platform_selenium_spec.rb
|
@@ -114,9 +120,19 @@ files:
|
|
114
120
|
- specs/app/test_static.html
|
115
121
|
- specs/engine/borg.rb
|
116
122
|
- specs/engine/hooks.rb
|
123
|
+
- specs/pages/form_examples_page.rb
|
117
124
|
- specs/pages/landing_page.rb
|
125
|
+
- specs/pages/static_examples_page.rb
|
126
|
+
- specs/pages/success_1_page.rb
|
127
|
+
- specs/steps/button_steps.rb
|
128
|
+
- specs/steps/link_steps.rb
|
129
|
+
- specs/steps/object_steps.rb
|
118
130
|
- specs/steps/page_steps.rb
|
131
|
+
- specs/steps/text_field_steps.rb
|
132
|
+
- specs/tests/button.feature
|
133
|
+
- specs/tests/link.feature
|
119
134
|
- specs/tests/page.feature
|
135
|
+
- specs/tests/text_field.feature
|
120
136
|
- spectest.gemspec
|
121
137
|
homepage: https://github.com/jnyman/spectest
|
122
138
|
licenses:
|