ayanko-watir-webdriver 0.1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|