ayanko-watir-webdriver 0.1.1.1
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/.document +5 -0
- data/.gitignore +5 -0
- data/.gitmodules +3 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.rdoc +55 -0
- data/Rakefile +139 -0
- data/VERSION +1 -0
- data/lib/watir-webdriver.rb +71 -0
- data/lib/watir-webdriver/attribute_helper.rb +128 -0
- data/lib/watir-webdriver/browser.rb +164 -0
- data/lib/watir-webdriver/browserbot.js +49 -0
- data/lib/watir-webdriver/cell_container.rb +19 -0
- data/lib/watir-webdriver/container.rb +40 -0
- data/lib/watir-webdriver/core_ext/string.rb +22 -0
- data/lib/watir-webdriver/element_collection.rb +96 -0
- data/lib/watir-webdriver/elements/button.rb +75 -0
- data/lib/watir-webdriver/elements/checkbox.rb +73 -0
- data/lib/watir-webdriver/elements/element.rb +265 -0
- data/lib/watir-webdriver/elements/file_field.rb +69 -0
- data/lib/watir-webdriver/elements/font.rb +11 -0
- data/lib/watir-webdriver/elements/form.rb +17 -0
- data/lib/watir-webdriver/elements/frame.rb +110 -0
- data/lib/watir-webdriver/elements/generated.rb +2541 -0
- data/lib/watir-webdriver/elements/hidden.rb +24 -0
- data/lib/watir-webdriver/elements/image.rb +51 -0
- data/lib/watir-webdriver/elements/input.rb +42 -0
- data/lib/watir-webdriver/elements/link.rb +7 -0
- data/lib/watir-webdriver/elements/option.rb +55 -0
- data/lib/watir-webdriver/elements/radio.rb +49 -0
- data/lib/watir-webdriver/elements/select.rb +216 -0
- data/lib/watir-webdriver/elements/table.rb +37 -0
- data/lib/watir-webdriver/elements/table_cell.rb +36 -0
- data/lib/watir-webdriver/elements/table_row.rb +45 -0
- data/lib/watir-webdriver/elements/table_section.rb +9 -0
- data/lib/watir-webdriver/elements/text_field.rb +97 -0
- data/lib/watir-webdriver/exception.rb +21 -0
- data/lib/watir-webdriver/extensions/alerts.rb +69 -0
- data/lib/watir-webdriver/extensions/cookies.rb +39 -0
- data/lib/watir-webdriver/extensions/firefox/webdriver.xpi +0 -0
- data/lib/watir-webdriver/extensions/nokogiri.rb +14 -0
- data/lib/watir-webdriver/extensions/performance.rb +54 -0
- data/lib/watir-webdriver/extensions/wait.rb +141 -0
- data/lib/watir-webdriver/html.rb +19 -0
- data/lib/watir-webdriver/html/generator.rb +112 -0
- data/lib/watir-webdriver/html/idl_sorter.rb +49 -0
- data/lib/watir-webdriver/html/spec_extractor.rb +111 -0
- data/lib/watir-webdriver/html/util.rb +22 -0
- data/lib/watir-webdriver/html/visitor.rb +174 -0
- data/lib/watir-webdriver/locators/button_locator.rb +74 -0
- data/lib/watir-webdriver/locators/child_cell_locator.rb +32 -0
- data/lib/watir-webdriver/locators/child_row_locator.rb +37 -0
- data/lib/watir-webdriver/locators/element_locator.rb +352 -0
- data/lib/watir-webdriver/locators/text_field_locator.rb +65 -0
- data/lib/watir-webdriver/row_container.rb +34 -0
- data/lib/watir-webdriver/window_switching.rb +105 -0
- data/lib/watir-webdriver/xpath_support.rb +28 -0
- data/lib/yard/handlers/watir.rb +57 -0
- data/spec/alert_spec.rb +49 -0
- data/spec/browser_spec.rb +42 -0
- data/spec/container_spec.rb +42 -0
- data/spec/element_locator_spec.rb +304 -0
- data/spec/element_spec.rb +13 -0
- data/spec/html/alerts.html +11 -0
- data/spec/html/keylogger.html +15 -0
- data/spec/html/wait.html +27 -0
- data/spec/implementation.rb +17 -0
- data/spec/input_spec.rb +39 -0
- data/spec/locator_spec_helper.rb +51 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/wait_spec.rb +98 -0
- data/support/html5.html +90243 -0
- data/watir-webdriver.gemspec +59 -0
- metadata +238 -0
data/.document
ADDED
data/.gitmodules
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009-2010 Jari Bakken
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
= watir-webdriver
|
2
|
+
|
3
|
+
Watir implementation built on WebDriver's Ruby bindings.
|
4
|
+
See http://rubyforge.org/pipermail/wtr-development/2009-October/001313.html.
|
5
|
+
|
6
|
+
= API docs
|
7
|
+
|
8
|
+
http://jarib.github.com/watir-webdriver/doc/
|
9
|
+
|
10
|
+
= Example
|
11
|
+
|
12
|
+
require 'watir-webdriver'
|
13
|
+
|
14
|
+
browser = Watir::Browser.new :firefox
|
15
|
+
browser.goto "http://google.com"
|
16
|
+
browser.text_field(:name => 'q').set("WebDriver rocks!")
|
17
|
+
browser.button(:name => 'btnG').click
|
18
|
+
puts browser.url
|
19
|
+
browser.close
|
20
|
+
|
21
|
+
= Description
|
22
|
+
|
23
|
+
The file in lib/watir/elements/generated.rb is autogenerated from the HTML5 spec. This is done by extracting the IDL parts from the spec and processing them with the WebIDL gem (link below).
|
24
|
+
|
25
|
+
= Specs
|
26
|
+
|
27
|
+
watir-webdriver uses the watir2 branch of watirspec for testing. After cloning, you should fetch the submodule:
|
28
|
+
|
29
|
+
git submodule init && git submodule update
|
30
|
+
|
31
|
+
Specs specific to watir-webdriver are found in spec/*_spec.rb, with watirspec in spec/watirspec.
|
32
|
+
|
33
|
+
= See also
|
34
|
+
|
35
|
+
* http://github.com/jarib/webidl
|
36
|
+
* http://github.com/jarib/watirspec/tree/watir2
|
37
|
+
* http://selenium.googlecode.com
|
38
|
+
|
39
|
+
= Dependencies
|
40
|
+
|
41
|
+
* selenium-webdriver
|
42
|
+
|
43
|
+
== Note on Patches/Pull Requests
|
44
|
+
|
45
|
+
* Fork the project.
|
46
|
+
* Make your feature addition or bug fix.
|
47
|
+
* Add tests for it. This is important so I don't break it in a
|
48
|
+
future version unintentionally.
|
49
|
+
* Commit, do not mess with rakefile, version, or history.
|
50
|
+
(if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
51
|
+
* Send me a pull request. Bonus points for topic branches.
|
52
|
+
|
53
|
+
== Copyright
|
54
|
+
|
55
|
+
Copyright (c) 2009-2010 Jari Bakken. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "watir-webdriver"
|
8
|
+
gem.summary = %Q{Watir on WebDriver}
|
9
|
+
gem.description = %Q{WebDriver-backed Watir}
|
10
|
+
gem.email = "jari.bakken@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/jarib/watir-webdriver"
|
12
|
+
gem.authors = ["Jari Bakken"]
|
13
|
+
|
14
|
+
gem.add_dependency "selenium-webdriver", '0.0.29'
|
15
|
+
|
16
|
+
gem.add_development_dependency "rspec", "~> 2.0.0"
|
17
|
+
gem.add_development_dependency "yard", "~> 0.6"
|
18
|
+
gem.add_development_dependency "webidl", ">= 0.0.6"
|
19
|
+
gem.add_development_dependency "sinatra", "~> 1.0"
|
20
|
+
gem.add_development_dependency "nokogiri"
|
21
|
+
gem.add_development_dependency "activesupport", "~> 2.3.5" # for pluralization during code generation
|
22
|
+
end
|
23
|
+
|
24
|
+
Jeweler::GemcutterTasks.new
|
25
|
+
rescue LoadError
|
26
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
27
|
+
end
|
28
|
+
|
29
|
+
require 'rspec/core/rake_task'
|
30
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
31
|
+
spec.ruby_opts = "-I lib:spec"
|
32
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
33
|
+
end
|
34
|
+
|
35
|
+
namespace :spec do
|
36
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
37
|
+
spec.ruby_opts = "-I lib:spec"
|
38
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
39
|
+
spec.rcov = true
|
40
|
+
spec.rcov_opts = %w[--exclude spec,ruby-debug,/Library/Ruby,.gem --include lib/watir-webdriver]
|
41
|
+
end
|
42
|
+
|
43
|
+
desc 'Run specs for CI'
|
44
|
+
RSpec::Core::RakeTask.new(:ci) do |spec|
|
45
|
+
spec.ruby_opts = "-I lib:spec"
|
46
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
47
|
+
spec.rspec_opts = ["--format", "html:results/#{RUBY_PLATFORM}/#{ENV['WATIR_WEBDRIVER_BROWSER'] || 'firefox'}/spec-results.html",
|
48
|
+
"--format", "progress",
|
49
|
+
"--backtrace"]
|
50
|
+
spec.rcov = true
|
51
|
+
spec.rcov_opts = %w[--exclude spec,ruby-debug,/Library/Ruby,.gem --include lib/watir-webdriver]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
task :spec => :check_dependencies
|
56
|
+
|
57
|
+
task :lib do
|
58
|
+
$LOAD_PATH.unshift(File.expand_path("lib", File.dirname(__FILE__)))
|
59
|
+
end
|
60
|
+
|
61
|
+
namespace :html5 do
|
62
|
+
SPEC_URI = "http://www.whatwg.org/specs/web-apps/current-work/"
|
63
|
+
SPEC_PATH = "support/html5.html"
|
64
|
+
|
65
|
+
task :html_lib => :lib do
|
66
|
+
require 'watir-webdriver/html'
|
67
|
+
end
|
68
|
+
|
69
|
+
desc "Download the HTML5 spec from #{SPEC_URI}"
|
70
|
+
task :download do
|
71
|
+
require "open-uri"
|
72
|
+
mv SPEC_PATH, "#{SPEC_PATH}.old" if File.exist?(SPEC_PATH)
|
73
|
+
downloaded_bytes = 0
|
74
|
+
|
75
|
+
File.open(SPEC_PATH, "w") do |io|
|
76
|
+
io << "<!-- downloaded from #{SPEC_URI} on #{Time.now} -->\n"
|
77
|
+
io << data = open(SPEC_URI).read
|
78
|
+
downloaded_bytes = data.bytesize
|
79
|
+
end
|
80
|
+
|
81
|
+
puts "#{SPEC_URI} => #{SPEC_PATH} (#{downloaded_bytes} bytes)"
|
82
|
+
end
|
83
|
+
|
84
|
+
desc "Print IDL parts from #{SPEC_URI}"
|
85
|
+
task :print => :html_lib do
|
86
|
+
extractor = Watir::HTML::SpecExtractor.new(SPEC_PATH)
|
87
|
+
|
88
|
+
extractor.process.each do |tag_name, interface_definitions|
|
89
|
+
puts "#{tag_name.ljust(10)} => #{interface_definitions.map { |e| e.name }}"
|
90
|
+
end
|
91
|
+
|
92
|
+
extractor.print_hierarchy
|
93
|
+
|
94
|
+
unless extractor.errors.empty?
|
95
|
+
puts "\n\n<======================= ERRORS =======================>\n\n"
|
96
|
+
puts extractor.errors.join("\n" + "="*80 + "\n")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
desc 'Re-enerate the base Watir element classes from the spec '
|
101
|
+
task :generate => :html_lib do
|
102
|
+
old_file = "lib/watir-webdriver/elements/generated.rb"
|
103
|
+
generator = Watir::HTML::Generator.new
|
104
|
+
|
105
|
+
File.open("#{old_file}.new", "w") do |file|
|
106
|
+
generator.generate(SPEC_PATH, file)
|
107
|
+
end
|
108
|
+
|
109
|
+
if File.exist?(old_file)
|
110
|
+
system "diff -Naut #{old_file} #{old_file}.new | less"
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
desc 'Move generated.rb.new to generated.rb'
|
115
|
+
task :overwrite do
|
116
|
+
file = "lib/watir-webdriver/elements/generated.rb"
|
117
|
+
mv "#{file}.new", file
|
118
|
+
end
|
119
|
+
|
120
|
+
desc 'download spec -> generate -> generated.rb'
|
121
|
+
task :update => [:download, :generate, :overwrite]
|
122
|
+
end # html5
|
123
|
+
|
124
|
+
task :default => :spec
|
125
|
+
|
126
|
+
begin
|
127
|
+
require 'yard'
|
128
|
+
Rake::Task[:lib].invoke
|
129
|
+
require "yard/handlers/watir"
|
130
|
+
YARD::Rake::YardocTask.new do |task|
|
131
|
+
task.options = %w[--debug] # this is pretty slow, so nice with some output
|
132
|
+
end
|
133
|
+
rescue LoadError
|
134
|
+
task :yard do
|
135
|
+
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
load "spec/watirspec/watirspec.rake" if File.exist?("spec/watirspec/watirspec.rake")
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.1
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "selenium-webdriver"
|
3
|
+
require "json"
|
4
|
+
|
5
|
+
require "watir-webdriver/core_ext/string"
|
6
|
+
require "watir-webdriver/exception"
|
7
|
+
require "watir-webdriver/xpath_support"
|
8
|
+
require "watir-webdriver/window_switching"
|
9
|
+
require "watir-webdriver/container"
|
10
|
+
require "watir-webdriver/locators/element_locator"
|
11
|
+
require "watir-webdriver/locators/button_locator"
|
12
|
+
require "watir-webdriver/locators/text_field_locator"
|
13
|
+
require "watir-webdriver/locators/child_row_locator"
|
14
|
+
require "watir-webdriver/locators/child_cell_locator"
|
15
|
+
require "watir-webdriver/browser"
|
16
|
+
|
17
|
+
module Watir
|
18
|
+
include Selenium
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def tag_to_class
|
22
|
+
@tag_to_class ||= {}
|
23
|
+
end
|
24
|
+
|
25
|
+
def element_class_for(tag_name)
|
26
|
+
tag_to_class[tag_name.to_sym] || HTMLElement
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
require "watir-webdriver/attribute_helper"
|
33
|
+
require "watir-webdriver/row_container"
|
34
|
+
require "watir-webdriver/cell_container"
|
35
|
+
require "watir-webdriver/element_collection"
|
36
|
+
require "watir-webdriver/elements/element"
|
37
|
+
require "watir-webdriver/elements/generated"
|
38
|
+
require "watir-webdriver/elements/frame"
|
39
|
+
require "watir-webdriver/elements/input"
|
40
|
+
require "watir-webdriver/elements/button"
|
41
|
+
require "watir-webdriver/elements/checkbox"
|
42
|
+
require "watir-webdriver/elements/file_field"
|
43
|
+
require "watir-webdriver/elements/image"
|
44
|
+
require "watir-webdriver/elements/link"
|
45
|
+
require "watir-webdriver/elements/font"
|
46
|
+
require "watir-webdriver/elements/radio"
|
47
|
+
require "watir-webdriver/elements/text_field"
|
48
|
+
require "watir-webdriver/elements/hidden"
|
49
|
+
require "watir-webdriver/elements/select"
|
50
|
+
require "watir-webdriver/elements/form"
|
51
|
+
require "watir-webdriver/elements/option"
|
52
|
+
require "watir-webdriver/elements/table"
|
53
|
+
require "watir-webdriver/elements/table_row"
|
54
|
+
require "watir-webdriver/elements/table_cell"
|
55
|
+
require "watir-webdriver/elements/table_section"
|
56
|
+
|
57
|
+
Watir.tag_to_class.freeze
|
58
|
+
|
59
|
+
module Watir
|
60
|
+
module Container
|
61
|
+
|
62
|
+
end # Container
|
63
|
+
end # Watir
|
64
|
+
|
65
|
+
|
66
|
+
# undefine deprecated methods to use them for Element attributes
|
67
|
+
class Object
|
68
|
+
undef_method :id if method_defined? "id"
|
69
|
+
undef_method :type if method_defined? "type"
|
70
|
+
end
|
71
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Watir
|
2
|
+
|
3
|
+
#
|
4
|
+
# @private
|
5
|
+
#
|
6
|
+
# Extended by Element, provides methods for defining attributes on the element classes.
|
7
|
+
#
|
8
|
+
|
9
|
+
module AttributeHelper
|
10
|
+
|
11
|
+
IGNORED_ATTRIBUTES = [:text, :hash]
|
12
|
+
|
13
|
+
def typed_attributes
|
14
|
+
@typed_attributes ||= Hash.new { |hash, type| hash[type] = [] }
|
15
|
+
end
|
16
|
+
|
17
|
+
def attribute_list
|
18
|
+
@attribute_list ||= (
|
19
|
+
list = typed_attributes.values.flatten
|
20
|
+
list += ancestors[1..-1].map do |e|
|
21
|
+
e.attribute_list if e.respond_to?(:attribute_list)
|
22
|
+
end.compact.flatten
|
23
|
+
).uniq
|
24
|
+
end
|
25
|
+
|
26
|
+
def attributes(attribute_map = nil)
|
27
|
+
attribute_map or return attribute_list
|
28
|
+
|
29
|
+
add_attributes attribute_map
|
30
|
+
|
31
|
+
attribute_map.each do |type, attribs|
|
32
|
+
attribs.each do |name|
|
33
|
+
# we don't want to override methods like :text or :hash
|
34
|
+
next if IGNORED_ATTRIBUTES.include?(name)
|
35
|
+
define_attribute(type, name)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def define_attribute(type, name)
|
43
|
+
method_name = method_name_for(type, name)
|
44
|
+
attribute_name = attribute_for_method(name)
|
45
|
+
|
46
|
+
(@attributes ||= []) << attribute_name
|
47
|
+
|
48
|
+
case type
|
49
|
+
when :string
|
50
|
+
define_string_attribute(method_name, attribute_name)
|
51
|
+
when :bool
|
52
|
+
define_boolean_attribute(method_name, attribute_name)
|
53
|
+
when :int
|
54
|
+
define_int_attribute(method_name, attribute_name)
|
55
|
+
else
|
56
|
+
# $stderr.puts "treating #{type.inspect} as string for now"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def define_string_attribute(mname, aname)
|
61
|
+
define_method mname do
|
62
|
+
assert_exists
|
63
|
+
@element.attribute(aname).to_s
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def define_boolean_attribute(mname, aname)
|
68
|
+
define_method mname do
|
69
|
+
assert_exists
|
70
|
+
@element.attribute(aname) == "true"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def define_int_attribute(mname, aname)
|
75
|
+
define_method mname do
|
76
|
+
assert_exists
|
77
|
+
value = @element.attribute(aname)
|
78
|
+
value && Integer(value)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def add_attributes(attributes)
|
83
|
+
attributes.each do |type, attr_list|
|
84
|
+
typed_attributes[type] += attr_list
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def method_name_for(type, attribute)
|
89
|
+
# http://github.com/jarib/watir-webdriver/issues/issue/26
|
90
|
+
name = case attribute
|
91
|
+
when :html_for
|
92
|
+
'for'
|
93
|
+
when :col_span
|
94
|
+
'colspan'
|
95
|
+
when :row_span
|
96
|
+
'rowspan'
|
97
|
+
else
|
98
|
+
attribute.to_s
|
99
|
+
end
|
100
|
+
|
101
|
+
name << "?" if type == :bool
|
102
|
+
|
103
|
+
name
|
104
|
+
end
|
105
|
+
|
106
|
+
def attribute_for_method(method)
|
107
|
+
# http://github.com/jarib/watir-webdriver/issues/issue/26
|
108
|
+
|
109
|
+
case method.to_sym
|
110
|
+
when :class_name
|
111
|
+
'class'
|
112
|
+
when :html_for
|
113
|
+
'for'
|
114
|
+
when :read_only
|
115
|
+
'readonly'
|
116
|
+
when :http_equiv
|
117
|
+
'http-equiv'
|
118
|
+
when :col_span
|
119
|
+
'colspan'
|
120
|
+
when :row_span
|
121
|
+
'rowspan'
|
122
|
+
else
|
123
|
+
method.to_s
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end # AttributeHelper
|
128
|
+
end # Watir
|
@@ -0,0 +1,164 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Watir
|
3
|
+
|
4
|
+
#
|
5
|
+
# The main class through which you control the browser.
|
6
|
+
#
|
7
|
+
|
8
|
+
class Browser
|
9
|
+
include Container
|
10
|
+
include WindowSwitching
|
11
|
+
|
12
|
+
attr_reader :driver
|
13
|
+
alias_method :wd, :driver # ensures duck typing with Watir::Element
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def start(url, browser = :firefox)
|
17
|
+
b = new(browser)
|
18
|
+
b.goto url
|
19
|
+
|
20
|
+
b
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Create a Watir::Browser instance
|
26
|
+
#
|
27
|
+
# @param [:firefox, :ie, :chrome, :remote, Selenium::WebDriver] browser
|
28
|
+
# @param args Passed to the underlying driver
|
29
|
+
#
|
30
|
+
|
31
|
+
def initialize(browser = :firefox, *args)
|
32
|
+
case browser
|
33
|
+
when Symbol, String
|
34
|
+
@driver = Selenium::WebDriver.for browser.to_sym, *args
|
35
|
+
when Selenium::WebDriver::Driver
|
36
|
+
@driver = browser
|
37
|
+
else
|
38
|
+
raise ArgumentError, "expected Symbol or Selenium::WebDriver::Driver, got #{browser.class}"
|
39
|
+
end
|
40
|
+
|
41
|
+
@error_checkers = []
|
42
|
+
@current_frame = nil
|
43
|
+
@closed = false
|
44
|
+
end
|
45
|
+
|
46
|
+
def inspect
|
47
|
+
'#<%s:0x%x url=%s title=%s>' % [self.class, hash*2, url.inspect, title.inspect]
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Goto the given URL
|
52
|
+
#
|
53
|
+
# @param [String] uri The url.
|
54
|
+
# @return [String] The url you end up at.
|
55
|
+
#
|
56
|
+
|
57
|
+
def goto(uri)
|
58
|
+
uri = "http://#{uri}" unless uri.include?("://")
|
59
|
+
|
60
|
+
@driver.navigate.to uri
|
61
|
+
run_checkers
|
62
|
+
|
63
|
+
url
|
64
|
+
end
|
65
|
+
|
66
|
+
def back
|
67
|
+
@driver.navigate.back
|
68
|
+
end
|
69
|
+
|
70
|
+
def forward
|
71
|
+
@driver.navigate.forward
|
72
|
+
end
|
73
|
+
|
74
|
+
def url
|
75
|
+
@driver.current_url
|
76
|
+
end
|
77
|
+
|
78
|
+
def title
|
79
|
+
@driver.title
|
80
|
+
end
|
81
|
+
|
82
|
+
def close
|
83
|
+
return if @closed
|
84
|
+
@driver.quit
|
85
|
+
@closed = true
|
86
|
+
end
|
87
|
+
alias_method :quit, :close # TODO: close vs quit
|
88
|
+
|
89
|
+
def clear_cookies
|
90
|
+
@driver.manage.delete_all_cookies
|
91
|
+
end
|
92
|
+
|
93
|
+
def text
|
94
|
+
@driver.find_element(:tag_name, "body").text
|
95
|
+
end
|
96
|
+
|
97
|
+
def html
|
98
|
+
# use body.html instead?
|
99
|
+
@driver.page_source
|
100
|
+
end
|
101
|
+
|
102
|
+
def refresh
|
103
|
+
@driver.navigate.refresh
|
104
|
+
run_checkers
|
105
|
+
end
|
106
|
+
|
107
|
+
def status
|
108
|
+
execute_script "return window.status;"
|
109
|
+
end
|
110
|
+
|
111
|
+
def execute_script(script, *args)
|
112
|
+
args.map! { |e| e.kind_of?(Watir::Element) ? e.element : e }
|
113
|
+
returned = @driver.execute_script(script, *args)
|
114
|
+
|
115
|
+
if returned.kind_of? WebDriver::Element
|
116
|
+
Watir.element_class_for(returned.tag_name).new(self, :element => returned)
|
117
|
+
else
|
118
|
+
returned
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def add_checker(checker = nil, &block)
|
123
|
+
if block_given?
|
124
|
+
@error_checkers << block
|
125
|
+
elsif Proc === checker
|
126
|
+
@error_checkers << checker
|
127
|
+
else
|
128
|
+
raise ArgumentError, "argument must be a Proc or block"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def disable_checker(checker)
|
133
|
+
@error_checkers.delete(checker)
|
134
|
+
end
|
135
|
+
|
136
|
+
def run_checkers
|
137
|
+
@error_checkers.each { |e| e[self] }
|
138
|
+
end
|
139
|
+
|
140
|
+
#
|
141
|
+
# Protocol shared with Watir::Element
|
142
|
+
#
|
143
|
+
# @api private
|
144
|
+
#
|
145
|
+
|
146
|
+
def assert_exists
|
147
|
+
if @closed
|
148
|
+
raise Error, "browser was closed"
|
149
|
+
else
|
150
|
+
driver.switch_to.default_content
|
151
|
+
true
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
def exist?
|
156
|
+
not @closed
|
157
|
+
end
|
158
|
+
|
159
|
+
def browser
|
160
|
+
self
|
161
|
+
end
|
162
|
+
|
163
|
+
end # Browser
|
164
|
+
end # Watir
|