watir-rspec 0.0.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +11 -0
- data/CHANGES +5 -0
- data/Gemfile +2 -0
- data/README.md +39 -104
- data/Rakefile +6 -0
- data/bin/watir-rspec +5 -0
- data/lib/watir/rspec.rb +12 -129
- data/lib/watir/rspec/active_record_shared_connection.rb +16 -12
- data/lib/watir/rspec/cli.rb +125 -0
- data/lib/watir/rspec/helper.rb +1 -1
- data/lib/watir/rspec/html_formatter.rb +1 -1
- data/lib/watir/rspec/matchers.rb +38 -0
- data/lib/watir/rspec/matchers/base_matcher.rb +76 -0
- data/lib/watir/rspec/version.rb +1 -1
- data/spec/spec_helper.rb +18 -0
- data/spec/watir/rspec/active_record_shared_connection_spec.rb +24 -0
- data/spec/watir/rspec/helper_spec.rb +56 -0
- data/spec/watir/rspec/matchers/base_matcher_spec.rb +177 -0
- data/spec/watir/rspec/matchers_spec.rb +23 -0
- data/watir-rspec.gemspec +23 -23
- metadata +32 -25
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bbbc8f72cbcb8c30d1ae8d802de384282a811d42
|
4
|
+
data.tar.gz: 1b4866fceef13da65071c510b0363b26851599f6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 586f19b53415d428a7261704d4e4d8932dc7fe1c91ecdde8029a2402e0cfcce22218e928aa59a2ecf23dcc793ce6be506faad23d2293486b8fa19b5596f20199
|
7
|
+
data.tar.gz: 7ab92d211d77365d18218a8be6fd73cbf8663e3f1b103497ed9dd518aab0e89eea4ecc8ded1175ae58d9602b250c7570ffddabf39e9f33bcb85bcd0ec66faed5
|
data/.travis.yml
ADDED
data/CHANGES
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,16 @@
|
|
1
1
|
# Watir::RSpec
|
2
|
+
[![Gem Version](https://badge.fury.io/rb/test-page.png)](http://badge.fury.io/rb/watir-rspec)
|
3
|
+
[![Build Status](https://api.travis-ci.org/watir/watir-rspec.png)](http://travis-ci.org/watir/watir-rspec)
|
4
|
+
[![Coverage](https://coveralls.io/repos/watir/watir-rspec/badge.png?branch=master)](https://coveralls.io/r/watir/watir-rspec)
|
2
5
|
|
3
6
|
Use [Watir](http://watir.com) with [RSpec](http://rspec.info) with ease.
|
4
7
|
|
8
|
+
* No need to use the `@browser` or `$browser` variables when executing browser methods.
|
9
|
+
* No need to open the browser in your each test manually.
|
10
|
+
* Easily test for asynchronous events by using `#within` matchers.
|
11
|
+
* Easily test that something stays the same within some period by using `#during` matchers.
|
12
|
+
* Get nice html reports with links to html, screenshots and other files generated during test.
|
13
|
+
|
5
14
|
## Installation
|
6
15
|
|
7
16
|
Add these lines to your application's Gemfile:
|
@@ -12,128 +21,54 @@ group :test do
|
|
12
21
|
end
|
13
22
|
````
|
14
23
|
|
15
|
-
|
16
|
-
|
17
|
-
````ruby
|
18
|
-
RSpec.configure do |config|
|
19
|
-
# Add Watir::RSpec::HtmlFormatter to get links to the screenshots, html and
|
20
|
-
# all other files created during the failing examples.
|
21
|
-
config.add_formatter('documentation')
|
22
|
-
config.add_formatter(Watir::RSpec::HtmlFormatter)
|
23
|
-
|
24
|
-
# Open up the browser for each example.
|
25
|
-
config.before :all do
|
26
|
-
@browser = Watir::Browser.new
|
27
|
-
end
|
28
|
-
|
29
|
-
# Close that browser after each example.
|
30
|
-
config.after :all do
|
31
|
-
@browser.close if @browser
|
32
|
-
end
|
33
|
-
|
34
|
-
# Include RSpec::Helper into each of your example group for making it possible to
|
35
|
-
# write in your examples instead of:
|
36
|
-
# @browser.goto "localhost"
|
37
|
-
# @browser.text_field(:name => "first_name").set "Bob"
|
38
|
-
#
|
39
|
-
# like this:
|
40
|
-
# goto "localhost"
|
41
|
-
# text_field(:name => "first_name").set "Bob"
|
42
|
-
#
|
43
|
-
# This needs that you've used @browser as an instance variable name in
|
44
|
-
# before :all block.
|
45
|
-
config.include Watir::RSpec::Helper
|
46
|
-
end
|
47
|
-
````
|
48
|
-
|
49
|
-
|
50
|
-
When using Rails and writing specs to requests directory, add an additional filter for RSpec:
|
24
|
+
Or install it manually as:
|
51
25
|
|
52
|
-
|
53
|
-
config.before :all, :type => :request do
|
54
|
-
@browser = Watir::Browser.new :chrome
|
55
|
-
end
|
26
|
+
gem install watir-rspec
|
56
27
|
|
57
|
-
|
58
|
-
@browser.close if @browser
|
59
|
-
end
|
28
|
+
And execute the following command to add `watir-rspec` configuration into your `spec_helper`:
|
60
29
|
|
61
|
-
|
62
|
-
````
|
30
|
+
watir-rspec install
|
63
31
|
|
64
32
|
## Usage
|
65
33
|
|
66
|
-
|
67
|
-
|
68
|
-
If you did include ````Watir::Rspec::Helper```` then it is possible to write code like this in your specs:
|
69
|
-
|
70
|
-
````ruby
|
71
|
-
text_field(:id => "something").set "foo"
|
72
|
-
````
|
73
|
-
|
74
|
-
If you did not include ````Watir::RSpec::Helper```` then you have to use browser variable:
|
75
|
-
|
76
|
-
````ruby
|
77
|
-
@browser.text_field(:id => "something").set "foo"
|
78
|
-
````
|
79
|
-
|
80
|
-
### Testing asynchronous functionality
|
81
|
-
|
82
|
-
````Watir::RSpec```` adds convenience methods ````#within```` and ````#during```` to all of the RSpec matchers,
|
83
|
-
which help to write better and more beautiful test code.
|
84
|
-
|
85
|
-
Let us pretend that the following div will appear dynamically after some Ajax request.
|
86
|
-
|
87
|
-
We can use the standard way:
|
34
|
+
Check out the [documentation](http://rubydoc.info/gems/watir-rspec/frames) and the straight-forward fully working examples below.
|
88
35
|
|
89
36
|
````ruby
|
90
|
-
|
91
|
-
````
|
92
|
-
|
93
|
-
Or we can use ````#within```` method:
|
94
|
-
|
95
|
-
````ruby
|
96
|
-
div(:id => "something").should be_present.within(5)
|
97
|
-
````
|
98
|
-
|
99
|
-
````#during```` is the opposite of ````#within```` - it means that during the specified time something should be true/false.
|
37
|
+
require "spec_helper"
|
100
38
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
39
|
+
describe "Google" do
|
40
|
+
before { goto "http://google.com" }
|
41
|
+
|
42
|
+
it "has search box" do
|
43
|
+
text_field(:name => "q").should be_present
|
44
|
+
end
|
45
|
+
|
46
|
+
it "allows to search" do
|
47
|
+
text_field(:name => "q").set "watir"
|
48
|
+
button(:id => "gbqfb").click
|
49
|
+
results = div(:id => "ires")
|
50
|
+
results.should be_present.within(2)
|
51
|
+
results.lis(:class => "g").map(&:text).should be_any { |text| text =~ /watir/ }
|
52
|
+
results.should be_present.during(1)
|
53
|
+
end
|
54
|
+
end
|
107
55
|
````
|
108
56
|
|
109
|
-
The reason is that RSpec will check if value of ````#text```` will change to ````"foo"````, but it is just some ````String````,
|
110
|
-
which won't change ever. The rule of thumb is that ````#should```` should be always called on an instance of
|
111
|
-
the ````Element```` and ````#within/#duration```` on the matcher for that ````Element```` (e.g. ````be_present````, ````be_visible````, ````exist```` etc.).
|
112
|
-
|
113
57
|
### Files created during specs
|
114
58
|
|
115
|
-
|
116
|
-
|
117
|
-
fails. To do that you need to use ````Watir::RSpec.file_path```` method for generating
|
118
|
-
unique file name:
|
59
|
+
You can use `Watir::RSpec.file_path` to have links automatically in the html report
|
60
|
+
to the files created during tests.
|
119
61
|
|
120
|
-
|
62
|
+
```ruby
|
121
63
|
uploaded_file_path = Watir::RSpec.file_path("uploaded.txt")
|
122
64
|
File.open(uploaded_file_path, "w") {|file| file.write "Generated File Input"}
|
123
|
-
|
124
|
-
|
125
|
-
### Rails support
|
126
|
-
|
127
|
-
If you're using Rails, then you also need to install [watir-rails](https://github.com/watir/watir-rails) gem.
|
65
|
+
file_field(:name => "upload-file").set uploaded_file_path
|
66
|
+
```
|
128
67
|
|
129
|
-
|
68
|
+
### Rails
|
130
69
|
|
131
|
-
|
132
|
-
2. Create your feature branch (`git checkout -b my-new-feature`)
|
133
|
-
3. Commit your changes (`git commit -am 'Added some feature'`)
|
134
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
135
|
-
5. Create new Pull Request
|
70
|
+
You need to use [rspec-rails](https://github.com/rspec/rspec-rails) and [watir-rails](https://github.com/watir/watir-rails) gems together with `watir-rspec` to achieve maximum satisfaction.
|
136
71
|
|
137
72
|
## License
|
138
73
|
|
139
|
-
Copyright (c) Jarmo Pertman (jarmo.p@gmail.com). See LICENSE for details.
|
74
|
+
Copyright (c) [Jarmo Pertman](https://github.com/jarmo) (jarmo.p@gmail.com). See LICENSE for details.
|
data/Rakefile
CHANGED
data/bin/watir-rspec
ADDED
data/lib/watir/rspec.rb
CHANGED
@@ -1,110 +1,11 @@
|
|
1
|
-
require 'rspec'
|
2
|
-
require File.expand_path("rspec/helper", File.dirname(__FILE__))
|
3
|
-
require File.expand_path("rspec/html_formatter", File.dirname(__FILE__))
|
4
|
-
|
5
|
-
if defined? ActiveRecord
|
6
|
-
require File.expand_path("rspec/active_record_shared_connection", File.dirname(__FILE__))
|
7
|
-
end
|
8
|
-
|
9
1
|
module Watir
|
10
2
|
class RSpec
|
11
3
|
class << self
|
12
|
-
# Add #within(timeout) and #during(timeout) methods for every matcher for allowing to wait until some condition is met.
|
13
|
-
# div.click
|
14
|
-
# another_div.should be_present.within(5)
|
15
|
-
#
|
16
|
-
# expect {
|
17
|
-
# div.click
|
18
|
-
# }.to change {another_div.text}.from("before").to("after").within(5)
|
19
|
-
#
|
20
|
-
# expect {
|
21
|
-
# div.click
|
22
|
-
# }.to make {another_div.present?}.within(5)
|
23
|
-
#
|
24
|
-
# expect {
|
25
|
-
# div.click
|
26
|
-
# }.to change {another_div.text}.soon
|
27
|
-
#
|
28
|
-
# @private
|
29
|
-
def add_within_and_during_to_matcher const
|
30
|
-
const.class_eval do
|
31
|
-
|
32
|
-
inst_methods = instance_methods.map &:to_sym
|
33
|
-
|
34
|
-
if !(inst_methods.include?(:__matches?) || inst_methods.include?(:__does_not_match?)) &&
|
35
|
-
(inst_methods.include?(:matches?) || inst_methods.include?(:does_not_match?))
|
36
|
-
|
37
|
-
def within(timeout)
|
38
|
-
@within_timeout = timeout
|
39
|
-
self
|
40
|
-
end
|
41
|
-
|
42
|
-
def during(timeout)
|
43
|
-
@during_timeout = timeout
|
44
|
-
self
|
45
|
-
end
|
46
|
-
|
47
|
-
def soon
|
48
|
-
within(30)
|
49
|
-
end
|
50
|
-
|
51
|
-
def seconds
|
52
|
-
# for syntactic sugar
|
53
|
-
self
|
54
|
-
end
|
55
|
-
|
56
|
-
alias_method :second, :seconds
|
57
|
-
|
58
|
-
def minutes
|
59
|
-
@within_timeout *= 60 if @within_timeout
|
60
|
-
@during_timeout *= 60 if @during_timeout
|
61
|
-
self
|
62
|
-
end
|
63
|
-
|
64
|
-
alias_method :minute, :minutes
|
65
|
-
end
|
66
|
-
|
67
|
-
if inst_methods.include? :matches?
|
68
|
-
alias_method :__matches?, :matches?
|
69
|
-
|
70
|
-
def matches?(actual)
|
71
|
-
match_with_wait {__matches?(actual)}
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
if inst_methods.include? :does_not_match?
|
76
|
-
alias_method :__does_not_match?, :does_not_match?
|
77
|
-
|
78
|
-
def does_not_match?(actual)
|
79
|
-
match_with_wait {__does_not_match?(actual)}
|
80
|
-
end
|
81
|
-
elsif inst_methods.include? :matches?
|
82
|
-
def does_not_match?(actual)
|
83
|
-
match_with_wait {!__matches?(actual)}
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
private
|
88
|
-
|
89
|
-
def match_with_wait
|
90
|
-
if @within_timeout
|
91
|
-
timeout = @within_timeout; @within_timeout = nil
|
92
|
-
Watir::Wait.until(timeout) {yield} rescue false
|
93
|
-
elsif @during_timeout
|
94
|
-
timeout = @during_timeout; @during_timeout = nil
|
95
|
-
Watir::Wait.while(timeout) {yield} rescue true
|
96
|
-
else
|
97
|
-
yield
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
4
|
# Generate unique file path for the current spec. If the file
|
104
5
|
# will be created during that spec and spec fails then it will be
|
105
6
|
# shown automatically in the html report.
|
106
7
|
#
|
107
|
-
# @param [String] File name to be used for file.
|
8
|
+
# @param [String] file_name File name to be used for file.
|
108
9
|
# Will be used as a part of the complete name.
|
109
10
|
# @return [String] Absolute path for the unique file name.
|
110
11
|
# @raise [RuntimeError] when {Watir::RSpec::HtmlFormatter} is not in use.
|
@@ -112,6 +13,11 @@ module Watir
|
|
112
13
|
formatter.file_path(file_name, description=nil)
|
113
14
|
end
|
114
15
|
|
16
|
+
# @private
|
17
|
+
def active_record_loaded?
|
18
|
+
defined? ActiveRecord::Base
|
19
|
+
end
|
20
|
+
|
115
21
|
private
|
116
22
|
|
117
23
|
def formatter
|
@@ -131,38 +37,15 @@ module Watir
|
|
131
37
|
formatter
|
132
38
|
end
|
133
39
|
end
|
134
|
-
|
135
|
-
|
136
40
|
end
|
137
|
-
|
138
41
|
end
|
139
42
|
end
|
140
43
|
|
141
|
-
|
142
|
-
# @private
|
143
|
-
module ::RSpec::Matchers
|
144
|
-
class BuiltIn::Change
|
145
|
-
def matches?(event_proc)
|
146
|
-
raise_block_syntax_error if block_given?
|
44
|
+
require "rspec"
|
147
45
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
@actual_after = evaluate_value_proc
|
154
|
-
|
155
|
-
(!change_expected? || changed?) && matches_before? && matches_after? && matches_expected_delta? && matches_min? && matches_max?
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
alias_method :make, :change
|
160
|
-
end
|
161
|
-
|
162
|
-
matchers = RSpec::Matchers::BuiltIn.constants.map(&:to_sym)
|
163
|
-
matchers.delete :BaseMatcher
|
164
|
-
matchers.each do |const|
|
165
|
-
Watir::RSpec.add_within_and_during_to_matcher RSpec::Matchers::BuiltIn.const_get const
|
166
|
-
end
|
46
|
+
require File.expand_path("rspec/active_record_shared_connection", File.dirname(__FILE__))
|
47
|
+
require File.expand_path("rspec/helper", File.dirname(__FILE__))
|
48
|
+
require File.expand_path("rspec/matchers/base_matcher", File.dirname(__FILE__))
|
49
|
+
require File.expand_path("rspec/matchers", File.dirname(__FILE__))
|
50
|
+
require File.expand_path("rspec/html_formatter", File.dirname(__FILE__))
|
167
51
|
|
168
|
-
Watir::RSpec.add_within_and_during_to_matcher RSpec::Matchers::DSL::Matcher
|
@@ -1,16 +1,20 @@
|
|
1
|
-
RSpec.
|
2
|
-
|
3
|
-
#
|
4
|
-
# Tip from http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/
|
5
|
-
class ::ActiveRecord::Base
|
6
|
-
mattr_accessor :shared_connection
|
7
|
-
@@shared_connection = nil
|
1
|
+
if Watir::RSpec.active_record_loaded?
|
2
|
+
require "thread"
|
8
3
|
|
9
|
-
|
10
|
-
|
4
|
+
RSpec.configuration.before(:suite) do
|
5
|
+
# Allow RSpec specs to use transactional fixtures when using Watir.
|
6
|
+
#
|
7
|
+
# Tip from http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/
|
8
|
+
class ::ActiveRecord::Base
|
9
|
+
@shared_connection_semaphore = Mutex.new
|
10
|
+
|
11
|
+
class << self
|
12
|
+
def connection
|
13
|
+
@shared_connection_semaphore.synchronize do
|
14
|
+
@shared_connection ||= retrieve_connection
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
11
18
|
end
|
12
19
|
end
|
13
|
-
|
14
|
-
# Forces all threads to share the same connection.
|
15
|
-
::ActiveRecord::Base.shared_connection = ::ActiveRecord::Base.connection
|
16
20
|
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require "optparse"
|
2
|
+
|
3
|
+
module Watir
|
4
|
+
class RSpec
|
5
|
+
# @private
|
6
|
+
class CLI
|
7
|
+
class << self
|
8
|
+
def execute
|
9
|
+
@options = {}
|
10
|
+
parser = OptionParser.new do |opts|
|
11
|
+
opts.banner = "Install watir-rspec configuration into spec_helper file.
|
12
|
+
|
13
|
+
Usage: watir-rspec [options] install"
|
14
|
+
|
15
|
+
opts.on("-r", "--[no-]rails", "Force to install watir-rspec for Rails application if the detection fails") do |v|
|
16
|
+
@options[:rails] = v
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
parser.parse!
|
21
|
+
|
22
|
+
if ARGV.size != 1 || ARGV.first != "install"
|
23
|
+
puts parser
|
24
|
+
exit
|
25
|
+
end
|
26
|
+
|
27
|
+
unless already_installed?
|
28
|
+
install
|
29
|
+
else
|
30
|
+
puts "watir-rspec is already installed into #{spec_helper}... skipping."
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def install
|
38
|
+
puts "Rails application #{using_rails? ? "detected" : "not detected"}.
|
39
|
+
Installing watir-rspec configuration into #{spec_helper}."
|
40
|
+
|
41
|
+
File.open(spec_helper, "a") do |file|
|
42
|
+
file.puts %Q[
|
43
|
+
# Configuration for watir-rspec
|
44
|
+
require "watir/rspec"
|
45
|
+
|
46
|
+
RSpec.configure do |config|
|
47
|
+
# Use Watir::RSpec::HtmlFormatter to get links to the screenshots, html and
|
48
|
+
# all other files created during the failing examples.
|
49
|
+
config.add_formatter(:progress) if config.formatters.empty?
|
50
|
+
config.add_formatter(Watir::RSpec::HtmlFormatter)
|
51
|
+
|
52
|
+
# Open up the browser for each example.
|
53
|
+
config.before :all#{rails_filter} do
|
54
|
+
@browser = Watir::Browser.new
|
55
|
+
end
|
56
|
+
|
57
|
+
# Close that browser after each example.
|
58
|
+
config.after :all#{rails_filter} do
|
59
|
+
@browser.close if @browser
|
60
|
+
end
|
61
|
+
|
62
|
+
# Include RSpec::Helper into each of your example group for making it possible to
|
63
|
+
# write in your examples instead of:
|
64
|
+
# @browser.goto "localhost"
|
65
|
+
# @browser.text_field(:name => "first_name").set "Bob"
|
66
|
+
#
|
67
|
+
# like this:
|
68
|
+
# goto "localhost"
|
69
|
+
# text_field(:name => "first_name").set "Bob"
|
70
|
+
#
|
71
|
+
# This needs that you've used @browser as an instance variable name in
|
72
|
+
# before :all block.
|
73
|
+
config.include Watir::RSpec::Helper#{rails_filter}
|
74
|
+
|
75
|
+
# Include RSpec::Matchers into each of your example group for making it possible to
|
76
|
+
# use #within with some of RSpec matchers for easier asynchronous testing:
|
77
|
+
# @browser.text_field(:name => "first_name").should exist.within(2)
|
78
|
+
# @browser.text_field(:name => "first_name").should be_present.within(2)
|
79
|
+
# @browser.text_field(:name => "first_name").should be_visible.within(2)
|
80
|
+
#
|
81
|
+
# You can also use #during to test if something stays the same during the specified period:
|
82
|
+
# @browser.text_field(:name => "first_name").should exist.during(2)
|
83
|
+
config.include Watir::RSpec::Matchers#{rails_filter}
|
84
|
+
end
|
85
|
+
]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def already_installed?
|
90
|
+
File.exist?(spec_helper) && File.read(spec_helper) =~ /Watir::RSpec/
|
91
|
+
end
|
92
|
+
|
93
|
+
def spec_directory
|
94
|
+
specs = File.expand_path("spec")
|
95
|
+
|
96
|
+
unless File.directory? specs
|
97
|
+
puts %Q[#{specs} directory not found.
|
98
|
+
Make sure you run the watir-rspec command within your projects' directory.]
|
99
|
+
|
100
|
+
exit 1
|
101
|
+
end
|
102
|
+
|
103
|
+
specs
|
104
|
+
end
|
105
|
+
|
106
|
+
def spec_helper
|
107
|
+
File.join(spec_directory, "spec_helper.rb")
|
108
|
+
end
|
109
|
+
|
110
|
+
def rails_filter
|
111
|
+
", :type => :request" if using_rails?
|
112
|
+
end
|
113
|
+
|
114
|
+
def using_rails?
|
115
|
+
return @options[:rails] if @options.has_key? :rails
|
116
|
+
|
117
|
+
@using_rails ||= begin
|
118
|
+
File.exists?("Gemfile.lock") && File.read("Gemfile.lock") =~ /rspec-rails/ ||
|
119
|
+
File.exists?("Gemfile") && File.read("Gemfile") =~ /rspec-rails/
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
data/lib/watir/rspec/helper.rb
CHANGED
@@ -3,7 +3,7 @@ module Watir
|
|
3
3
|
module Helper
|
4
4
|
extend Forwardable
|
5
5
|
|
6
|
-
# @return [Watir::Browser] a
|
6
|
+
# @return [Watir::Browser] a current browser instance if it is initialized with
|
7
7
|
# @browser or $browser variable name.
|
8
8
|
def browser
|
9
9
|
@browser || $browser
|
@@ -55,7 +55,7 @@ module Watir
|
|
55
55
|
# will be created during that spec and spec fails then it will be
|
56
56
|
# shown automatically in the html report.
|
57
57
|
#
|
58
|
-
# @param [String] File name to be used for file.
|
58
|
+
# @param [String] file_name File name to be used for file.
|
59
59
|
# Will be used as a part of the complete name.
|
60
60
|
# @return [String] Absolute path for the unique file name.
|
61
61
|
def file_path(file_name, description=nil)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Watir
|
2
|
+
class RSpec
|
3
|
+
# All matchers defined in here have the ability to be used for asynchronous
|
4
|
+
# testing.
|
5
|
+
#
|
6
|
+
# There is #within matcher which means that the expected result should happen
|
7
|
+
# within the specified time period.
|
8
|
+
#
|
9
|
+
# There also exists less used #during matcher which means that the expected
|
10
|
+
# result should be true for the whole specified time period.
|
11
|
+
#
|
12
|
+
# @example Wait for 2 seconds until element is present (element exists and is visible)
|
13
|
+
# text_field.should be_present.within(2)
|
14
|
+
#
|
15
|
+
# @example Wait for 2 seconds until element is visible
|
16
|
+
# text_field.should be_visible.within(2)
|
17
|
+
#
|
18
|
+
# @example Wait for 2 seconds until element exists
|
19
|
+
# text_field.should exist.within(2)
|
20
|
+
#
|
21
|
+
# @example Make sure that container is visible for the whole time during 2 seconds
|
22
|
+
# button.click
|
23
|
+
# div.should be_visible.during(2)
|
24
|
+
module Matchers
|
25
|
+
def be_present
|
26
|
+
BaseMatcher.new :present?
|
27
|
+
end
|
28
|
+
|
29
|
+
def be_visible
|
30
|
+
BaseMatcher.new :visible?
|
31
|
+
end
|
32
|
+
|
33
|
+
def exist
|
34
|
+
BaseMatcher.new :exist?
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "timeout"
|
2
|
+
|
3
|
+
module Watir
|
4
|
+
class RSpec
|
5
|
+
module Matchers
|
6
|
+
# @private
|
7
|
+
class BaseMatcher < ::RSpec::Matchers::BuiltIn::Be
|
8
|
+
def initialize(predicate)
|
9
|
+
@predicate = predicate
|
10
|
+
end
|
11
|
+
|
12
|
+
def matches?(target)
|
13
|
+
@target = target
|
14
|
+
|
15
|
+
if @within_seconds
|
16
|
+
match_with_timeout(@within_seconds, true) { target.send @predicate }
|
17
|
+
elsif @during_seconds
|
18
|
+
match_with_timeout(@during_seconds, false) { !target.send @predicate }
|
19
|
+
else
|
20
|
+
target.send(@predicate)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def does_not_match?(target)
|
25
|
+
@target = target
|
26
|
+
|
27
|
+
if @within_seconds
|
28
|
+
match_with_timeout(@within_seconds, true) { !target.send @predicate }
|
29
|
+
elsif @during_seconds
|
30
|
+
match_with_timeout(@during_seconds, false) { target.send @predicate }
|
31
|
+
else
|
32
|
+
!target.send(@predicate)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def failure_message_for_should
|
37
|
+
"expected #{@target.inspect} to #{be_prefix}#{@predicate.to_s[0..-2]}#{timeout_to_s}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def failure_message_for_should_not
|
41
|
+
"expected #{@target.inspect} not to #{be_prefix}#{@predicate.to_s[0..-2]}#{timeout_to_s}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def within(seconds)
|
45
|
+
@within_seconds = seconds
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
def during(seconds)
|
50
|
+
@during_seconds = seconds
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def match_with_timeout(seconds, expected_result)
|
57
|
+
Timeout.timeout(seconds) { sleep 0.1 until (yield rescue false); expected_result } rescue !expected_result
|
58
|
+
end
|
59
|
+
|
60
|
+
def be_prefix
|
61
|
+
@predicate.to_s[0..-2] == "exist" ? "" : "be "
|
62
|
+
end
|
63
|
+
|
64
|
+
def timeout_to_s
|
65
|
+
if @within_seconds
|
66
|
+
" within #{@within_seconds} second(s) "
|
67
|
+
elsif @during_seconds
|
68
|
+
" during #{@during_seconds} second(s) "
|
69
|
+
else
|
70
|
+
" "
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/watir/rspec/version.rb
CHANGED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "simplecov"
|
2
|
+
require 'coveralls'
|
3
|
+
|
4
|
+
SimpleCov.formatter = Coveralls::SimpleCov::Formatter
|
5
|
+
SimpleCov.start
|
6
|
+
|
7
|
+
RSpec.configure do |c|
|
8
|
+
c.color = true
|
9
|
+
c.order = :random
|
10
|
+
end
|
11
|
+
|
12
|
+
# Make sure constants are defined
|
13
|
+
module ::ActiveRecord
|
14
|
+
class Base
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
require "watir/rspec"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe ::ActiveRecord::Base do
|
4
|
+
before { described_class.instance_variable_set :@shared_connection, nil }
|
5
|
+
|
6
|
+
context ".connection" do
|
7
|
+
it "reuses the connection" do
|
8
|
+
described_class.should_receive(:retrieve_connection).once.and_return(:established_connection)
|
9
|
+
|
10
|
+
2.times { described_class.connection.should == :established_connection }
|
11
|
+
end
|
12
|
+
|
13
|
+
it "uses mutex" do
|
14
|
+
described_class.should_receive(:retrieve_connection).once { sleep 0.1; :established_connection }
|
15
|
+
|
16
|
+
thr = Thread.new { described_class.connection }
|
17
|
+
|
18
|
+
t = Time.now
|
19
|
+
described_class.connection
|
20
|
+
(Time.now - t).should be >= 0.1
|
21
|
+
thr.join
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Watir::RSpec::Helper do
|
4
|
+
before { self.send :extend, described_class }
|
5
|
+
after { $browser = @browser = nil }
|
6
|
+
|
7
|
+
context "#browser" do
|
8
|
+
it "delegates to @browser if exists" do
|
9
|
+
@browser = :browser
|
10
|
+
browser.should == @browser
|
11
|
+
end
|
12
|
+
|
13
|
+
it "delegates to @browser if @browser exists even if $browser exists" do
|
14
|
+
@browser = :browser
|
15
|
+
$browser = :global_browser
|
16
|
+
browser.should == @browser
|
17
|
+
end
|
18
|
+
|
19
|
+
it "delegates to $browser if @browser does not exist" do
|
20
|
+
$browser = :global_browser
|
21
|
+
browser.should == $browser
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "#method_missing" do
|
26
|
+
it "redirects missing methods to browser if method exists" do
|
27
|
+
@browser = double("browser", coolness_factor: :very)
|
28
|
+
coolness_factor.should == :very
|
29
|
+
end
|
30
|
+
|
31
|
+
it "raises error when browser does not have method" do
|
32
|
+
@browser = double("browser")
|
33
|
+
described_class.should_not be_method_defined :not_existing_method
|
34
|
+
|
35
|
+
expect do
|
36
|
+
self.not_existing_method
|
37
|
+
end.to raise_error(NoMethodError)
|
38
|
+
|
39
|
+
described_class.should_not be_method_defined :not_existing_method
|
40
|
+
end
|
41
|
+
|
42
|
+
it "adds browser methods to the helper" do
|
43
|
+
@browser = double("browser", method_to_be_defined: :done)
|
44
|
+
described_class.should_not be_method_defined :method_to_be_defined
|
45
|
+
method_to_be_defined.should == :done
|
46
|
+
described_class.should be_method_defined :method_to_be_defined
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
it "#p is delegated to the browser" do
|
51
|
+
@browser = double("browser", p: "#p")
|
52
|
+
described_class.should_not_receive(:method_missing)
|
53
|
+
|
54
|
+
p.should == "#p"
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Watir::RSpec::Matchers::BaseMatcher do
|
4
|
+
before { self.class.send(:define_method, :be_foo) { described_class.new :foo? } }
|
5
|
+
|
6
|
+
it "#matches?" do
|
7
|
+
object = double("element", foo?: true)
|
8
|
+
object.should be_foo
|
9
|
+
end
|
10
|
+
|
11
|
+
it "#matches? with error" do
|
12
|
+
object = double("element", foo?: false)
|
13
|
+
expect {
|
14
|
+
object.should be_foo
|
15
|
+
}.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "#does_not_match?" do
|
19
|
+
object = double("element", foo?: false)
|
20
|
+
object.should_not be_foo
|
21
|
+
end
|
22
|
+
|
23
|
+
it "#does_not_match? with error" do
|
24
|
+
object = double("element", foo?: true)
|
25
|
+
expect {
|
26
|
+
object.should_not be_foo
|
27
|
+
}.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
28
|
+
end
|
29
|
+
|
30
|
+
context "#within" do
|
31
|
+
around { |example| should_take_at_least(0.1) { example.run }}
|
32
|
+
|
33
|
+
it "#matches?" do
|
34
|
+
object = double("element")
|
35
|
+
@result = false
|
36
|
+
object.stub(:foo?) { @result }
|
37
|
+
thr = Thread.new { sleep 0.1; @result = true }
|
38
|
+
|
39
|
+
object.should be_foo.within(1)
|
40
|
+
thr.join
|
41
|
+
end
|
42
|
+
|
43
|
+
it "#matches? with timeout error" do
|
44
|
+
object = double("element", foo?: false)
|
45
|
+
|
46
|
+
expect {
|
47
|
+
object.should be_foo.within(0.1)
|
48
|
+
}.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "#matches? with some other error" do
|
52
|
+
object = double("element")
|
53
|
+
raised = false
|
54
|
+
object.stub(:foo?) do
|
55
|
+
unless raised
|
56
|
+
raised = true
|
57
|
+
raise "Some unexpected exception"
|
58
|
+
else
|
59
|
+
sleep 0.1
|
60
|
+
true
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
object.should be_foo.within(1)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "#does_not_match?" do
|
68
|
+
object = double("element")
|
69
|
+
@result = true
|
70
|
+
object.stub(:foo?) { @result }
|
71
|
+
thr = Thread.new { sleep 0.1; @result = false }
|
72
|
+
|
73
|
+
object.should_not be_foo.within(1)
|
74
|
+
thr.join
|
75
|
+
end
|
76
|
+
|
77
|
+
it "#does_not_match? with timeout error" do
|
78
|
+
object = double("element", foo?: true)
|
79
|
+
|
80
|
+
expect {
|
81
|
+
object.should_not be_foo.within(0.1)
|
82
|
+
}.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "#does_not_match? with some other error" do
|
86
|
+
object = double("element")
|
87
|
+
raised = false
|
88
|
+
object.stub(:foo?) do
|
89
|
+
unless raised
|
90
|
+
raised = true
|
91
|
+
raise "Some unexpected exception"
|
92
|
+
else
|
93
|
+
sleep 0.1
|
94
|
+
false
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
object.should_not be_foo.within(1)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "#during" do
|
103
|
+
around { |example| should_take_at_least(0.1) { example.run }}
|
104
|
+
|
105
|
+
it "#matches?" do
|
106
|
+
object = double("element", foo?: true)
|
107
|
+
|
108
|
+
object.should be_foo.during(0.1)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "#matches? with timeout error" do
|
112
|
+
object = double("element")
|
113
|
+
@result = true
|
114
|
+
object.stub(:foo?) { @result }
|
115
|
+
thr = Thread.new { sleep 0.1; @result = false }
|
116
|
+
|
117
|
+
expect {
|
118
|
+
object.should be_foo.during(1)
|
119
|
+
}.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
120
|
+
thr.join
|
121
|
+
end
|
122
|
+
|
123
|
+
it "#matches? with some other error" do
|
124
|
+
object = double("element")
|
125
|
+
raised = false
|
126
|
+
object.stub(:foo?) do
|
127
|
+
unless raised
|
128
|
+
raised = true
|
129
|
+
raise "Some unexpected exception"
|
130
|
+
else
|
131
|
+
true
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
object.should be_foo.during(0.1)
|
136
|
+
end
|
137
|
+
|
138
|
+
it "#does_not_match?" do
|
139
|
+
object = double("element", foo?: false)
|
140
|
+
|
141
|
+
object.should_not be_foo.during(0.1)
|
142
|
+
end
|
143
|
+
|
144
|
+
it "#does_not_match? with timeout error" do
|
145
|
+
object = double("element")
|
146
|
+
@result = false
|
147
|
+
object.stub(:foo?) { @result }
|
148
|
+
thr = Thread.new { sleep 0.1; @result = true }
|
149
|
+
|
150
|
+
expect {
|
151
|
+
object.should_not be_foo.during(1)
|
152
|
+
}.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
153
|
+
thr.join
|
154
|
+
end
|
155
|
+
|
156
|
+
it "#does_not_match? with some other error" do
|
157
|
+
object = double("element")
|
158
|
+
raised = false
|
159
|
+
object.stub(:foo?) do
|
160
|
+
unless raised
|
161
|
+
raised = true
|
162
|
+
raise "Some unexpected exception"
|
163
|
+
else
|
164
|
+
false
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
object.should_not be_foo.during(0.1)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def should_take_at_least(seconds)
|
173
|
+
t = Time.now
|
174
|
+
yield
|
175
|
+
(Time.now - t).should be >= seconds
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Watir::RSpec::Matchers do
|
4
|
+
before { self.send :extend, described_class }
|
5
|
+
|
6
|
+
it "#be_present" do
|
7
|
+
matcher = be_present
|
8
|
+
matcher.should == Watir::RSpec::Matchers::BaseMatcher
|
9
|
+
matcher.instance_variable_get(:@predicate).should == :present?
|
10
|
+
end
|
11
|
+
|
12
|
+
it "#be_visible" do
|
13
|
+
matcher = be_visible
|
14
|
+
matcher.should == Watir::RSpec::Matchers::BaseMatcher
|
15
|
+
matcher.instance_variable_get(:@predicate).should == :visible?
|
16
|
+
end
|
17
|
+
|
18
|
+
it "#exist" do
|
19
|
+
matcher = exist
|
20
|
+
matcher.should == Watir::RSpec::Matchers::BaseMatcher
|
21
|
+
matcher.instance_variable_get(:@predicate).should == :exist?
|
22
|
+
end
|
23
|
+
end
|
data/watir-rspec.gemspec
CHANGED
@@ -1,23 +1,23 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path('../lib/watir/rspec/version', __FILE__)
|
3
|
-
|
4
|
-
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Jarmo Pertman"]
|
6
|
-
gem.email = ["jarmo.p@gmail.com"]
|
7
|
-
gem.description = %q{Use Watir with RSpec with ease.}
|
8
|
-
gem.summary = %q{Use Watir with RSpec with ease.}
|
9
|
-
gem.homepage = "http://github.com/watir/watir-rspec"
|
10
|
-
|
11
|
-
gem.files = `git ls-files`.split($\)
|
12
|
-
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
-
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
-
gem.name = "watir-rspec"
|
15
|
-
gem.require_paths = ["lib"]
|
16
|
-
gem.version = Watir::RSpec::VERSION
|
17
|
-
|
18
|
-
gem.add_dependency "rspec", "~>2.0"
|
19
|
-
|
20
|
-
gem.add_development_dependency "yard"
|
21
|
-
gem.add_development_dependency "rake"
|
22
|
-
gem.add_development_dependency "redcarpet"
|
23
|
-
end
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/watir/rspec/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Jarmo Pertman"]
|
6
|
+
gem.email = ["jarmo.p@gmail.com"]
|
7
|
+
gem.description = %q{Use Watir with RSpec with ease.}
|
8
|
+
gem.summary = %q{Use Watir with RSpec with ease.}
|
9
|
+
gem.homepage = "http://github.com/watir/watir-rspec"
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "watir-rspec"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Watir::RSpec::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency "rspec", "~>2.0"
|
19
|
+
|
20
|
+
gem.add_development_dependency "yard"
|
21
|
+
gem.add_development_dependency "rake"
|
22
|
+
gem.add_development_dependency "redcarpet"
|
23
|
+
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watir-rspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Jarmo Pertman
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-09-21 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,93 +27,103 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: yard
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rake
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: redcarpet
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
description: Use Watir with RSpec with ease.
|
79
70
|
email:
|
80
71
|
- jarmo.p@gmail.com
|
81
|
-
executables:
|
72
|
+
executables:
|
73
|
+
- watir-rspec
|
82
74
|
extensions: []
|
83
75
|
extra_rdoc_files: []
|
84
76
|
files:
|
85
77
|
- .gitignore
|
78
|
+
- .travis.yml
|
86
79
|
- .yardopts
|
80
|
+
- CHANGES
|
87
81
|
- Gemfile
|
88
82
|
- LICENSE
|
89
83
|
- README.md
|
90
84
|
- Rakefile
|
85
|
+
- bin/watir-rspec
|
91
86
|
- lib/watir/rspec.rb
|
92
87
|
- lib/watir/rspec/active_record_shared_connection.rb
|
88
|
+
- lib/watir/rspec/cli.rb
|
93
89
|
- lib/watir/rspec/helper.rb
|
94
90
|
- lib/watir/rspec/html_formatter.rb
|
91
|
+
- lib/watir/rspec/matchers.rb
|
92
|
+
- lib/watir/rspec/matchers/base_matcher.rb
|
95
93
|
- lib/watir/rspec/version.rb
|
94
|
+
- spec/spec_helper.rb
|
95
|
+
- spec/watir/rspec/active_record_shared_connection_spec.rb
|
96
|
+
- spec/watir/rspec/helper_spec.rb
|
97
|
+
- spec/watir/rspec/matchers/base_matcher_spec.rb
|
98
|
+
- spec/watir/rspec/matchers_spec.rb
|
96
99
|
- watir-rspec.gemspec
|
97
100
|
homepage: http://github.com/watir/watir-rspec
|
98
101
|
licenses: []
|
102
|
+
metadata: {}
|
99
103
|
post_install_message:
|
100
104
|
rdoc_options: []
|
101
105
|
require_paths:
|
102
106
|
- lib
|
103
107
|
required_ruby_version: !ruby/object:Gem::Requirement
|
104
|
-
none: false
|
105
108
|
requirements:
|
106
|
-
- -
|
109
|
+
- - '>='
|
107
110
|
- !ruby/object:Gem::Version
|
108
111
|
version: '0'
|
109
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
-
none: false
|
111
113
|
requirements:
|
112
|
-
- -
|
114
|
+
- - '>='
|
113
115
|
- !ruby/object:Gem::Version
|
114
116
|
version: '0'
|
115
117
|
requirements: []
|
116
118
|
rubyforge_project:
|
117
|
-
rubygems_version:
|
119
|
+
rubygems_version: 2.0.7
|
118
120
|
signing_key:
|
119
|
-
specification_version:
|
121
|
+
specification_version: 4
|
120
122
|
summary: Use Watir with RSpec with ease.
|
121
|
-
test_files:
|
123
|
+
test_files:
|
124
|
+
- spec/spec_helper.rb
|
125
|
+
- spec/watir/rspec/active_record_shared_connection_spec.rb
|
126
|
+
- spec/watir/rspec/helper_spec.rb
|
127
|
+
- spec/watir/rspec/matchers/base_matcher_spec.rb
|
128
|
+
- spec/watir/rspec/matchers_spec.rb
|
122
129
|
has_rdoc:
|