spectest 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +13 -0
- data/HISTORY.md +11 -0
- data/README.md +1 -1
- data/Rakefile +22 -1
- data/cucumber.yml +4 -0
- data/lib/spectest.rb +45 -0
- data/lib/spectest/logger.rb +5 -0
- data/lib/spectest/matchers.rb +48 -0
- data/lib/spectest/platform_selenium.rb +18 -0
- data/lib/spectest/platform_selenium/platform_object.rb +31 -0
- data/lib/spectest/platform_watir.rb +18 -0
- data/lib/spectest/platform_watir/platform_object.rb +33 -0
- data/lib/spectest/platforms.rb +23 -0
- data/lib/spectest/version.rb +1 -1
- data/spec/browser_level_spec.rb +24 -0
- data/spec/page_level_spec.rb +34 -0
- data/spec/platform_object_spec.rb +45 -0
- data/spec/platform_selenium_spec.rb +28 -0
- data/spec/platform_watir_spec.rb +32 -0
- data/spec/platforms_spec.rb +40 -0
- data/spec/spec_helper.rb +45 -0
- data/spec/spectest_spec.rb +7 -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 +24 -0
- data/specs/engine/hooks.rb +18 -0
- data/specs/pages/landing_page.rb +4 -0
- data/specs/steps/page_steps.rb +11 -0
- data/specs/tests/page.feature +9 -0
- data/spectest.gemspec +1 -0
- metadata +57 -10
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/HISTORY.md
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
Change Log and History
|
2
2
|
======================
|
3
3
|
|
4
|
+
## Version 0.0.2 / 2011-11-13
|
5
|
+
|
6
|
+
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.
|
7
|
+
|
8
|
+
* Browser-Level Actions Supported:
|
9
|
+
* navigate to
|
10
|
+
|
11
|
+
* Page-Level Actions Supported:
|
12
|
+
* title
|
13
|
+
* text
|
14
|
+
|
4
15
|
## Version 0.0.1 / 2011-11-12
|
5
16
|
|
6
17
|
Initial creation of the gem framework.
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -1 +1,22 @@
|
|
1
|
-
require "bundler/gem_tasks"
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rspec/core/rake_task"
|
3
|
+
require 'cucumber/rake/task'
|
4
|
+
|
5
|
+
task :default => :spec
|
6
|
+
|
7
|
+
RSpec::Core::RakeTask.new(:spec)
|
8
|
+
|
9
|
+
namespace :specs do
|
10
|
+
Cucumber::Rake::Task.new(:watir, "Run Cucumber with Watir") do |config|
|
11
|
+
config.profile = 'watir'
|
12
|
+
end
|
13
|
+
|
14
|
+
Cucumber::Rake::Task.new(:selenium, "Run Cucumber with Selenium") do |config|
|
15
|
+
config.profile = 'selenium'
|
16
|
+
end
|
17
|
+
|
18
|
+
desc "Run Cucumber with Selenium and Watir"
|
19
|
+
task :all => [:watir, :selenium]
|
20
|
+
task :watir_driver => [:watir]
|
21
|
+
task :selenium_driver => [:selenium]
|
22
|
+
end
|
data/cucumber.yml
ADDED
data/lib/spectest.rb
CHANGED
@@ -1,5 +1,50 @@
|
|
1
1
|
require "spectest/version"
|
2
|
+
require "spectest/logger"
|
3
|
+
require "spectest/matchers"
|
4
|
+
require "spectest/platforms"
|
2
5
|
|
3
6
|
module SpecTest
|
7
|
+
include Matchers
|
8
|
+
include Platforms
|
4
9
|
|
10
|
+
# @return [TerminusSpec::Platforms::WatirWebDriver::PlatformObject] the platform object
|
11
|
+
# @return [TerminusSpec::Platforms::SeleniumWebDriver::PlatformObject] the platform object
|
12
|
+
attr_reader :platform
|
13
|
+
|
14
|
+
def self.version_info
|
15
|
+
"SpecTest version #{SpecTest::VERSION}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(browser)
|
19
|
+
@browser = browser
|
20
|
+
establish_platform_driver_for browser
|
21
|
+
end
|
22
|
+
|
23
|
+
# Navigate to the specified URL. The URL can be specified as a domain
|
24
|
+
# address or as a file-based link.
|
25
|
+
# @param [String] url the full URL to navigate to
|
26
|
+
def navigate_to(url)
|
27
|
+
# Here is exactly why a platform object is needed. Which version do I call:
|
28
|
+
# @browser.goto(url) <-- this is for Watir
|
29
|
+
# @browser.navigate.to(url) <-- this is for Selenium
|
30
|
+
# I have to call the platform that has been established. The platform will
|
31
|
+
# be responsible for containing the correct call.
|
32
|
+
@platform.navigate_to url
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns the title of the current page as displayed in the browser.
|
36
|
+
def title
|
37
|
+
@platform.title
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns the text of the current page.
|
41
|
+
def text
|
42
|
+
@platform.text
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def establish_platform_driver_for(browser)
|
48
|
+
@platform = platform_for browser, SpecTest::Platforms.list
|
49
|
+
end
|
5
50
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module Matchers
|
3
|
+
|
4
|
+
# Without this matcher, here's what RSpec decides to give you:
|
5
|
+
# expected "Test" to match /^Test App$/
|
6
|
+
# With the matcher, you get this:
|
7
|
+
# Expected that 'Test App' would be the title of the page; found 'Test' instead.
|
8
|
+
RSpec::Matchers.define :have_title do |text|
|
9
|
+
match do |the_page|
|
10
|
+
the_page =~ Regexp.new(text)
|
11
|
+
end
|
12
|
+
|
13
|
+
failure_message_for_should do |actual|
|
14
|
+
"Expected that '#{text}' would be the title of the page; found '#{actual}' instead."
|
15
|
+
end
|
16
|
+
|
17
|
+
failure_message_for_should_not do |actual|
|
18
|
+
"Expected that '#{text}' would not be the title of the page; it was, however."
|
19
|
+
end
|
20
|
+
|
21
|
+
description do
|
22
|
+
"checking for a title of #{text}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Without this matcher, here's what RSpec decides to give you:
|
27
|
+
# expected "Testing with Terminus\nLanding\nStatic Text Examples\nForm Examples\nFrame Examples\nIFrame Examples\nEvent Examples" to match /^Landing Page$/
|
28
|
+
# With the matcher, you get this:
|
29
|
+
# Expected that 'Landing Page' would be in the page content; it was not found.
|
30
|
+
RSpec::Matchers.define :contain do |text|
|
31
|
+
match do |the_page|
|
32
|
+
the_page =~ Regexp.new(text)
|
33
|
+
end
|
34
|
+
|
35
|
+
failure_message_for_should do |actual|
|
36
|
+
"Expected that '#{text}' would be in the page content; it was not found."
|
37
|
+
end
|
38
|
+
|
39
|
+
failure_message_for_should_not do |actual|
|
40
|
+
"Expected that '#{text}' would not be in the page content; it was, however."
|
41
|
+
end
|
42
|
+
|
43
|
+
description do
|
44
|
+
"checking for #{text}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module Platforms
|
3
|
+
module SeleniumWebDriver
|
4
|
+
|
5
|
+
def self.create_platform_object_for(browser)
|
6
|
+
require "spectest/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
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
SpecTest::Platforms.associate(:selenium_webdriver, SpecTest::Platforms::SeleniumWebDriver)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module Platforms
|
3
|
+
module SeleniumWebDriver
|
4
|
+
class PlatformObject
|
5
|
+
|
6
|
+
def initialize(browser)
|
7
|
+
@browser = browser
|
8
|
+
end
|
9
|
+
|
10
|
+
# Platform method to navigate to a specified URL.
|
11
|
+
# See SpecTest#navigate_to
|
12
|
+
def navigate_to(url)
|
13
|
+
@browser.navigate.to url
|
14
|
+
end
|
15
|
+
|
16
|
+
# Platform method to retrieve the title for the current page.
|
17
|
+
# See SpecTest#title
|
18
|
+
def title
|
19
|
+
@browser.title
|
20
|
+
end
|
21
|
+
|
22
|
+
# Platform method to retrieve text from the current page.
|
23
|
+
# See SpecTest#text
|
24
|
+
def text
|
25
|
+
@browser.find_element(:tag_name, 'body').text
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module Platforms
|
3
|
+
module WatirWebDriver
|
4
|
+
|
5
|
+
def self.create_platform_object_for(browser)
|
6
|
+
require "spectest/platform_watir/platform_object"
|
7
|
+
return WatirWebDriver::PlatformObject.new(browser)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.works_for?(browser)
|
11
|
+
browser.is_a?(Watir::Browser)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
SpecTest::Platforms.associate(:watir_webdriver, SpecTest::Platforms::WatirWebDriver)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module Platforms
|
3
|
+
module WatirWebDriver
|
4
|
+
class PlatformObject
|
5
|
+
|
6
|
+
attr_reader :browser
|
7
|
+
|
8
|
+
def initialize(browser)
|
9
|
+
@browser = browser
|
10
|
+
end
|
11
|
+
|
12
|
+
# Platform method to navigate to a specified URL.
|
13
|
+
# See SpecTest#navigate_to
|
14
|
+
def navigate_to(url)
|
15
|
+
@browser.goto url
|
16
|
+
end
|
17
|
+
|
18
|
+
# Platform method to retrieve the title for the current page.
|
19
|
+
# See SpecTest#title
|
20
|
+
def title
|
21
|
+
@browser.title
|
22
|
+
end
|
23
|
+
|
24
|
+
# Platform method to retrieve text from the current page.
|
25
|
+
# See SpecTest#text
|
26
|
+
def text
|
27
|
+
@browser.text
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module SpecTest
|
2
|
+
module Platforms
|
3
|
+
@@drivers = {}
|
4
|
+
|
5
|
+
def self.list
|
6
|
+
@@drivers
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.associate(key, driver)
|
10
|
+
@@drivers[key] = driver
|
11
|
+
end
|
12
|
+
|
13
|
+
def platform_for(browser, drivers)
|
14
|
+
drivers.each_value { |driver|
|
15
|
+
return driver.create_platform_object_for browser if driver.works_for? browser
|
16
|
+
}
|
17
|
+
raise "Unable to associate a platform using the provided browser."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
require "spectest/platform_watir"
|
23
|
+
require "spectest/platform_selenium"
|
data/lib/spectest/version.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe SpecTest do
|
4
|
+
let(:watir_browser) { mock_browser_with_watir }
|
5
|
+
let(:selenium_browser) { mock_browser_with_selenium }
|
6
|
+
let(:watir_page) { PageTester.new(watir_browser) }
|
7
|
+
let(:selenium_page) { PageTester.new(selenium_browser) }
|
8
|
+
|
9
|
+
describe "in terms of browser-level functionality" do
|
10
|
+
context "when using the watir platform" do
|
11
|
+
it "a page can be navigated to" do
|
12
|
+
watir_browser.should_receive(:goto).with("testerstories.com")
|
13
|
+
watir_page.navigate_to("testerstories.com")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when using the selenium platform" do
|
18
|
+
it "a page can be navigated to" do
|
19
|
+
selenium_browser.stub_chain(:navigate, :to).with("testerstories.com")
|
20
|
+
selenium_page.navigate_to("testerstories.com")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe SpecTest do
|
4
|
+
let(:watir_browser) { mock_browser_with_watir }
|
5
|
+
let(:selenium_browser) { mock_browser_with_selenium }
|
6
|
+
let(:watir_page) { PageTester.new(watir_browser) }
|
7
|
+
let(:selenium_page) { PageTester.new(selenium_browser) }
|
8
|
+
|
9
|
+
describe "in terms of page-level functionality" do
|
10
|
+
context "when using the watir platform" do
|
11
|
+
it "the title of the page will be accessible" do
|
12
|
+
watir_browser.should_receive(:title).and_return("Page Title")
|
13
|
+
watir_page.title.should == "Page Title"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "the text of the page will be accessible" do
|
17
|
+
watir_browser.should_receive(:text).and_return("page text")
|
18
|
+
watir_page.text.should == "page text"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when using the selenium platform" do
|
23
|
+
it "the title of the page will be accessible" do
|
24
|
+
selenium_browser.should_receive(:title).and_return("Page Title")
|
25
|
+
selenium_page.title.should == "Page Title"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "the text of the page will be accessible" do
|
29
|
+
selenium_browser.stub_chain(:find_element, :text).and_return("page text")
|
30
|
+
selenium_page.text.should == "page text"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
class PlatformObject
|
4
|
+
end
|
5
|
+
|
6
|
+
describe SpecTest do
|
7
|
+
let(:watir_browser) { mock_browser_with_watir }
|
8
|
+
let(:selenium_browser) { mock_browser_with_selenium }
|
9
|
+
let(:watir_page) { PageTester.new(watir_browser) }
|
10
|
+
let(:selenium_page) { PageTester.new(selenium_browser) }
|
11
|
+
|
12
|
+
context "can be included with a page that will be using watir-webdriver" do
|
13
|
+
it "which means the page should use a watir platform object" do
|
14
|
+
watir_page.platform.should be_kind_of SpecTest::Platforms::WatirWebDriver::PlatformObject
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "can be included with a page that will be using selenium-webdriver" do
|
19
|
+
it "which means the page should use a selenium platform object" do
|
20
|
+
selenium_page.platform.should be_kind_of SpecTest::Platforms::SeleniumWebDriver::PlatformObject
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "might be included with a page using an unrecognized driver" do
|
25
|
+
it "and in that case it should raise an exception" do
|
26
|
+
expect { PageTester.new("fake_browser") }.to raise_error
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "might be included with a page using an unassociated custom driver" do
|
31
|
+
let(:custom_driver) { mock_driver(:watir_browser, PlatformObject) }
|
32
|
+
it "and in that case it should raise an exception" do
|
33
|
+
expect { custom_page = PageTester.new(:watir_browser) }.to raise_error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "might be included with a page using an associated custom driver" do
|
38
|
+
let(:custom_driver) { mock_driver(:custom_browser, PlatformObject) }
|
39
|
+
it "which means the page should use a custom platform object" do
|
40
|
+
mock_drivers_list({:custom_driver => custom_driver})
|
41
|
+
custom_page = PageTester.new(:custom_browser)
|
42
|
+
custom_page.platform.should be custom_driver.create_platform_object_for
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe SpecTest::Platforms::SeleniumWebDriver do
|
4
|
+
it "should be in the platform objects driver list" do
|
5
|
+
SpecTest::Platforms.list[:selenium_webdriver].should be SpecTest::Platforms::SeleniumWebDriver
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "and when used to create a platform object" do
|
9
|
+
let(:browser) { double('browser') }
|
10
|
+
let(:platform) { SpecTest::Platforms::SeleniumWebDriver.create_platform_object_for(browser) }
|
11
|
+
|
12
|
+
it "a SeleniumPlatformObject should be created" do
|
13
|
+
platform.should be_kind_of SpecTest::Platforms::SeleniumWebDriver::PlatformObject
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "and when checking if the platform can be associated with a browser" do
|
18
|
+
it "if the browser is of type Selenium::WebDriver, the platform will be associated " do
|
19
|
+
browser = mock_browser_with_selenium()
|
20
|
+
SpecTest::Platforms::SeleniumWebDriver.works_for?(browser).should be true
|
21
|
+
end
|
22
|
+
|
23
|
+
it "if the browser is not of type Selenium::WebDriver, the platform will not be associated" do
|
24
|
+
browser = "false_browser"
|
25
|
+
SpecTest::Platforms::SeleniumWebDriver.works_for?(browser).should be false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe SpecTest::Platforms::WatirWebDriver do
|
4
|
+
it "should be in the platform objects driver list" do
|
5
|
+
SpecTest::Platforms.list[:watir_webdriver].should be SpecTest::Platforms::WatirWebDriver
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "and when used to create a platform object" do
|
9
|
+
let(:browser) { double('browser') }
|
10
|
+
let(:platform) { SpecTest::Platforms::WatirWebDriver.create_platform_object_for(browser) }
|
11
|
+
|
12
|
+
it "a WatirPlatformObject should be created" do
|
13
|
+
platform.should be_kind_of SpecTest::Platforms::WatirWebDriver::PlatformObject
|
14
|
+
end
|
15
|
+
|
16
|
+
it "the browser should be associated with the platform object" do
|
17
|
+
platform.browser.should be browser
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "and when checking if the platform can be associated with a browser" do
|
22
|
+
it "if the browser is of type Watir::Browser, the platform will be associated " do
|
23
|
+
browser = mock_browser_with_watir()
|
24
|
+
SpecTest::Platforms::WatirWebDriver.works_for?(browser).should be true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "if the browser is not of type Watir::Browser, the platform will not be associated" do
|
28
|
+
browser = "false_browser"
|
29
|
+
SpecTest::Platforms::WatirWebDriver.works_for?(browser).should be false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
class LoadingPlatforms
|
4
|
+
include SpecTest::Platforms
|
5
|
+
end
|
6
|
+
|
7
|
+
describe LoadingPlatforms do
|
8
|
+
let(:platform) { LoadingPlatforms.new() }
|
9
|
+
let(:drivers) { {} }
|
10
|
+
|
11
|
+
context "if a chrome browser is associated with a chrome platform" do
|
12
|
+
let(:chrome_browser) { double('browser') }
|
13
|
+
before { drivers[:chrome_browser] = mock_driver(chrome_browser, :chrome_platform) }
|
14
|
+
it "then the chrome platform will be established for the chrome browser" do
|
15
|
+
platform.platform_for(chrome_browser, drivers).should == :chrome_platform
|
16
|
+
end
|
17
|
+
|
18
|
+
context "if a firefox browser is associated with a firefox platform" do
|
19
|
+
let(:firefox_browser) { double('browser') }
|
20
|
+
before { drivers[:firefox_browser] = mock_driver(firefox_browser, :firefox_platform) }
|
21
|
+
it "then the chrome platform will still be established for the chrome platform" do
|
22
|
+
platform.platform_for(chrome_browser, drivers).should == :chrome_platform
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context "if a firefox browser is associated with a firefox platform" do
|
28
|
+
let(:firefox_browser) { double('browser') }
|
29
|
+
before { drivers[:firefox_browser] = mock_driver(firefox_browser, :firefox_platform) }
|
30
|
+
it "then the firefox platform will be established for the firefox browser" do
|
31
|
+
platform.platform_for(firefox_browser, drivers).should == :firefox_platform
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "if an unknown browser object is associated with a platform" do
|
36
|
+
it "then it should raise an exception" do
|
37
|
+
expect { platform.platform_for("false_browser") }.to raise_error
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start { add_filter "/spec/" } if ENV['COVERAGE']
|
3
|
+
|
4
|
+
require 'rspec'
|
5
|
+
require 'spectest'
|
6
|
+
|
7
|
+
require 'watir-webdriver'
|
8
|
+
require 'selenium-webdriver'
|
9
|
+
|
10
|
+
class PageTester
|
11
|
+
include SpecTest
|
12
|
+
end
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.color_enabled = true
|
16
|
+
config.formatter = 'documentation'
|
17
|
+
end
|
18
|
+
|
19
|
+
def mock_browser_with_watir
|
20
|
+
watir_browser = double('watir')
|
21
|
+
watir_browser.stub(:is_a?).with(anything()).and_return(false)
|
22
|
+
watir_browser.stub(:is_a?).with(Selenium::WebDriver::Driver).and_return(false)
|
23
|
+
watir_browser.stub(:is_a?).with(Watir::Browser).and_return(true)
|
24
|
+
watir_browser
|
25
|
+
end
|
26
|
+
|
27
|
+
def mock_browser_with_selenium
|
28
|
+
selenium_browser = double('selenium')
|
29
|
+
selenium_browser.stub(:is_a?).with(anything()).and_return(false)
|
30
|
+
selenium_browser.stub(:is_a?).with(Watir::Browser).and_return(false)
|
31
|
+
selenium_browser.stub(:is_a?).with(Selenium::WebDriver::Driver).and_return(true)
|
32
|
+
selenium_browser
|
33
|
+
end
|
34
|
+
|
35
|
+
def mock_driver(browser, platform_object)
|
36
|
+
driver = double('driver')
|
37
|
+
driver.stub(:works_for?).with(anything()).and_return(false)
|
38
|
+
driver.stub(:works_for?).with(browser).and_return(true)
|
39
|
+
driver.stub(:create_platform_object_for).and_return platform_object
|
40
|
+
driver
|
41
|
+
end
|
42
|
+
|
43
|
+
def mock_drivers_list(drivers)
|
44
|
+
SpecTest::Platforms.stub(:list).and_return drivers
|
45
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Test App</title>
|
6
|
+
<link rel="stylesheet" href="style.css" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
|
10
|
+
<h1 class="title">Testing with Terminus</h1>
|
11
|
+
<h2 class="subtitle">Landing Page</h2>
|
12
|
+
|
13
|
+
<p><a href="test_static.html">Static Text Examples</a></p>
|
14
|
+
<p><a href="test_form.html">Form Examples</a></p>
|
15
|
+
<p><a href="test_frame.html">Frame Examples</a></p>
|
16
|
+
<p><a href="test_iframe.html">IFrame Examples</a></p>
|
17
|
+
<p><a href="test_event.html">Event Examples</a></p>
|
18
|
+
|
19
|
+
</body>
|
20
|
+
</html>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Test App - Modal Testing</title>
|
6
|
+
|
7
|
+
<script>
|
8
|
+
function delay_action(other_function) {
|
9
|
+
setTimeout(other_function, 3000);
|
10
|
+
}
|
11
|
+
|
12
|
+
function close_window() {
|
13
|
+
window.returnValue = 22
|
14
|
+
window.close()
|
15
|
+
}
|
16
|
+
|
17
|
+
function modal1() {
|
18
|
+
var retValue = window.showModalDialog(
|
19
|
+
"modal_2.html", self,
|
20
|
+
"status:no;resizable:Yes;help:no;maximize:no;minimize:no;scrollbars:no;");
|
21
|
+
}
|
22
|
+
</script>
|
23
|
+
</head>
|
24
|
+
<body>
|
25
|
+
|
26
|
+
<h1 class="title">Testing with Terminus</h1>
|
27
|
+
<h2 class="subtitle">Modal Page 1</h2>
|
28
|
+
|
29
|
+
<h3>Close buttons</h3>
|
30
|
+
|
31
|
+
<input id="close_window" type="button" onclick="close_window()" value="Close Window"/>
|
32
|
+
<input id="delayed_close" type="button" onclick="delay_action('close_window()')" value="Close Window (with delay)" />
|
33
|
+
|
34
|
+
<h3>Nested modal</h3>
|
35
|
+
|
36
|
+
<input id="launch_modal" type="button" onclick='return modal1();' value="Launch Another Modal"/>
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
</body>
|
41
|
+
</html>
|
@@ -0,0 +1,29 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Test App - Modal Testing</title>
|
6
|
+
|
7
|
+
<script>
|
8
|
+
function delay_action(other_function) {
|
9
|
+
setTimeout(other_function, 3000);
|
10
|
+
}
|
11
|
+
|
12
|
+
function close_window() {
|
13
|
+
self.close()
|
14
|
+
}
|
15
|
+
</script>
|
16
|
+
</head>
|
17
|
+
<body>
|
18
|
+
|
19
|
+
<h1 class="title">Testing with Terminus</h1>
|
20
|
+
<h2 class="subtitle">Modal Page 2</h2>
|
21
|
+
|
22
|
+
<h3>Close buttons</h3>
|
23
|
+
|
24
|
+
<input id="close_window2" type="button" onclick="close_window()" value="Close Window"/>
|
25
|
+
<input id="delayed_close2" type="button" onclick="delay_action('close_window()')" value="Close Window (with delay)" />
|
26
|
+
|
27
|
+
|
28
|
+
</body>
|
29
|
+
</html>
|
data/specs/app/server.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'webrick'
|
2
|
+
|
3
|
+
class NonCachingFileHandler < WEBrick::HTTPServlet::FileHandler
|
4
|
+
def prevent_caching(res)
|
5
|
+
res['ETag'] = nil
|
6
|
+
res['Last-Modified'] = Time.now + 100**4
|
7
|
+
res['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'
|
8
|
+
res['Pragma'] = 'no-cache'
|
9
|
+
res['Expires'] = Time.now - 100**4
|
10
|
+
end
|
11
|
+
|
12
|
+
def do_GET(req, res)
|
13
|
+
super
|
14
|
+
prevent_caching(res)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
if $0 == __FILE__ then
|
19
|
+
server = WEBrick::HTTPServer.new(:Port => 1234, :AccessLog => [])
|
20
|
+
server.mount '/', NonCachingFileHandler , './'
|
21
|
+
['INT', 'TERM'].each { |signal|
|
22
|
+
trap(signal) { server.stop }
|
23
|
+
}
|
24
|
+
server.start
|
25
|
+
end
|
data/specs/app/style.css
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
h1.title {
|
2
|
+
font-weight: normal;
|
3
|
+
font-size: 150%;
|
4
|
+
margin-left: 1px;
|
5
|
+
text-align: center;
|
6
|
+
border-bottom: thin solid;
|
7
|
+
font-family: 'Trebuchet MS', 'Lucida Grande', Verdana, Lucida, Geneva, Helvetica, Arial, sans-serif;
|
8
|
+
}
|
9
|
+
|
10
|
+
h2.subtitle {
|
11
|
+
border: #660000 0px solid;
|
12
|
+
padding: 0.2em 0.2em 0.2em 0px;
|
13
|
+
margin: 2em 1px 1px;
|
14
|
+
text-align: center;
|
15
|
+
font-weight: bold;
|
16
|
+
font-size: 120%;
|
17
|
+
color: #600;
|
18
|
+
}
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Test App - Event Testing</title>
|
6
|
+
<link rel="stylesheet" href="style.css" />
|
7
|
+
|
8
|
+
<script type="text/javascript">
|
9
|
+
function modal() {
|
10
|
+
var retValue = window.showModalDialog(
|
11
|
+
"modal_1.html", self,
|
12
|
+
"status:no;resizable:Yes;help:no;maximize:no;minimize:no;scrollbars:no;");
|
13
|
+
}
|
14
|
+
</script>
|
15
|
+
</head>
|
16
|
+
|
17
|
+
<body onload="document.senderForm.senderElement.focus()">
|
18
|
+
|
19
|
+
<h1 class="title">Testing with Terminus</h1>
|
20
|
+
<h2 class="subtitle">Event Page</h2>
|
21
|
+
|
22
|
+
<input id="alert_button" type="button" onclick="alert('I am an alert')" value="Alert">
|
23
|
+
<input id="confirm_button" type="button" onclick="this.value = confirm('set the value')" value="Confirm">
|
24
|
+
<input id="prompt_button" type="button" onclick='this.value = prompt("Favorite Sith Lord", "Darth Bane")' value="Prompt">
|
25
|
+
|
26
|
+
|
27
|
+
<p><strong>Send To Another Page:</strong></p>
|
28
|
+
<form action="" method="post" name="senderForm">
|
29
|
+
<fieldset>
|
30
|
+
<input type="text" name="senderElement" id="senderElement" value="send_this_value" />
|
31
|
+
<input type="button" id="send" onclick="parent.frame2.document.recieverForm.recieverElement.value = document.senderForm.senderElement.value" value="Send!" />
|
32
|
+
</fieldset>
|
33
|
+
</form>
|
34
|
+
|
35
|
+
<p><strong>Launch a Modal Dialog:</strong></p>
|
36
|
+
<input id="modal" type="button" onclick='return modal();' value="Launch Modal Dialog" />
|
37
|
+
|
38
|
+
</body>
|
39
|
+
</html>
|
@@ -0,0 +1,114 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Test App - Form Testing</title>
|
6
|
+
<link rel="stylesheet" href="style.css" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
|
10
|
+
<h1 class="title">Testing with Terminus</h1>
|
11
|
+
<h2 class="subtitle">Form Page</h2>
|
12
|
+
|
13
|
+
<h3>Connected Form Elements</h3>
|
14
|
+
|
15
|
+
<form id="Login" name="Login" method="get" action="success_1.html">
|
16
|
+
<table cellspacing="0" cellpadding="0" border="0" bgcolor="#ffffff" align="center" style="overflow:hidden;">
|
17
|
+
<tbody>
|
18
|
+
<tr>
|
19
|
+
<td style="padding-top:12px;">
|
20
|
+
<label id="lbl_server" class="Fld" no_help="true" for="server">Server:</label>
|
21
|
+
</td>
|
22
|
+
</tr>
|
23
|
+
<tr>
|
24
|
+
<td style="padding-top:8px;">
|
25
|
+
<input id="server" name="server" helpid="server" class="Fld" size="40" type="text" value="Test"/>
|
26
|
+
</td>
|
27
|
+
</tr>
|
28
|
+
<tr>
|
29
|
+
<td style="padding-top:12px;">
|
30
|
+
<label id="lbl_customerCode" class="Fld" no_help="true" for="customerCode">Customer ID:</label>
|
31
|
+
</td>
|
32
|
+
</tr>
|
33
|
+
<tr>
|
34
|
+
<td style="padding-top:8px;">
|
35
|
+
<input id="customerCode" name="customerCode" helpid="customerCode" class="Fld" size="40" type="text"/>
|
36
|
+
</td>
|
37
|
+
</tr>
|
38
|
+
<tr>
|
39
|
+
<td style="padding-top:8px;">
|
40
|
+
<label id="lbl_loginName" class="Fld" no_help="true" for="loginName">Login Name:</label>
|
41
|
+
</td>
|
42
|
+
</tr>
|
43
|
+
<tr>
|
44
|
+
<td style="padding-top:8px;">
|
45
|
+
<input id="loginName" name="loginName" helpid="loginName" class="Fld" size="40" type="text"/>
|
46
|
+
</td>
|
47
|
+
</tr>
|
48
|
+
<tr>
|
49
|
+
<td style="padding-top:8px;">
|
50
|
+
<label id="lbl_password" class="Fld" no_help="true" for="password">Password:</label>
|
51
|
+
</td>
|
52
|
+
</tr>
|
53
|
+
<tr>
|
54
|
+
<td style="padding-top:8px;">
|
55
|
+
<input id="password" name="password" helpid="password" class="Fld" size="40" type="text"/>
|
56
|
+
</td>
|
57
|
+
</tr>
|
58
|
+
<tr>
|
59
|
+
<td>
|
60
|
+
<input id="btnSubmit" name="btnSubmit" class="btn" type="submit" value="Log In">
|
61
|
+
</td>
|
62
|
+
</tr>
|
63
|
+
</tbody>
|
64
|
+
</table>
|
65
|
+
</form>
|
66
|
+
|
67
|
+
<hr />
|
68
|
+
|
69
|
+
<h3>Standalone Form Elements</h3>
|
70
|
+
|
71
|
+
<div>
|
72
|
+
<label id="lbl_title" no_help="true"><strong>Book Title:</strong></label><br />
|
73
|
+
<input id="title" size="40" type="text"/><br />
|
74
|
+
<label id="lbl_description" no_help="true"><strong>Description:</strong></label><br />
|
75
|
+
<textarea rows="2" cols="80" id="description" class="text_area_class" name="description"></textarea>
|
76
|
+
<input id="isbn" name="isbn" class="hidden_field_class" size="40" type="hidden" value="0-85131-041-9"/>
|
77
|
+
</div>
|
78
|
+
|
79
|
+
<div>
|
80
|
+
<p><strong>Choose Your Physics Concepts:</strong></p>
|
81
|
+
<select name="concepts" id="concepts", class="sel_list_class">
|
82
|
+
<option value="option1">Quantum Entanglement</option>
|
83
|
+
<option value="option2">Tachyonic Antitravel</option>
|
84
|
+
<option value="option3">Bose-Einstein Condensates</option>
|
85
|
+
</select>
|
86
|
+
</div>
|
87
|
+
|
88
|
+
<div>
|
89
|
+
<p><strong>Choose Your Futuristic Technology:</strong></p>
|
90
|
+
<input id="camoarmor" name="camoarmor" class="cb_class" type="checkbox" value="1"/> Chameleoflage Armor<br />
|
91
|
+
<input id="shunt" name="shunt" class="cb_class" type="checkbox" value="2"/> Neural Shunts<br />
|
92
|
+
<input id="harpoon" name="harpoon" class="cb_class" type="checkbox" value="3"/> Kinetic Harpoons<br />
|
93
|
+
<input id="oc" name="oc" class="cb_class" type="checkbox" value="4"/> Organic Circuitry
|
94
|
+
</div>
|
95
|
+
|
96
|
+
<div>
|
97
|
+
<p><strong>Select Your Least Favorite Way To Vaporize:</strong></p>
|
98
|
+
<form>
|
99
|
+
<input type="radio" id="mtc" name="badstuff" class="rb_class" value="Multiphasic Temporal Convergence"> Multiphasic Temporal Convergence<br/>
|
100
|
+
<input type="radio" id="ups" name="badstuff" class="rb_class" value="Unstable Phase Shift"> Unstable Phase Shift<br />
|
101
|
+
<input type="radio" id="wcb" name="badstuff" class="rb_class" value="Warp Core Breach"> Warp Core Breach<br />
|
102
|
+
</form>
|
103
|
+
</div>
|
104
|
+
|
105
|
+
|
106
|
+
<p><strong>Received Event Goes Here:</strong></p>
|
107
|
+
<form action="" method="post" name="recieverForm">
|
108
|
+
<fieldset>
|
109
|
+
<input type="text" name="recieverElement" value="old_value" />
|
110
|
+
</fieldset>
|
111
|
+
</form>
|
112
|
+
|
113
|
+
</body>
|
114
|
+
</html>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Test App - Frame Testing</title>
|
6
|
+
<link rel="stylesheet" href="style.css" />
|
7
|
+
</head>
|
8
|
+
|
9
|
+
<frameset cols="40%, 40%, 22%">
|
10
|
+
<frame name="static" id="static" name="frame1" src="test_static.html" />
|
11
|
+
<frame name="form" id="form" name="frame2" src="test_form.html" />
|
12
|
+
<frame name="event" id="event" name="frame3" src="test_event.html" />
|
13
|
+
</frameset>
|
14
|
+
|
15
|
+
</html>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Test App - Frame Testing</title>
|
6
|
+
<link rel="stylesheet" href="style.css" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
|
10
|
+
<iframe name="static" id="static" name="frame1" class="iframe" width="500" src="test_static.html"></iframe>
|
11
|
+
<br />
|
12
|
+
<iframe name="form" id="form" name="frame2" class="iframe" width="500" src="test_form.html"></iframe>
|
13
|
+
|
14
|
+
</body>
|
15
|
+
</html>
|
@@ -0,0 +1,92 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="en">
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Test App - Static Text Testing</title>
|
6
|
+
<link rel="stylesheet" href="style.css" />
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
|
10
|
+
<h1 class="title">Testing with Terminus</h1>
|
11
|
+
<h2 class="subtitle">Static Text Page</h2>
|
12
|
+
|
13
|
+
|
14
|
+
<h3>Links</h3>
|
15
|
+
|
16
|
+
<p><a id="avengers_unite_id" name="avengers_unite_name" class="avengers_unite_class" href="success_1.html">Avengers Unite</a></p>
|
17
|
+
|
18
|
+
<p><a href="success_1.html">Justice League Assemble</a></p>
|
19
|
+
<p><a href="success_2.html">Justice League Assemble</a></p>
|
20
|
+
|
21
|
+
<p><a id="oath" href="success_1.html">"...in the brightest day and in the darkest night..."</a></p>
|
22
|
+
|
23
|
+
<hr />
|
24
|
+
|
25
|
+
<h3>Lists</h3>
|
26
|
+
|
27
|
+
<h4>Unordered List</h4>
|
28
|
+
|
29
|
+
<ul id="ul_id" name="ul_name" class="ul_class">
|
30
|
+
<li id="li_id" name="li_name" class="li_class">Darth Nihilus</li>
|
31
|
+
<li>Darth Plagueis</li>
|
32
|
+
<li>Darth Sidious</li>
|
33
|
+
</ul>
|
34
|
+
|
35
|
+
<h4>Ordered List</h4>
|
36
|
+
|
37
|
+
<ol id="ol_id" name="ol_name" class="ol_class">
|
38
|
+
<li>USS Enterprise XCV 330</li>
|
39
|
+
<li>USS Enterprise NX-01</li>
|
40
|
+
<li>USS Enterprise NCC-1701</li>
|
41
|
+
</ol>
|
42
|
+
|
43
|
+
<hr />
|
44
|
+
|
45
|
+
<h3>Sections</h3>
|
46
|
+
|
47
|
+
<div id="div_id" name="div_name" class="div_class">
|
48
|
+
This text is stored directly inside a DIV element.
|
49
|
+
</div>
|
50
|
+
|
51
|
+
<span id="span_id" name="span_name" class="span_class">
|
52
|
+
This text is stored directly inside a SPAN element.
|
53
|
+
</span>
|
54
|
+
|
55
|
+
<hr />
|
56
|
+
|
57
|
+
<h3>Tables</h3>
|
58
|
+
|
59
|
+
<table id='table_id' name='table_name' class='table_class' border='1'>
|
60
|
+
<thead>
|
61
|
+
<tr>
|
62
|
+
<th>Month</th>
|
63
|
+
<th>Savings</th>
|
64
|
+
</tr>
|
65
|
+
</thead>
|
66
|
+
<tfoot>
|
67
|
+
<tr>
|
68
|
+
<td>Sum</td>
|
69
|
+
<td>$180</td>
|
70
|
+
</tr>
|
71
|
+
</tfoot>
|
72
|
+
<tbody>
|
73
|
+
<tr>
|
74
|
+
<td>January</td>
|
75
|
+
<td id='cell_id' name='cell_name' class='cell_class'>$100</td>
|
76
|
+
</tr>
|
77
|
+
<tr>
|
78
|
+
<td>February</td>
|
79
|
+
<td>$80</td>
|
80
|
+
</tr>
|
81
|
+
</tbody>
|
82
|
+
</table>
|
83
|
+
|
84
|
+
<hr />
|
85
|
+
|
86
|
+
<p>Technically an image isn't static text, but whatever ...</p>
|
87
|
+
|
88
|
+
<img src="images/mass_extinction.jpg" id="extinct" name="extinct" class="image_class">
|
89
|
+
|
90
|
+
|
91
|
+
</body>
|
92
|
+
</html>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '../../', 'lib'))
|
2
|
+
|
3
|
+
require 'watir-webdriver'
|
4
|
+
require 'selenium-webdriver'
|
5
|
+
|
6
|
+
require "spectest"
|
7
|
+
|
8
|
+
module SpecTest
|
9
|
+
module Browser
|
10
|
+
@browser = false
|
11
|
+
|
12
|
+
def self.start
|
13
|
+
unless @browser
|
14
|
+
@browser = Watir::Browser.new(ENV['BROWSER']) if ENV['DRIVER'] == 'watir'
|
15
|
+
@browser = Selenium::WebDriver.for(ENV['BROWSER'].to_sym) if ENV['DRIVER'] == 'selenium'
|
16
|
+
end
|
17
|
+
return @browser
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.stop
|
21
|
+
@browser.quit if @browser
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Before do
|
2
|
+
@browser = SpecTest::Browser.start
|
3
|
+
end
|
4
|
+
|
5
|
+
After do |scenario|
|
6
|
+
# I don't believe the following line works at all because I don't think Cucumber
|
7
|
+
# (on Windows at least) actually runs the After logic unless a scenario is either
|
8
|
+
# failing or succeeding. I'll keep this line in until I can investigate further.
|
9
|
+
@KEEP_OPEN = true if scenario.status == :pending or scenario.status == :undefined
|
10
|
+
end
|
11
|
+
|
12
|
+
AfterConfiguration do |config|
|
13
|
+
puts("Tests are being executed from: #{config.feature_dirs}")
|
14
|
+
end
|
15
|
+
|
16
|
+
at_exit do
|
17
|
+
SpecTest::Browser.stop if not @KEEP_OPEN
|
18
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Given /^I have gone to the test app site$/ do
|
2
|
+
@page = LandingPage.new(@browser)
|
3
|
+
@page.navigate_to("http://localhost:1234")
|
4
|
+
end
|
5
|
+
|
6
|
+
Then /^I should be on the landing page$/ do
|
7
|
+
#@page.text.should match(/^Landing Page$/)
|
8
|
+
#@page.title.should match(/^Test App$/)
|
9
|
+
@page.text.should contain("Landing Page")
|
10
|
+
@page.title.should have_title("Test App")
|
11
|
+
end
|
data/spectest.gemspec
CHANGED
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.2
|
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-13 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: watir-webdriver
|
16
|
-
requirement: &
|
16
|
+
requirement: &4716876 !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: *4716876
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: selenium-webdriver
|
27
|
-
requirement: &
|
27
|
+
requirement: &4715880 !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: *4715880
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rspec
|
38
|
-
requirement: &
|
38
|
+
requirement: &4715268 !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: *4715268
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: cucumber
|
49
|
-
requirement: &
|
49
|
+
requirement: &4714728 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,7 +54,18 @@ dependencies:
|
|
54
54
|
version: 1.1.2
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *4714728
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: simplecov
|
60
|
+
requirement: &4714200 !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
62
|
+
requirements:
|
63
|
+
- - ! '>='
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
version: 0.5.4
|
66
|
+
type: :development
|
67
|
+
prerelease: false
|
68
|
+
version_requirements: *4714200
|
58
69
|
description: Test framework for specifying tests and executing tests.
|
59
70
|
email:
|
60
71
|
- jeffnyman@gmail.com
|
@@ -63,13 +74,49 @@ extensions: []
|
|
63
74
|
extra_rdoc_files: []
|
64
75
|
files:
|
65
76
|
- .gitignore
|
77
|
+
- .travis.yml
|
66
78
|
- Gemfile
|
67
79
|
- HISTORY.md
|
68
80
|
- LICENSE
|
69
81
|
- README.md
|
70
82
|
- Rakefile
|
83
|
+
- cucumber.yml
|
71
84
|
- lib/spectest.rb
|
85
|
+
- lib/spectest/logger.rb
|
86
|
+
- lib/spectest/matchers.rb
|
87
|
+
- lib/spectest/platform_selenium.rb
|
88
|
+
- lib/spectest/platform_selenium/platform_object.rb
|
89
|
+
- lib/spectest/platform_watir.rb
|
90
|
+
- lib/spectest/platform_watir/platform_object.rb
|
91
|
+
- lib/spectest/platforms.rb
|
72
92
|
- lib/spectest/version.rb
|
93
|
+
- spec/browser_level_spec.rb
|
94
|
+
- spec/page_level_spec.rb
|
95
|
+
- spec/platform_object_spec.rb
|
96
|
+
- spec/platform_selenium_spec.rb
|
97
|
+
- spec/platform_watir_spec.rb
|
98
|
+
- spec/platforms_spec.rb
|
99
|
+
- spec/spec_helper.rb
|
100
|
+
- spec/spectest_spec.rb
|
101
|
+
- specs/app/favicon.ico
|
102
|
+
- specs/app/images/mass_extinction.jpg
|
103
|
+
- specs/app/index.html
|
104
|
+
- specs/app/modal_1.html
|
105
|
+
- specs/app/modal_2.html
|
106
|
+
- specs/app/server.rb
|
107
|
+
- specs/app/style.css
|
108
|
+
- specs/app/success_1.html
|
109
|
+
- specs/app/success_2.html
|
110
|
+
- specs/app/test_event.html
|
111
|
+
- specs/app/test_form.html
|
112
|
+
- specs/app/test_frame.html
|
113
|
+
- specs/app/test_iframe.html
|
114
|
+
- specs/app/test_static.html
|
115
|
+
- specs/engine/borg.rb
|
116
|
+
- specs/engine/hooks.rb
|
117
|
+
- specs/pages/landing_page.rb
|
118
|
+
- specs/steps/page_steps.rb
|
119
|
+
- specs/tests/page.feature
|
73
120
|
- spectest.gemspec
|
74
121
|
homepage: https://github.com/jnyman/spectest
|
75
122
|
licenses:
|