forked from teamcapybara/capybara
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Util function for applying matchers to strings
- Loading branch information
David Chelimsky and Jonas Nicklas
committed
Nov 12, 2010
1 parent
b4c228f
commit f2fb04f
Showing
5 changed files
with
173 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -38,6 +38,10 @@ def initialize(session, base) | |
|
||
protected | ||
|
||
def wait? | ||
driver.wait? | ||
end | ||
|
||
def driver | ||
session.driver | ||
end | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
module Capybara | ||
def self.string(html) | ||
StringNode.new(Nokogiri::HTML(html)) | ||
end | ||
|
||
class StringNode | ||
include Capybara::Node::Finders | ||
include Capybara::Node::Matchers | ||
|
||
attr_reader :native | ||
|
||
def initialize(native) | ||
@native = native | ||
end | ||
|
||
def text | ||
native.text | ||
end | ||
|
||
def [](name) | ||
attr_name = name.to_s | ||
if attr_name == 'value' | ||
value | ||
elsif 'input' == tag_name and 'checkbox' == native[:type] and 'checked' == attr_name | ||
native['checked'] == 'checked' | ||
else | ||
native[attr_name] | ||
end | ||
end | ||
|
||
def tag_name | ||
native.node_name | ||
end | ||
|
||
def path | ||
native.path | ||
end | ||
|
||
def value | ||
if tag_name == 'textarea' | ||
native.content | ||
elsif tag_name == 'select' | ||
if native['multiple'] == 'multiple' | ||
native.xpath(".//option[@selected='selected']").map { |option| option[:value] || option.content } | ||
else | ||
option = native.xpath(".//option[@selected='selected']").first || native.xpath(".//option").first | ||
option[:value] || option.content if option | ||
end | ||
else | ||
native[:value] | ||
end | ||
end | ||
|
||
def visible? | ||
native.xpath("./ancestor-or-self::*[contains(@style, 'display:none') or contains(@style, 'display: none')]").size == 0 | ||
end | ||
|
||
protected | ||
|
||
def find_in_base(xpath) | ||
native.xpath(xpath).map { |node| StringNode.new(node) } | ||
end | ||
|
||
def convert_elements(elements) | ||
elements | ||
end | ||
|
||
def wait? | ||
false | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
require 'spec_helper' | ||
require 'capybara/util/string' | ||
|
||
describe Capybara do | ||
describe '.string' do | ||
let :string do | ||
Capybara.string <<-STRING | ||
<div id="page"> | ||
<div id="content"> | ||
<h1 data="fantastic">Awesome</h1> | ||
<p>Yes it is</p> | ||
</div> | ||
<div id="footer" style="display: none"> | ||
<p>c2010</p> | ||
<p>Jonas Nicklas</p> | ||
<input type="text" name="foo" value="bar"/> | ||
<select name="animal"> | ||
<option>Monkey</option> | ||
<option selected="selected">Capybara</option> | ||
</select> | ||
</div> | ||
</div> | ||
STRING | ||
end | ||
|
||
it "allows using matchers" do | ||
string.should have_css('#page') | ||
string.should_not have_css('#does-not-exist') | ||
end | ||
|
||
it "allows using custom matchers" do | ||
Capybara.add_selector :lifeform do | ||
xpath { |name| "//option[contains(.,'#{name}')]" } | ||
end | ||
string.should have_selector(:page) | ||
string.should_not have_selector(:'does-not-exist') | ||
string.should have_selector(:lifeform, "Monkey") | ||
string.should_not have_selector(:lifeform, "Gorilla") | ||
end | ||
|
||
it "allows using matchers with text option" do | ||
string.should have_css('h1', :text => 'Awesome') | ||
string.should_not have_css('h1', :text => 'Not so awesome') | ||
end | ||
|
||
it "allows finding only visible nodes" do | ||
string.all('//p', :text => 'c2010', :visible => true).should be_empty | ||
string.all('//p', :text => 'c2010', :visible => false).should have(1).element | ||
end | ||
|
||
it "allows finding elements and extracting text from them" do | ||
string.find('//h1').text.should == 'Awesome' | ||
end | ||
|
||
it "allows finding elements and extracting attributes from them" do | ||
string.find('//h1')[:data].should == 'fantastic' | ||
end | ||
|
||
it "allows finding elements and extracting the tag name from them" do | ||
string.find('//h1').tag_name.should == 'h1' | ||
end | ||
|
||
it "allows finding elements and extracting the path" do | ||
string.find('//h1').path.should == '/html/body/div/div[1]/h1' | ||
end | ||
|
||
it "allows finding elements and extracting the path" do | ||
string.find('//input').value.should == 'bar' | ||
string.find('//select').value.should == 'Capybara' | ||
end | ||
|
||
it "allows finding elements and checking if they are visible" do | ||
string.find('//h1').should be_visible | ||
string.find('//input').should_not be_visible | ||
end | ||
end | ||
end |