watir-rspec 0.0.3 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
+
[](http://badge.fury.io/rb/watir-rspec)
|
3
|
+
[](http://travis-ci.org/watir/watir-rspec)
|
4
|
+
[](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:
|