wrapybara 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE.txt +20 -0
- data/README.rdoc +19 -0
- data/lib/wrapybara.rb +2 -0
- data/lib/wrapybara/element.rb +150 -0
- data/lib/wrapybara/elements/attribute.rb +32 -0
- data/lib/wrapybara/elements/button.rb +27 -0
- data/lib/wrapybara/elements/checkbox.rb +49 -0
- data/lib/wrapybara/elements/content.rb +33 -0
- data/lib/wrapybara/elements/file_field.rb +27 -0
- data/lib/wrapybara/elements/fillable_field.rb +46 -0
- data/lib/wrapybara/elements/form.rb +21 -0
- data/lib/wrapybara/elements/image.rb +23 -0
- data/lib/wrapybara/elements/label.rb +21 -0
- data/lib/wrapybara/elements/link.rb +29 -0
- data/lib/wrapybara/elements/option.rb +48 -0
- data/lib/wrapybara/elements/password_field.rb +22 -0
- data/lib/wrapybara/elements/radio_button.rb +49 -0
- data/lib/wrapybara/elements/select.rb +67 -0
- data/lib/wrapybara/elements/table.rb +51 -0
- data/lib/wrapybara/elements/table_body.rb +40 -0
- data/lib/wrapybara/elements/table_cell.rb +87 -0
- data/lib/wrapybara/elements/table_head.rb +40 -0
- data/lib/wrapybara/elements/text_area.rb +22 -0
- data/lib/wrapybara/elements/text_field.rb +22 -0
- data/lib/wrapybara/ext/focus_tracking.js +68 -0
- data/lib/wrapybara/ext/focus_tracking.rb +45 -0
- data/lib/wrapybara/methods.rb +57 -0
- data/lib/wrapybara/steps.rb +139 -0
- metadata +92 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
module Wrapybara
|
2
|
+
class TextArea
|
3
|
+
include Element
|
4
|
+
include FillableField
|
5
|
+
|
6
|
+
def initialize(identifier, scope = default_scope, how = default_how)
|
7
|
+
@identifier = identifier
|
8
|
+
@how = how
|
9
|
+
@scope = scope
|
10
|
+
xpath = XPath::HTML.send(:locate_field, XPath.descendant(:textarea), identifier)
|
11
|
+
@element = get_element(xpath, scope)
|
12
|
+
end
|
13
|
+
|
14
|
+
def should_exist
|
15
|
+
super "Expected a text area #{self.element_identifier} to exist"
|
16
|
+
end
|
17
|
+
|
18
|
+
def should_not_exist
|
19
|
+
super "Did not expect a text area #{self.element_identifier}' to exist"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Wrapybara
|
2
|
+
class TextField
|
3
|
+
include Element
|
4
|
+
include FillableField
|
5
|
+
|
6
|
+
def initialize(identifier, scope = default_scope, how = default_how)
|
7
|
+
@identifier = identifier
|
8
|
+
@how = how
|
9
|
+
@scope = scope
|
10
|
+
xpath = XPath::HTML.send(:locate_field, XPath.descendant(:input)[XPath.attr(:type).equals('text')], identifier)
|
11
|
+
@element = get_element(xpath, scope)
|
12
|
+
end
|
13
|
+
|
14
|
+
def should_exist
|
15
|
+
super "Expected a text field #{self.element_identifier} to exist"
|
16
|
+
end
|
17
|
+
|
18
|
+
def should_not_exist
|
19
|
+
super "Did not expect a text field #{self.element_identifier}' to exist"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
/*
|
2
|
+
This script facilitates tracking whether or not an element has focus. It is not an ideal solution,
|
3
|
+
but it does work across browsers and test environments. The need for such a solution was prompted
|
4
|
+
by HtmlUnit not supporting document.activeElement, which all major browsers now support. HtmlUnit
|
5
|
+
being the underlying technology used by Akephalos (in Cucumber via Capybara), this was a problem.
|
6
|
+
|
7
|
+
Focus Tracking can be used by calling FocusTracking.initialize once the dom is loaded and then by
|
8
|
+
calling $(element_id).has_focus().
|
9
|
+
|
10
|
+
This script is currently dependent on Prototype, but could be easily adapted for any JavaScript library.
|
11
|
+
*/
|
12
|
+
|
13
|
+
var FocusTracking = {};
|
14
|
+
|
15
|
+
FocusTracking.attribute = 'has-focus';
|
16
|
+
FocusTracking.auto_focus_class_name = 'auto-focus';
|
17
|
+
|
18
|
+
FocusTracking.focusable_elements = function ()
|
19
|
+
{
|
20
|
+
return $$('input[type=text], input[type=password], input[type=submit], input[type=button], input[type=checkbox], input[type=radio], textarea, button, select');
|
21
|
+
}
|
22
|
+
|
23
|
+
FocusTracking.initialize = function ()
|
24
|
+
{
|
25
|
+
var elements = FocusTracking.focusable_elements();
|
26
|
+
elements.each(
|
27
|
+
function (element)
|
28
|
+
{
|
29
|
+
if (element.readAttribute(FocusTracking.attribute) == null)
|
30
|
+
{
|
31
|
+
// if the element already has the focus tracking pieces, leave it alone...only initialize it if
|
32
|
+
// it isn't there so we don't miss saving some changes.
|
33
|
+
Object.extend(element, FocusTracking.Element);
|
34
|
+
element.writeAttribute(FocusTracking.attribute, 'false');
|
35
|
+
element.observe('focus', element.got_focus);
|
36
|
+
element.observe('blur', element.lost_focus);
|
37
|
+
}
|
38
|
+
}
|
39
|
+
);
|
40
|
+
}
|
41
|
+
|
42
|
+
FocusTracking.auto_focus = function (class_name)
|
43
|
+
{
|
44
|
+
class_name = class_name == undefined || class_name == null ? FocusTracking.auto_focus_class_name : class_name;
|
45
|
+
var elements = $$('.' + class_name);
|
46
|
+
if (elements.length > 0)
|
47
|
+
{
|
48
|
+
element = elements.first();
|
49
|
+
element.activate();
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
FocusTracking.Element = {};
|
54
|
+
|
55
|
+
FocusTracking.Element.has_focus = function ()
|
56
|
+
{
|
57
|
+
return this.readAttribute(FocusTracking.attribute) == 'true';
|
58
|
+
}
|
59
|
+
|
60
|
+
FocusTracking.Element.got_focus = function ()
|
61
|
+
{
|
62
|
+
this.writeAttribute(FocusTracking.attribute, 'true');
|
63
|
+
}
|
64
|
+
|
65
|
+
FocusTracking.Element.lost_focus = function ()
|
66
|
+
{
|
67
|
+
this.writeAttribute(FocusTracking.attribute, 'false');
|
68
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# This module is, admittedly, something of a hack. In order to reliably (across browsers and testing libraries) test for
|
2
|
+
# an element having focus, I resorted to adding some JavaScript event handling to read/write an attribute on focus/blur.
|
3
|
+
# Not pretty, but HtmlUnit, which Akephalos uses, did not recognize document.activeElement, so I had to roll my own
|
4
|
+
# solution. To make it easier for you to use this module, the corresponding JavaScript is included in focus_tracking.js.
|
5
|
+
# See it for usage notes.
|
6
|
+
|
7
|
+
# To use Wrapybara's focus handling capabilities, require wrapybara/ext/focus_handling in some file that gets loaded (I use
|
8
|
+
# support/extras.rb so I don't pollute env.rb) and then optionally set Wrapybara.focus_attribute to whatever the element
|
9
|
+
# attribute will be. As you can see below, Wrapybara checks the value of the attribute against what you say it should be
|
10
|
+
# when the element has focus.
|
11
|
+
|
12
|
+
module Wrapybara
|
13
|
+
def self.focus_attribute=(attribute)
|
14
|
+
@focus_attribute = attribute
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.focus_attribute
|
18
|
+
@focus_attribute || 'has-focus'
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.focus_value=(value)
|
22
|
+
@focus_value = value
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.focus_value
|
26
|
+
@focus_value || 'true'
|
27
|
+
end
|
28
|
+
|
29
|
+
module Element
|
30
|
+
def focused?
|
31
|
+
self.should_exist
|
32
|
+
element[Wrapybara.focus_attribute] == Wrapybara.focus_value
|
33
|
+
end
|
34
|
+
|
35
|
+
def should_be_focused
|
36
|
+
message = "Expected element #{self.element_identifier} to be focused"
|
37
|
+
raise UnmetExpectation, message unless self.focused?
|
38
|
+
end
|
39
|
+
|
40
|
+
def should_not_be_focused
|
41
|
+
message = "Did not expect element #{self.element_identifier} to be focused"
|
42
|
+
raise UnmetExpectation, message if self.focused?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# add this directory to the load path if it's not already included
|
2
|
+
this_dir = File.expand_path(File.dirname(__FILE__))
|
3
|
+
$: << this_dir unless $:.include?(this_dir)
|
4
|
+
|
5
|
+
module Wrapybara
|
6
|
+
class UnmetExpectation < Exception; end
|
7
|
+
|
8
|
+
def host
|
9
|
+
Capybara.app_host
|
10
|
+
end
|
11
|
+
|
12
|
+
def current_path
|
13
|
+
Capybara.current_path
|
14
|
+
end
|
15
|
+
|
16
|
+
def current_url
|
17
|
+
Capybara.current_url
|
18
|
+
end
|
19
|
+
|
20
|
+
def current_path_is?(path)
|
21
|
+
path = path.gsub('/', '\/').gsub('?', '\?')
|
22
|
+
(current_url || current_path) =~ /#{path}/
|
23
|
+
end
|
24
|
+
|
25
|
+
def current_path_should_be(path)
|
26
|
+
raise UnmetExpectation, "Expected the current path to be '#{path}'" unless current_path_is?(path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def current_path_should_not_be(path)
|
30
|
+
raise UnmetExpectation, "Did not expect the current path to be '#{path}'" if current_path_is?(path)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
require 'xpath'
|
35
|
+
require 'element'
|
36
|
+
require 'elements/attribute'
|
37
|
+
require 'elements/button'
|
38
|
+
require 'elements/checkbox'
|
39
|
+
require 'elements/content'
|
40
|
+
require 'elements/form'
|
41
|
+
require 'elements/image'
|
42
|
+
require 'elements/label'
|
43
|
+
require 'elements/link'
|
44
|
+
require 'elements/file_field'
|
45
|
+
require 'elements/fillable_field'
|
46
|
+
require 'elements/option'
|
47
|
+
require 'elements/password_field'
|
48
|
+
require 'elements/radio_button'
|
49
|
+
require 'elements/select'
|
50
|
+
require 'elements/table'
|
51
|
+
require 'elements/table_body'
|
52
|
+
require 'elements/table_cell'
|
53
|
+
require 'elements/table_head'
|
54
|
+
require 'elements/text_area'
|
55
|
+
require 'elements/text_field'
|
56
|
+
|
57
|
+
World(Wrapybara)
|
@@ -0,0 +1,139 @@
|
|
1
|
+
Given /^(?:I )?debug$/ do
|
2
|
+
require 'ruby-debug'
|
3
|
+
debugger
|
4
|
+
puts "\n\nDEBUGGER\n\n"
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^(?:I )?reload(?: the page)?$/ do
|
8
|
+
visit current_path
|
9
|
+
end
|
10
|
+
|
11
|
+
Given /^(?:I )?display "([^"]+)"$/ do |something|
|
12
|
+
puts "\n\n#{something}\n\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
Given /^(?:I )?wait(?: (?:for )?(\d+) seconds)?$/ do |seconds|
|
16
|
+
seconds ||= '2'
|
17
|
+
sleep(seconds.to_i)
|
18
|
+
end
|
19
|
+
|
20
|
+
Given /^there (should|should not) be a[n]? (.+) (labeled|identified by|for|titled) "([^"]+)"(?: (?:in|within) "([^"]+)")?$/ do |expectation, element, how, identifier, scope|
|
21
|
+
element.gsub!(' ', '_')
|
22
|
+
expectation.gsub!(' ', '_')
|
23
|
+
"Wrapybara::#{element.camelize}".constantize.new(identifier, scope, how).send("#{expectation}_exist")
|
24
|
+
end
|
25
|
+
|
26
|
+
Given /^the table (labeled|identified by) "([^"]+)"(?: (?:in|within) "([^"]+)")? (should|should not) have column[s]?(?: "([^"]+)")?$/ do |how, identifier, scope, expectation, column, table|
|
27
|
+
columns = column ? [column] : (table.hashes.collect { |row| row['label'] || '' })
|
28
|
+
Wrapybara::Table.new(identifier, scope, how).send("#{expectation}_have_columns", columns)
|
29
|
+
end
|
30
|
+
|
31
|
+
Given /^the select (labeled|identified by) "([^"]+)"(?: (?:in|within) "([^"]+)")? (should|should not) have option[s]?(?: "([^"]+)")?(?: (selected))?$/ do |how, identifier, scope, expectation, option, selected, table|
|
32
|
+
options = option ? [option] : (table.hashes.collect { |row| row['label'] || '' })
|
33
|
+
expectation.gsub!(' ', '_')
|
34
|
+
if selected
|
35
|
+
options.each do |option|
|
36
|
+
Wrapybara::Select.new(identifier, scope, how).option(option).send("#{expectation}_be_selected")
|
37
|
+
end
|
38
|
+
else
|
39
|
+
Wrapybara::Select.new(identifier, scope, how).send("#{expectation}_have_options", options)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# In this step, the label capture must use an * to accept empty strings, ie, selecting the blank option typically at the top of the options
|
44
|
+
Given /^(?:I )?(choose|select|deselect) "([^"]*)" from the select (labeled|identified by) "([^"]+)"?(?: (?:in|within) "([^"]+)")?$/ do |action, option, how, identifier, scope|
|
45
|
+
Wrapybara::Select.new(identifier, scope, how).send(action.to_sym, option)
|
46
|
+
end
|
47
|
+
|
48
|
+
Given /^the select (labeled|identified by) "([^"]+)"?(?: (?:in|within) "([^"]+)")? (should|should not) have "([^"]*)" selected$/ do |how, identifier, scope, expectation, option|
|
49
|
+
expectation.gsub!(' ', '_')
|
50
|
+
Wrapybara::Select.new(identifier, scope, how).option(option).send("#{expectation}_be_selected")
|
51
|
+
end
|
52
|
+
|
53
|
+
Given /^the (.+) (labeled|identified by|titled) "([^"]+)"(?: (?:in|within) "([^"]+)")? (should|should not) be (.+)$/ do |element, how, identifier, scope, expectation, state|
|
54
|
+
element.gsub!(' ', '_')
|
55
|
+
expectation.gsub!(' ', '_')
|
56
|
+
"Wrapybara::#{element.camelize}".constantize.new(identifier, scope, how).send("#{expectation}_be_#{state}")
|
57
|
+
end
|
58
|
+
|
59
|
+
Given /^the (.+) (labeled|identified by|titled) "([^"]+)"(?: (?:in|within) "([^"]+)")? (should|should not) have attribute "([^"]+)" with value "([^"]+)"$/ do |element, how, identifier, scope, expectation, attribute, value|
|
60
|
+
element.gsub!(' ', '_')
|
61
|
+
expectation.gsub!(' ', '_')
|
62
|
+
"Wrapybara::#{element.camelize}".constantize.new(identifier, scope, how).send("#{expectation}_have_attribute", attribute, value)
|
63
|
+
end
|
64
|
+
|
65
|
+
Given /^(?:I )?(check|uncheck) the (checkbox|radio button) (labeled|identified by) "([^"]+)"(?: (?:in|within) "([^"]+)")?$/ do |action, element, how, identifier, scope|
|
66
|
+
element.gsub!(' ', '_')
|
67
|
+
"Wrapybara::#{element.camelize}".constantize.new(identifier, scope, how).send(action)
|
68
|
+
end
|
69
|
+
|
70
|
+
# In this step, the label capture must use an * to accept empty strings, so we can clear the field
|
71
|
+
Given /^(?:I )?fill in the (text field|password field|text area) (labeled|identified by) "([^"]+)"(?: (?:in|within) "([^"]+)")? with "([^"]*)"$/ do |element, how, identifier, scope, content|
|
72
|
+
content ||= ''
|
73
|
+
element.gsub!(' ', '_')
|
74
|
+
"Wrapybara::#{element.camelize}".constantize.new(identifier, scope, how).fill_in(content)
|
75
|
+
end
|
76
|
+
|
77
|
+
Given /^(?:I )?click the (button|link) (labeled|identified by|titled) "([^"]+)"(?: (?:in|within) "([^"]+)")?$/ do |element, how, identifier, scope|
|
78
|
+
"Wrapybara::#{element.capitalize}".constantize.new(identifier, scope, how).click
|
79
|
+
end
|
80
|
+
|
81
|
+
# for finding unlabeled links
|
82
|
+
Given /^there (should|should not) be a link to "([^"]+)"(?: (?:in|within) "([^"]+)")?$/ do |expectation, destination, scope|
|
83
|
+
expectation.gsub!(' ', '_')
|
84
|
+
Wrapybara::Link.new(destination, scope, 'to').send("#{expectation}_exist")
|
85
|
+
end
|
86
|
+
|
87
|
+
Given /^there (should|should not) be a link to the "([^"]+)" page(?: (?:in|within) "([^"]+)")?$/ do |expectation, destination, scope|
|
88
|
+
expectation.gsub!(' ', '_')
|
89
|
+
destination = path_to(destination)
|
90
|
+
Wrapybara::Link.new(destination, scope, 'to').send("#{expectation}_exist")
|
91
|
+
end
|
92
|
+
|
93
|
+
# for clicking unlabeled links
|
94
|
+
Given /^(?:I )?click the link to the "([^"]+)" page(?: (?:in|within) "([^"]+)")?$/ do |destination, scope|
|
95
|
+
destination = path_to(destination)
|
96
|
+
Wrapybara::Link.new(destination, scope, 'to').click
|
97
|
+
end
|
98
|
+
|
99
|
+
# for clicking table column headers (as in sortable columns)
|
100
|
+
Given /^(?:I )?click column "([^"]+)" of the table (labeled|identified by) "([^"]+)"(?: (?:in|within) "([^"]+)")?$/ do |column, how, table, scope|
|
101
|
+
Wrapybara::Table.new(table, scope, how).click_column(column)
|
102
|
+
end
|
103
|
+
|
104
|
+
# content
|
105
|
+
Given /^(?:I )?(should|should not) see "([^"]+)"(?: within "([^"]+)")?$/ do |expectation, content, scope|
|
106
|
+
expectation.gsub!(' ', '_')
|
107
|
+
Wrapybara::Content.new(content, scope).send("#{expectation}_exist")
|
108
|
+
end
|
109
|
+
|
110
|
+
Given /^"([^"]+)"(?: within "([^"]+)")? (should|should not) be visible$/ do |content, scope, expectation|
|
111
|
+
expectation.gsub!(' ', '_')
|
112
|
+
Wrapybara::Content.new(content, scope).send("#{expectation}_be_visible")
|
113
|
+
end
|
114
|
+
|
115
|
+
# for clicking things like headers that have expandable detail below them
|
116
|
+
Given /^I click the text "([^"]+)"(?: within "([^"]+)")?$/ do |content, scope|
|
117
|
+
Wrapybara::Content.new(content, scope).click
|
118
|
+
end
|
119
|
+
|
120
|
+
# fillable fields (text field, password field, text area)
|
121
|
+
Given /^the (.+) (labeled|identified by) "([^"]+)"(?: (?:in|within) "([^"]+)")? (should|should not) have content "([^"]+)"$/ do |element, how, identifier, scope, expectation, content|
|
122
|
+
element.gsub!(' ', '_')
|
123
|
+
expectation.gsub!(' ', '_')
|
124
|
+
"Wrapybara::#{element.camelize}".constantize.new(identifier, scope, how).send("#{expectation}_have_content", content)
|
125
|
+
end
|
126
|
+
|
127
|
+
# table content
|
128
|
+
Given /^(head|body)?\s?row (\d+) column (\d+) of the table (labeled|identified by) "([^"]+)"(?: (?:in|within) "([^"]+)")? (should|should not) have content "([^"]+)"$/ do |element, row, column, how, identifier, scope, expectation, content|
|
129
|
+
element ||= 'body'
|
130
|
+
expectation.gsub!(' ', '_')
|
131
|
+
Wrapybara::Table.new(identifier, scope, how).send(element).cell(row, column).send("#{expectation}_have_content", content)
|
132
|
+
end
|
133
|
+
|
134
|
+
# other elements in table cells
|
135
|
+
Given /^(head|body)?\s?row (\d+) column (\d+) of the table (labeled|identified by) "([^"]+)"(?: (?:in|within) "([^"]+)")? (should|should not) contain a[n]? (.+) (labeled|identified by) "([^"]+)"$/ do |element, row, column, how, identifier, scope, expectation, child_element, child_how, child_identifier|
|
136
|
+
element ||= 'body'
|
137
|
+
expectation.gsub!(' ', '_')
|
138
|
+
Wrapybara::Table.new(identifier, scope, how).send(element).cell(row, column).send("#{expectation}_contain", child_element, child_identifier, child_how)
|
139
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wrapybara
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Phillip Koebbe
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2011-05-20 00:00:00 -05:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: Wrapybara creates objects that are based on Capybara.
|
22
|
+
email: phillipkoebbe@gmail.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- LICENSE.txt
|
29
|
+
- README.rdoc
|
30
|
+
files:
|
31
|
+
- lib/wrapybara.rb
|
32
|
+
- lib/wrapybara/element.rb
|
33
|
+
- lib/wrapybara/elements/attribute.rb
|
34
|
+
- lib/wrapybara/elements/button.rb
|
35
|
+
- lib/wrapybara/elements/checkbox.rb
|
36
|
+
- lib/wrapybara/elements/content.rb
|
37
|
+
- lib/wrapybara/elements/file_field.rb
|
38
|
+
- lib/wrapybara/elements/fillable_field.rb
|
39
|
+
- lib/wrapybara/elements/form.rb
|
40
|
+
- lib/wrapybara/elements/image.rb
|
41
|
+
- lib/wrapybara/elements/label.rb
|
42
|
+
- lib/wrapybara/elements/link.rb
|
43
|
+
- lib/wrapybara/elements/option.rb
|
44
|
+
- lib/wrapybara/elements/password_field.rb
|
45
|
+
- lib/wrapybara/elements/radio_button.rb
|
46
|
+
- lib/wrapybara/elements/select.rb
|
47
|
+
- lib/wrapybara/elements/table.rb
|
48
|
+
- lib/wrapybara/elements/table_body.rb
|
49
|
+
- lib/wrapybara/elements/table_cell.rb
|
50
|
+
- lib/wrapybara/elements/table_head.rb
|
51
|
+
- lib/wrapybara/elements/text_area.rb
|
52
|
+
- lib/wrapybara/elements/text_field.rb
|
53
|
+
- lib/wrapybara/ext/focus_tracking.js
|
54
|
+
- lib/wrapybara/ext/focus_tracking.rb
|
55
|
+
- lib/wrapybara/methods.rb
|
56
|
+
- lib/wrapybara/steps.rb
|
57
|
+
- LICENSE.txt
|
58
|
+
- README.rdoc
|
59
|
+
has_rdoc: true
|
60
|
+
homepage: http://github.com/phillipkoebbe/wrapybara
|
61
|
+
licenses:
|
62
|
+
- MIT
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options: []
|
65
|
+
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
segments:
|
82
|
+
- 0
|
83
|
+
version: "0"
|
84
|
+
requirements: []
|
85
|
+
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 1.3.7
|
88
|
+
signing_key:
|
89
|
+
specification_version: 3
|
90
|
+
summary: An object wrapper around Capybara.
|
91
|
+
test_files: []
|
92
|
+
|