Merge branch 'master' of git://github.com/brynary/webrat
This commit is contained in:
commit
57326e5846
|
@ -11,7 +11,11 @@
|
||||||
* Filled in tests on click link lh 195 (diabolo)
|
* Filled in tests on click link lh 195 (diabolo)
|
||||||
* Added current_url to selenium session lh 215 (Luke Amdor)
|
* Added current_url to selenium session lh 215 (Luke Amdor)
|
||||||
* Added silence spec to selenium lh 238 (Martin Gamsjaeger aka snusnu)
|
* Added silence spec to selenium lh 238 (Martin Gamsjaeger aka snusnu)
|
||||||
* Added ability to configure the browser startup timeout for selenium lh 242 (Mike Gaffney)
|
* Added ability to configure the browser startup timeout for selenium lh 242 (Mike Gaffney, Mark Dodwell)
|
||||||
|
* Added delegation for field_named lh194 (pivotal labs)
|
||||||
|
* Added fix to keep from escaping field values in mechanize mode lh256 (jish)
|
||||||
|
* Adding fixes for click button/link and made the integration specs pass for the same in selenium lh254 (Ldiehl, Matthias Marschall)
|
||||||
|
* Adding clicking link by id in selenium mode lh221 (larrytheliquid)
|
||||||
|
|
||||||
== 0.4.4 / 2009-04-06
|
== 0.4.4 / 2009-04-06
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,8 @@ module Webrat
|
||||||
parse_rails_request_params("#{name}=#{escaped_value}")
|
parse_rails_request_params("#{name}=#{escaped_value}")
|
||||||
when :merb
|
when :merb
|
||||||
::Merb::Parse.query("#{name}=#{escaped_value}")
|
::Merb::Parse.query("#{name}=#{escaped_value}")
|
||||||
|
when :mechanize
|
||||||
|
{ name => value }
|
||||||
else
|
else
|
||||||
{ name => escaped_value }
|
{ name => escaped_value }
|
||||||
end
|
end
|
||||||
|
|
|
@ -57,9 +57,7 @@ module Webrat
|
||||||
:field_by_xpath,
|
:field_by_xpath,
|
||||||
:field_with_id,
|
:field_with_id,
|
||||||
:selenium,
|
:selenium,
|
||||||
:simulate, :automate
|
:simulate, :automate,
|
||||||
|
:field_named
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -255,6 +255,7 @@ For example:
|
||||||
def_delegators :current_scope, :field_by_xpath
|
def_delegators :current_scope, :field_by_xpath
|
||||||
def_delegators :current_scope, :field_with_id
|
def_delegators :current_scope, :field_with_id
|
||||||
def_delegators :current_scope, :select_option
|
def_delegators :current_scope, :select_option
|
||||||
|
def_delegators :current_scope, :field_named
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,7 @@
|
||||||
require "webrat"
|
require "webrat"
|
||||||
gem "selenium-client", ">=1.2.14"
|
gem "selenium-client", ">=1.2.14"
|
||||||
require "selenium/client"
|
require "selenium/client"
|
||||||
|
|
||||||
# active_support already defines silence_stream, no need to do that again if it's already present.
|
|
||||||
# http://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/kernel/reporting.rb
|
|
||||||
unless Kernel.respond_to?(:silence_stream)
|
|
||||||
require "webrat/selenium/silence_stream"
|
require "webrat/selenium/silence_stream"
|
||||||
end
|
|
||||||
|
|
||||||
require "webrat/selenium/selenium_session"
|
require "webrat/selenium/selenium_session"
|
||||||
require "webrat/selenium/matchers"
|
require "webrat/selenium/matchers"
|
||||||
require "webrat/core_extensions/tcp_socket"
|
require "webrat/core_extensions/tcp_socket"
|
||||||
|
|
|
@ -1,12 +1,19 @@
|
||||||
if (locator == '*') {
|
if (locator == '*') {
|
||||||
return selenium.browserbot.locationStrategies['xpath'].call(this, "//input[@type='submit']", inDocument, inWindow)
|
return selenium.browserbot.locationStrategies['xpath'].call(this, "//input[@type='submit']", inDocument, inWindow)
|
||||||
}
|
}
|
||||||
|
var buttons = inDocument.getElementsByTagName('button');
|
||||||
var inputs = inDocument.getElementsByTagName('input');
|
var inputs = inDocument.getElementsByTagName('input');
|
||||||
return $A(inputs).find(function(candidate){
|
var result = $A(inputs).concat($A(buttons)).find(function(candidate){
|
||||||
inputType = candidate.getAttribute('type');
|
var type = candidate.getAttribute('type');
|
||||||
if (inputType == 'submit' || inputType == 'image') {
|
if (type == 'submit' || type == 'image' || type == 'button') {
|
||||||
var buttonText = $F(candidate);
|
var matches_id = PatternMatcher.matches(locator, candidate.id);
|
||||||
return (PatternMatcher.matches(locator, buttonText));
|
var matches_value = PatternMatcher.matches(locator, candidate.value);
|
||||||
|
var matches_html = PatternMatcher.matches(locator, candidate.innerHTML);
|
||||||
|
var matches_alt = PatternMatcher.matches(locator, candidate.alt);
|
||||||
|
if (matches_id || matches_value || matches_html || matches_alt) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
return result;
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
var links = inDocument.getElementsByTagName('a');
|
var links = inDocument.getElementsByTagName('a');
|
||||||
var candidateLinks = $A(links).select(function(candidateLink) {
|
var candidateLinks = $A(links).select(function(candidateLink) {
|
||||||
return PatternMatcher.matches(locator, getText(candidateLink));
|
var textMatched = PatternMatcher.matches(locator, getText(candidateLink));
|
||||||
|
var idMatched = PatternMatcher.matches(locator, candidateLink.id);
|
||||||
|
var titleMatched = PatternMatcher.matches(locator, candidateLink.title);
|
||||||
|
return textMatched || idMatched || titleMatched;
|
||||||
});
|
});
|
||||||
if (candidateLinks.length == 0) {
|
if (candidateLinks.length == 0) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -41,7 +41,7 @@ module Webrat
|
||||||
webrat_deprecate :visits, :visit
|
webrat_deprecate :visits, :visit
|
||||||
|
|
||||||
def fill_in(field_identifier, options)
|
def fill_in(field_identifier, options)
|
||||||
locator = "webrat=#{Regexp.escape(field_identifier)}"
|
locator = "webrat=#{field_identifier}"
|
||||||
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
selenium.wait_for_element locator, :timeout_in_seconds => 5
|
||||||
selenium.type(locator, "#{options[:with]}")
|
selenium.type(locator, "#{options[:with]}")
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
module Webrat
|
module Webrat
|
||||||
module Selenium
|
module Selenium
|
||||||
module SilenceStream
|
module SilenceStream
|
||||||
|
# active_support already defines silence_stream, no need to do that again if it's already present.
|
||||||
|
# http://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/kernel/reporting.rb
|
||||||
|
unless Kernel.respond_to?(:silence_stream)
|
||||||
def silence_stream(stream)
|
def silence_stream(stream)
|
||||||
old_stream = stream.dup
|
old_stream = stream.dup
|
||||||
stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
|
stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
|
||||||
|
@ -12,3 +15,4 @@ module Webrat
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
|
@ -0,0 +1,7 @@
|
||||||
|
class ButtonsController < ApplicationController
|
||||||
|
def show
|
||||||
|
end
|
||||||
|
def create
|
||||||
|
render :text => "success"
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,4 @@
|
||||||
|
class FieldsController < ApplicationController
|
||||||
|
def show
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,7 @@
|
||||||
|
class LinksController < ApplicationController
|
||||||
|
def show
|
||||||
|
if params[:value]
|
||||||
|
render :text => "Link:#{params[:value]}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
module ButtonsHelper
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
module FieldsHelper
|
||||||
|
end
|
|
@ -0,0 +1,2 @@
|
||||||
|
module LinksHelper
|
||||||
|
end
|
|
@ -0,0 +1,11 @@
|
||||||
|
<h1 id='form_title' class='form title'>Webrat Buttons Form</h1>
|
||||||
|
|
||||||
|
<% form_tag "/buttons" do %>
|
||||||
|
<input type="button" id="input_button_id" value="input_button_value" />
|
||||||
|
<input type="submit" id="input_submit_id" value="input_submit_value" />
|
||||||
|
<input type="image" id="input_image_id" value="input_image_value" alt="input_image_alt" src="" />
|
||||||
|
|
||||||
|
<button type="button" id="button_button_id" value="button_button_value">button_button_text</button>
|
||||||
|
<button type="submit" id="button_submit_id" value="button_submit_value">button_submit_text</button>
|
||||||
|
<button type="image" id="button_image_id" value="button_image_value">button_image_text</button>
|
||||||
|
<% end %>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<h1>Webrat Fields Page</h1>
|
||||||
|
<h2>Filling In</h2>
|
||||||
|
<ul>
|
||||||
|
<li><input type="text" name="field_by_name" value="" /></li>
|
||||||
|
<li><input type="text" name="rails[naming]" value="" /></li>
|
||||||
|
<li><input type="text" id="field_by_id" value="" /></li>
|
||||||
|
<li><label for="field_by_label_id">FieldByLabelId</label><input type="text" id="field_by_label_id" /></li>
|
||||||
|
</ul>
|
|
@ -0,0 +1,4 @@
|
||||||
|
<h1>Webrat Links Page</h1>
|
||||||
|
<a href="/links?value=LinkByText">LinkByText</a><br />
|
||||||
|
<a href="/links?value=link_by_id" id="link_by_id">id</a><br />
|
||||||
|
<a href="/links?value=LinkByTitle" title="LinkByTitle">title</a>
|
|
@ -0,0 +1,11 @@
|
||||||
|
<h1 id='form_title' class='form title'>Webrat Buttons Form</h1>
|
||||||
|
|
||||||
|
<% form_tag submit_path do %>
|
||||||
|
<input type="button" id="input_button_id" value="input_button_value">
|
||||||
|
<input type="submit" id="input_submit_id" value="input_submit_value">
|
||||||
|
<input type="image" id="input_image_id" value="input_image_value" alt="input_image_alt" src="">
|
||||||
|
|
||||||
|
<button type="button" id="button_button_id" value="button_button_value">button_button_text</button>
|
||||||
|
<button type="submit" id="button_submit_id" value="button_submit_value">button_submit_text</button>
|
||||||
|
<button type="image" id="button_image_id" value="button_image_value">button_image_text</button>
|
||||||
|
<% end %>
|
|
@ -1,4 +1,7 @@
|
||||||
ActionController::Routing::Routes.draw do |map|
|
ActionController::Routing::Routes.draw do |map|
|
||||||
|
map.resource 'links', :only => [:show]
|
||||||
|
map.resource 'buttons', :only => [:show, :create]
|
||||||
|
map.resource 'fields', :only => [:show]
|
||||||
map.with_options :controller => "webrat" do |webrat|
|
map.with_options :controller => "webrat" do |webrat|
|
||||||
webrat.submit "/submit", :action => "submit"
|
webrat.submit "/submit", :action => "submit"
|
||||||
webrat.internal_redirect "/internal_redirect", :action => "internal_redirect"
|
webrat.internal_redirect "/internal_redirect", :action => "internal_redirect"
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class ButtonClickTest < ActionController::IntegrationTest
|
||||||
|
# <button type="button" ...>
|
||||||
|
test "should click button with type button by id" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_button_id"
|
||||||
|
end
|
||||||
|
test "should click button with type button by value" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_button_value"
|
||||||
|
end
|
||||||
|
test "should click button with type button by html" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_button_text"
|
||||||
|
end
|
||||||
|
|
||||||
|
# <button type="submit" ...>
|
||||||
|
test "should click button with type submit by id" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_submit_id"
|
||||||
|
end
|
||||||
|
test "should click button with type submit by value" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_submit_value"
|
||||||
|
end
|
||||||
|
test "should click button with type submit by html" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_submit_text"
|
||||||
|
end
|
||||||
|
|
||||||
|
# <button type="image" ...>
|
||||||
|
test "should click button with type image by id" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_image_id"
|
||||||
|
end
|
||||||
|
test "should click button with type image by value" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_image_value"
|
||||||
|
end
|
||||||
|
test "should click button with type image by html" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "button_image_text"
|
||||||
|
end
|
||||||
|
|
||||||
|
# <input type="button" ...>
|
||||||
|
test "should click image with type button by id" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "input_button_id"
|
||||||
|
end
|
||||||
|
test "should click input with type button by value" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "input_button_value"
|
||||||
|
end
|
||||||
|
|
||||||
|
# <input type="submit" ...>
|
||||||
|
test "should click input with type submit by id" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "input_submit_id"
|
||||||
|
end
|
||||||
|
test "should click input with type submit by value" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "input_submit_value"
|
||||||
|
end
|
||||||
|
|
||||||
|
# <input type="image" ...>
|
||||||
|
test "should click input with type image by id" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "input_image_id"
|
||||||
|
end
|
||||||
|
test "should click input with type image by value" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "input_image_value"
|
||||||
|
end
|
||||||
|
test "should click input with type image by alt" do
|
||||||
|
visit buttons_path
|
||||||
|
click_button "input_image_alt"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,20 @@
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class FillInTest < ActionController::IntegrationTest
|
||||||
|
test "should fill in text field by name" do
|
||||||
|
visit fields_path
|
||||||
|
fill_in "field_by_name", :with => "value"
|
||||||
|
end
|
||||||
|
test "should fill in text field by name, rails naming lh257" do
|
||||||
|
visit fields_path
|
||||||
|
fill_in "rails[naming]", :with => "value"
|
||||||
|
end
|
||||||
|
test "should fill in text field by id" do
|
||||||
|
visit fields_path
|
||||||
|
fill_in "field_by_id", :with => "value"
|
||||||
|
end
|
||||||
|
test "should fill in text field by label via id" do
|
||||||
|
visit fields_path
|
||||||
|
fill_in "FieldByLabelId", :with => "value"
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,21 @@
|
||||||
|
require 'test_helper'
|
||||||
|
|
||||||
|
class LinkClickTest < ActionController::IntegrationTest
|
||||||
|
test "should click link by text" do
|
||||||
|
visit links_path
|
||||||
|
click_link "LinkByText"
|
||||||
|
assert_contain("Link:LinkByText")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should click link by id" do
|
||||||
|
visit links_path
|
||||||
|
click_link "link_by_id"
|
||||||
|
assert_contain("Link:link_by_id")
|
||||||
|
end
|
||||||
|
|
||||||
|
test "should click link by title" do
|
||||||
|
visit links_path
|
||||||
|
click_link "LinkByTitle"
|
||||||
|
assert_contain("Link:LinkByTitle")
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,10 +2,13 @@ require 'test_helper'
|
||||||
|
|
||||||
class WebratTest < ActionController::IntegrationTest
|
class WebratTest < ActionController::IntegrationTest
|
||||||
|
|
||||||
|
#Firefox raises a security concern under Selenium
|
||||||
|
unless ENV['WEBRAT_INTEGRATION_MODE'] == 'selenium'
|
||||||
test "should visit fully qualified urls" do
|
test "should visit fully qualified urls" do
|
||||||
visit root_url(:host => "chunkybacon.example.com")
|
visit root_url(:host => "chunkybacon.example.com")
|
||||||
assert_equal "chunkybacon", request.subdomains.first
|
assert_equal "chunkybacon", request.subdomains.first
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
test "should visit pages" do
|
test "should visit pages" do
|
||||||
visit root_path
|
visit root_path
|
||||||
|
@ -46,18 +49,6 @@ class WebratTest < ActionController::IntegrationTest
|
||||||
assert response.redirect?
|
assert response.redirect?
|
||||||
end
|
end
|
||||||
|
|
||||||
test "should click link by text" do
|
|
||||||
visit internal_redirect_path
|
|
||||||
click_link "Test Link Text"
|
|
||||||
assert_contain("Webrat Form")
|
|
||||||
end
|
|
||||||
|
|
||||||
test "should click link by id" do
|
|
||||||
visit internal_redirect_path
|
|
||||||
click_link "link_id"
|
|
||||||
assert_contain("Webrat Form")
|
|
||||||
end
|
|
||||||
|
|
||||||
test "should be able to assert xpath" do
|
test "should be able to assert xpath" do
|
||||||
visit root_path
|
visit root_path
|
||||||
assert_have_xpath "//h1"
|
assert_have_xpath "//h1"
|
||||||
|
@ -68,11 +59,14 @@ class WebratTest < ActionController::IntegrationTest
|
||||||
assert_have_selector "h1"
|
assert_have_selector "h1"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Firefox detects and prevents infinite redirects under Selenium
|
||||||
|
unless ENV['WEBRAT_INTEGRATION_MODE'] == 'selenium'
|
||||||
test "should detect infinite redirects" do
|
test "should detect infinite redirects" do
|
||||||
assert_raises Webrat::InfiniteRedirectError do
|
assert_raises Webrat::InfiniteRedirectError do
|
||||||
visit infinite_redirect_path
|
visit infinite_redirect_path
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# test "should be able to assert have tag" do
|
# test "should be able to assert have tag" do
|
||||||
# visit root_path
|
# visit root_path
|
||||||
|
|
|
@ -66,4 +66,20 @@ module Webrat
|
||||||
radio_button.should_not be_checked
|
radio_button.should_not be_checked
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe TextField do
|
||||||
|
it 'should not escape values in mechanize mode' do
|
||||||
|
Webrat.configuration.mode = :mechanize
|
||||||
|
|
||||||
|
html = <<-HTML
|
||||||
|
<html>
|
||||||
|
<input type="text" name="email" value="user@example.com" />
|
||||||
|
</html>
|
||||||
|
HTML
|
||||||
|
|
||||||
|
element = Webrat::XML.css_search(Webrat::XML.document(html), 'input').first
|
||||||
|
text_field = TextField.new(nil, element)
|
||||||
|
text_field.to_param.should == { 'email' => 'user@example.com' }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue