bbc-capybara 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +325 -0
- data/License.txt +22 -0
- data/README.md +815 -0
- data/lib/capybara.rb +368 -0
- data/lib/capybara/cucumber.rb +25 -0
- data/lib/capybara/driver/base.rb +64 -0
- data/lib/capybara/driver/node.rb +74 -0
- data/lib/capybara/dsl.rb +50 -0
- data/lib/capybara/node/actions.rb +146 -0
- data/lib/capybara/node/base.rb +63 -0
- data/lib/capybara/node/document.rb +25 -0
- data/lib/capybara/node/element.rb +201 -0
- data/lib/capybara/node/finders.rb +154 -0
- data/lib/capybara/node/matchers.rb +442 -0
- data/lib/capybara/node/simple.rb +132 -0
- data/lib/capybara/query.rb +63 -0
- data/lib/capybara/rack_test/browser.rb +126 -0
- data/lib/capybara/rack_test/driver.rb +80 -0
- data/lib/capybara/rack_test/form.rb +80 -0
- data/lib/capybara/rack_test/node.rb +121 -0
- data/lib/capybara/rails.rb +17 -0
- data/lib/capybara/rspec.rb +26 -0
- data/lib/capybara/rspec/features.rb +22 -0
- data/lib/capybara/rspec/matchers.rb +152 -0
- data/lib/capybara/selector.rb +156 -0
- data/lib/capybara/selenium/driver.rb +169 -0
- data/lib/capybara/selenium/node.rb +91 -0
- data/lib/capybara/server.rb +87 -0
- data/lib/capybara/session.rb +322 -0
- data/lib/capybara/spec/driver.rb +329 -0
- data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
- data/lib/capybara/spec/fixtures/test_file.txt +1 -0
- data/lib/capybara/spec/public/jquery-ui.js +791 -0
- data/lib/capybara/spec/public/jquery.js +9046 -0
- data/lib/capybara/spec/public/test.js +43 -0
- data/lib/capybara/spec/session.rb +148 -0
- data/lib/capybara/spec/session/all_spec.rb +78 -0
- data/lib/capybara/spec/session/attach_file_spec.rb +76 -0
- data/lib/capybara/spec/session/check_spec.rb +68 -0
- data/lib/capybara/spec/session/choose_spec.rb +29 -0
- data/lib/capybara/spec/session/click_button_spec.rb +305 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +37 -0
- data/lib/capybara/spec/session/click_link_spec.rb +120 -0
- data/lib/capybara/spec/session/current_url_spec.rb +83 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +127 -0
- data/lib/capybara/spec/session/find_button_spec.rb +18 -0
- data/lib/capybara/spec/session/find_by_id_spec.rb +18 -0
- data/lib/capybara/spec/session/find_field_spec.rb +26 -0
- data/lib/capybara/spec/session/find_link_spec.rb +19 -0
- data/lib/capybara/spec/session/find_spec.rb +168 -0
- data/lib/capybara/spec/session/first_spec.rb +105 -0
- data/lib/capybara/spec/session/has_button_spec.rb +32 -0
- data/lib/capybara/spec/session/has_css_spec.rb +243 -0
- data/lib/capybara/spec/session/has_field_spec.rb +192 -0
- data/lib/capybara/spec/session/has_link_spec.rb +37 -0
- data/lib/capybara/spec/session/has_select_spec.rb +129 -0
- data/lib/capybara/spec/session/has_selector_spec.rb +129 -0
- data/lib/capybara/spec/session/has_table_spec.rb +34 -0
- data/lib/capybara/spec/session/has_text_spec.rb +138 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +123 -0
- data/lib/capybara/spec/session/headers.rb +19 -0
- data/lib/capybara/spec/session/javascript.rb +312 -0
- data/lib/capybara/spec/session/response_code.rb +19 -0
- data/lib/capybara/spec/session/select_spec.rb +119 -0
- data/lib/capybara/spec/session/text_spec.rb +24 -0
- data/lib/capybara/spec/session/uncheck_spec.rb +21 -0
- data/lib/capybara/spec/session/unselect_spec.rb +67 -0
- data/lib/capybara/spec/session/within_spec.rb +178 -0
- data/lib/capybara/spec/test_app.rb +156 -0
- data/lib/capybara/spec/views/buttons.erb +4 -0
- data/lib/capybara/spec/views/fieldsets.erb +29 -0
- data/lib/capybara/spec/views/form.erb +366 -0
- data/lib/capybara/spec/views/frame_one.erb +8 -0
- data/lib/capybara/spec/views/frame_two.erb +8 -0
- data/lib/capybara/spec/views/header_links.erb +7 -0
- data/lib/capybara/spec/views/host_links.erb +12 -0
- data/lib/capybara/spec/views/popup_one.erb +8 -0
- data/lib/capybara/spec/views/popup_two.erb +8 -0
- data/lib/capybara/spec/views/postback.erb +13 -0
- data/lib/capybara/spec/views/tables.erb +62 -0
- data/lib/capybara/spec/views/with_html.erb +75 -0
- data/lib/capybara/spec/views/with_html_entities.erb +1 -0
- data/lib/capybara/spec/views/with_js.erb +53 -0
- data/lib/capybara/spec/views/with_scope.erb +36 -0
- data/lib/capybara/spec/views/with_simple_html.erb +1 -0
- data/lib/capybara/spec/views/within_frames.erb +10 -0
- data/lib/capybara/spec/views/within_popups.erb +25 -0
- data/lib/capybara/util/save_and_open_page.rb +45 -0
- data/lib/capybara/util/timeout.rb +27 -0
- data/lib/capybara/version.rb +3 -0
- data/spec/basic_node_spec.rb +89 -0
- data/spec/capybara_spec.rb +46 -0
- data/spec/driver/rack_test_driver_spec.rb +90 -0
- data/spec/driver/selenium_driver_spec.rb +55 -0
- data/spec/dsl_spec.rb +255 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +8 -0
- data/spec/fixtures/selenium_driver_rspec_success.rb +8 -0
- data/spec/rspec/features_spec.rb +43 -0
- data/spec/rspec/matchers_spec.rb +564 -0
- data/spec/rspec_spec.rb +51 -0
- data/spec/save_and_open_page_spec.rb +155 -0
- data/spec/server_spec.rb +74 -0
- data/spec/session/rack_test_session_spec.rb +61 -0
- data/spec/session/selenium_session_spec.rb +26 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/timeout_spec.rb +28 -0
- metadata +297 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<form action="/form" method="post">
|
|
2
|
+
<table id="agent_table">
|
|
3
|
+
<caption>Agent</caption>
|
|
4
|
+
|
|
5
|
+
<tr>
|
|
6
|
+
<td>
|
|
7
|
+
<label for="form_agent_name">Name</label>
|
|
8
|
+
</td>
|
|
9
|
+
<td>
|
|
10
|
+
<input type="text" name="form[agent_name]" value="James" id="form_agent_name"/>
|
|
11
|
+
</td>
|
|
12
|
+
</tr>
|
|
13
|
+
|
|
14
|
+
<tr>
|
|
15
|
+
<td colspan="2">
|
|
16
|
+
<input type="submit" value="Create"/>
|
|
17
|
+
</td>
|
|
18
|
+
</tr>
|
|
19
|
+
</table>
|
|
20
|
+
</form>
|
|
21
|
+
|
|
22
|
+
<form action="/form" method="post">
|
|
23
|
+
<table id="girl_table">
|
|
24
|
+
<caption>Girl</caption>
|
|
25
|
+
|
|
26
|
+
<tr>
|
|
27
|
+
<td>
|
|
28
|
+
<label for="form_girl_name">Name</label>
|
|
29
|
+
</td>
|
|
30
|
+
<td>
|
|
31
|
+
<input type="text" name="form[girl_name]" value="Vesper" id="form_girl_name"/>
|
|
32
|
+
</td>
|
|
33
|
+
</tr>
|
|
34
|
+
|
|
35
|
+
<tr>
|
|
36
|
+
<td colspan="2">
|
|
37
|
+
<input type="submit" value="Create"/>
|
|
38
|
+
</td>
|
|
39
|
+
</tr>
|
|
40
|
+
</table>
|
|
41
|
+
</form>
|
|
42
|
+
|
|
43
|
+
<form action="/form" method="post">
|
|
44
|
+
<table id="villain_table">
|
|
45
|
+
<caption>Villain</caption>
|
|
46
|
+
|
|
47
|
+
<tr>
|
|
48
|
+
<td>
|
|
49
|
+
<label for="form_villain_name">Name</label>
|
|
50
|
+
</td>
|
|
51
|
+
<td>
|
|
52
|
+
<input type="text" name="form[villain_name]" value="Ernst" id="form_villain_name"/>
|
|
53
|
+
</td>
|
|
54
|
+
</tr>
|
|
55
|
+
|
|
56
|
+
<tr>
|
|
57
|
+
<td colspan="2">
|
|
58
|
+
<input type="submit" value="Create"/>
|
|
59
|
+
</td>
|
|
60
|
+
</tr>
|
|
61
|
+
</table>
|
|
62
|
+
</form>
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<h1>This is a test</h1>
|
|
2
|
+
|
|
3
|
+
<h2 class="no text"></h2>
|
|
4
|
+
<h2 class="no text"></h2>
|
|
5
|
+
<h2 class="head" id="h2one">Header Class Test One</h2>
|
|
6
|
+
<h2 class="head" id="h2two">Header Class Test Two</h2>
|
|
7
|
+
<h2 class="head">Header Class Test Three</h2>
|
|
8
|
+
<h2 class="head">Header Class Test Four</h2>
|
|
9
|
+
<h2 class="head">Header Class Test Five</h2>
|
|
10
|
+
|
|
11
|
+
<p class="para" id="first">
|
|
12
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
|
|
13
|
+
tempor incididunt ut <a href="/with_simple_html" title="awesome title" class="simple">labore</a>
|
|
14
|
+
et dolore magna aliqua. Ut enim ad minim veniam,
|
|
15
|
+
quis nostrud exercitation <a href="/foo" id="foo">ullamco</a> laboris nisi
|
|
16
|
+
ut aliquip ex ea commodo consequat.
|
|
17
|
+
<a href="/with_simple_html"><img width="20" height="20" alt="awesome image" /></a>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p class="para" id="second">
|
|
21
|
+
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
|
|
22
|
+
dolore eu fugiat <a href="/redirect" id="red">Redirect</a> pariatur. Excepteur sint occaecat cupidatat non proident,
|
|
23
|
+
sunt in culpa qui officia
|
|
24
|
+
text with
|
|
25
|
+
whitespace
|
|
26
|
+
id est laborum.
|
|
27
|
+
</p>
|
|
28
|
+
|
|
29
|
+
<p>
|
|
30
|
+
<input type="text" id="test_field" value="monkey"/>
|
|
31
|
+
<textarea>banana</textarea>
|
|
32
|
+
<a href="/redirect_back">BackToMyself</a>
|
|
33
|
+
<a title="twas a fine link" href="/redirect">A link came first</a>
|
|
34
|
+
<a title="a fine link" href="/with_simple_html">A link</a>
|
|
35
|
+
<a title="a fine link with data method" data-method="delete" href="/delete">A link with data-method</a>
|
|
36
|
+
<a title="a fine link with data method capitalized" data-method="DELETE" href="/delete">A link with data-method capitalized</a>
|
|
37
|
+
<a>No Href</a>
|
|
38
|
+
<a href="">Blank Href</a>
|
|
39
|
+
<a href="#">Blank Anchor</a>
|
|
40
|
+
<a href="#anchor">Anchor</a>
|
|
41
|
+
<a href="/with_simple_html#anchor">Anchor on different page</a>
|
|
42
|
+
<a href="/with_html#anchor">Anchor on same page</a>
|
|
43
|
+
<a href="with_html">Relative</a>
|
|
44
|
+
<input type="text" value="" id="test_field">
|
|
45
|
+
<input type="text" checked="checked" id="checked_field">
|
|
46
|
+
<a href="/redirect"><img width="20" height="20" alt="very fine image" /></a>
|
|
47
|
+
<a href="/with_simple_html"><img width="20" height="20" alt="fine image" /></a>
|
|
48
|
+
|
|
49
|
+
<a href="?query_string=true">Naked Query String</a>
|
|
50
|
+
<% if params[:query_string] %>
|
|
51
|
+
<em>Query String sent</em>
|
|
52
|
+
<% end %>
|
|
53
|
+
</p>
|
|
54
|
+
|
|
55
|
+
<div id="hidden" style="display: none;">
|
|
56
|
+
<div id="hidden_via_ancestor">Inside element with hidden ancestor</div>
|
|
57
|
+
<a href="/with_simple_html" title="awesome title" class="simple">hidden link</a>
|
|
58
|
+
</div>
|
|
59
|
+
|
|
60
|
+
<div style="display: none;">
|
|
61
|
+
<a id="first_invisble" class="hidden">first hidden link</a>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<div style="display: none;">
|
|
65
|
+
<a id="invisible" class="visibility hidden">hidden link</a>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
68
|
+
<div>
|
|
69
|
+
<a id="visible" class="visibility">visible link</a>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<ul>
|
|
73
|
+
<li id="john_monkey">Monkey John</li>
|
|
74
|
+
<li id="paul_monkey">Monkey Paul</li>
|
|
75
|
+
</ul>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Encoding with — html entities »
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
|
|
2
|
+
<head>
|
|
3
|
+
<meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
|
|
4
|
+
<title>with_js</title>
|
|
5
|
+
<script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
|
|
6
|
+
<script src="/jquery-ui.js" type="text/javascript" charset="utf-8"></script>
|
|
7
|
+
<script src="/test.js" type="text/javascript" charset="utf-8"></script>
|
|
8
|
+
</head>
|
|
9
|
+
|
|
10
|
+
<body id="with_js">
|
|
11
|
+
<h1>FooBar</h1>
|
|
12
|
+
|
|
13
|
+
<p id="change">This is text</p>
|
|
14
|
+
<div id="drag">
|
|
15
|
+
<p>This is a draggable element.</p>
|
|
16
|
+
</div>
|
|
17
|
+
<div id="drop">
|
|
18
|
+
<p>It should be dropped here.</p>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
21
|
+
<p><a href="#" id="clickable">Click me</a></p>
|
|
22
|
+
|
|
23
|
+
<p>
|
|
24
|
+
<select id="waiter">
|
|
25
|
+
<option>Foo</option>
|
|
26
|
+
<option>My Waiting Option</option>
|
|
27
|
+
</select>
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
<p>
|
|
31
|
+
<input type="text" name="with_focus_event" value="" id="with_focus_event"/>
|
|
32
|
+
</p>
|
|
33
|
+
|
|
34
|
+
<p>
|
|
35
|
+
<input type="checkbox" id="checkbox_with_event"/>
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
<p>
|
|
39
|
+
<input type="submit" id="fire_ajax_request" value="Fire Ajax Request"/>
|
|
40
|
+
</p>
|
|
41
|
+
|
|
42
|
+
<p>
|
|
43
|
+
<a id="reload-link" href="#">Reload!</a>
|
|
44
|
+
<div id="reload-me"><em>waiting to be reloaded</em></div>
|
|
45
|
+
</p>
|
|
46
|
+
|
|
47
|
+
<script type="text/javascript">
|
|
48
|
+
// a javascript comment
|
|
49
|
+
var aVar = 123;
|
|
50
|
+
</script>
|
|
51
|
+
</body>
|
|
52
|
+
</html>
|
|
53
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<h1>This page is used for testing various scopes</h1>
|
|
2
|
+
|
|
3
|
+
<p id="for_foo">
|
|
4
|
+
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
|
|
5
|
+
incididunt ut labore et dolore magna aliqua. Ut enim ad minim venia.
|
|
6
|
+
<a href="/redirect">Go</a>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<div id="for_bar">
|
|
10
|
+
<ul>
|
|
11
|
+
<li>With Simple HTML: <a href="/with_simple_html">Go</a>
|
|
12
|
+
<form action="/redirect" method="post" accept-charset="utf-8">
|
|
13
|
+
<p>
|
|
14
|
+
<label for="simple_first_name">First Name</label>
|
|
15
|
+
<input type="text" name="first_name" value="John" id="simple_first_name"/>
|
|
16
|
+
</p>
|
|
17
|
+
<p><input type="submit" value="Go"/></p>
|
|
18
|
+
</form>
|
|
19
|
+
</li>
|
|
20
|
+
<li>Bar: <a href="/foo">Go</a>
|
|
21
|
+
<form action="/form" method="post" accept-charset="utf-8">
|
|
22
|
+
<p>
|
|
23
|
+
<label for="bar_first_name">First Name</label>
|
|
24
|
+
<input type="text" name="form[first_name]" value="Peter" id="bar_first_name"/>
|
|
25
|
+
</p>
|
|
26
|
+
<p><input type="submit" value="Go"/></p>
|
|
27
|
+
</form>
|
|
28
|
+
</li>
|
|
29
|
+
</ul>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<div id="another_foo">
|
|
33
|
+
<ul>
|
|
34
|
+
<li>With Simple HTML: <a href="/">Go</a>
|
|
35
|
+
</ul>
|
|
36
|
+
</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Bar
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<html>
|
|
2
|
+
<head>
|
|
3
|
+
<title>With Popups</title>
|
|
4
|
+
<script language="javascript" type="text/javascript">
|
|
5
|
+
<!--
|
|
6
|
+
|
|
7
|
+
function popItUp(name, url) {
|
|
8
|
+
newwindow=window.open(url,name,'height=200,width=150');
|
|
9
|
+
if (window.focus) { newwindow.focus() }
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function init() {
|
|
14
|
+
popItUp('firstPopup', '/popup_one');
|
|
15
|
+
popItUp('secondPopup', '/popup_two');
|
|
16
|
+
}
|
|
17
|
+
window.onload = init;
|
|
18
|
+
|
|
19
|
+
// -->
|
|
20
|
+
</script>
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
<div id="divInMainWindow">This is the text for divInMainWindow</div>
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module Capybara
|
|
2
|
+
class << self
|
|
3
|
+
def save_page(html, file_name=nil)
|
|
4
|
+
file_name ||= "capybara-#{Time.new.strftime("%Y%m%d%H%M%S")}#{rand(10**10)}.html"
|
|
5
|
+
name = File.join(*[Capybara.save_and_open_page_path, file_name].compact)
|
|
6
|
+
|
|
7
|
+
unless Capybara.save_and_open_page_path.nil? || File.directory?(Capybara.save_and_open_page_path )
|
|
8
|
+
FileUtils.mkdir_p(Capybara.save_and_open_page_path)
|
|
9
|
+
end
|
|
10
|
+
FileUtils.touch(name) unless File.exist?(name)
|
|
11
|
+
|
|
12
|
+
tempfile = File.new(name,'w')
|
|
13
|
+
tempfile.write(rewrite_css_and_image_references(html))
|
|
14
|
+
tempfile.close
|
|
15
|
+
tempfile.path
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def save_and_open_page(html, file_name=nil)
|
|
19
|
+
open_in_browser save_page(html, file_name)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
protected
|
|
23
|
+
|
|
24
|
+
def open_in_browser(path) # :nodoc
|
|
25
|
+
require "launchy" # could raise LoadError
|
|
26
|
+
raise LoadError unless Launchy::Version::MAJOR >= 2
|
|
27
|
+
Launchy.open(path)
|
|
28
|
+
rescue LoadError
|
|
29
|
+
warn "Sorry, you need to install launchy >=2.0.0 (`gem install launchy`) and " <<
|
|
30
|
+
"make sure it's available to open pages with `save_and_open_page`."
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def rewrite_css_and_image_references(response_html) # :nodoc:
|
|
34
|
+
root = Capybara.asset_root
|
|
35
|
+
return response_html unless root
|
|
36
|
+
directories = Dir.new(root).entries.select { |name|
|
|
37
|
+
(root+name).directory? and not name.to_s =~ /^\./
|
|
38
|
+
}
|
|
39
|
+
if not directories.empty?
|
|
40
|
+
response_html.gsub!(/("|')\/(#{directories.join('|')})/, '\1' + root.to_s + '/\2')
|
|
41
|
+
end
|
|
42
|
+
return response_html
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Capybara
|
|
2
|
+
class << self
|
|
3
|
+
|
|
4
|
+
##
|
|
5
|
+
# Provides timeout similar to standard library Timeout, but avoids threads
|
|
6
|
+
#
|
|
7
|
+
def timeout(seconds = 1, driver = nil, error_message = nil, &block)
|
|
8
|
+
start_time = Time.now
|
|
9
|
+
|
|
10
|
+
result = nil
|
|
11
|
+
|
|
12
|
+
until result
|
|
13
|
+
return result if result = yield
|
|
14
|
+
|
|
15
|
+
delay = seconds - (Time.now - start_time)
|
|
16
|
+
if delay <= 0
|
|
17
|
+
raise TimeoutError, error_message || "timed out"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
driver && driver.wait_until(delay)
|
|
21
|
+
|
|
22
|
+
sleep(0.05)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Capybara do
|
|
4
|
+
describe '.string' do
|
|
5
|
+
let :string do
|
|
6
|
+
Capybara.string <<-STRING
|
|
7
|
+
<div id="page">
|
|
8
|
+
<div id="content">
|
|
9
|
+
<h1 data="fantastic">Totally awesome</h1>
|
|
10
|
+
<p>Yes it is</p>
|
|
11
|
+
</div>
|
|
12
|
+
|
|
13
|
+
<div id="footer" style="display: none">
|
|
14
|
+
<p>c2010</p>
|
|
15
|
+
<p>Jonas Nicklas</p>
|
|
16
|
+
<input type="text" name="foo" value="bar"/>
|
|
17
|
+
<select name="animal">
|
|
18
|
+
<option>Monkey</option>
|
|
19
|
+
<option selected="selected">Capybara</option>
|
|
20
|
+
</select>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
23
|
+
<section>
|
|
24
|
+
<div class="subsection"></div>
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
STRING
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "allows using matchers" do
|
|
31
|
+
string.should have_css('#page')
|
|
32
|
+
string.should_not have_css('#does-not-exist')
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "allows using custom matchers" do
|
|
36
|
+
Capybara.add_selector :lifeform do
|
|
37
|
+
xpath { |name| "//option[contains(.,'#{name}')]" }
|
|
38
|
+
end
|
|
39
|
+
string.should have_selector(:page)
|
|
40
|
+
string.should_not have_selector(:'does-not-exist')
|
|
41
|
+
string.should have_selector(:lifeform, "Monkey")
|
|
42
|
+
string.should_not have_selector(:lifeform, "Gorilla")
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'allows custom matcher using css' do
|
|
46
|
+
Capybara.add_selector :section do
|
|
47
|
+
css { |css_class| "section .#{css_class}" }
|
|
48
|
+
end
|
|
49
|
+
string.should have_selector(:section, 'subsection')
|
|
50
|
+
string.should_not have_selector(:section, 'section_8')
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "allows using matchers with text option" do
|
|
54
|
+
string.should have_css('h1', :text => 'Totally awesome')
|
|
55
|
+
string.should_not have_css('h1', :text => 'Not so awesome')
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "allows finding only visible nodes" do
|
|
59
|
+
string.all('//p', :text => 'c2010', :visible => true).should be_empty
|
|
60
|
+
string.all('//p', :text => 'c2010', :visible => false).should have(1).element
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "allows finding elements and extracting text from them" do
|
|
64
|
+
string.find('//h1').text.should == 'Totally awesome'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "allows finding elements and extracting attributes from them" do
|
|
68
|
+
string.find('//h1')[:data].should == 'fantastic'
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "allows finding elements and extracting the tag name from them" do
|
|
72
|
+
string.find('//h1').tag_name.should == 'h1'
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "allows finding elements and extracting the path" do
|
|
76
|
+
string.find('//h1').path.should == '/html/body/div/div[1]/h1'
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "allows finding elements and extracting the path" do
|
|
80
|
+
string.find('//input').value.should == 'bar'
|
|
81
|
+
string.find('//select').value.should == 'Capybara'
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "allows finding elements and checking if they are visible" do
|
|
85
|
+
string.find('//h1').should be_visible
|
|
86
|
+
string.find('//input').should_not be_visible
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|