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.
Files changed (74) hide show
  1. data/.document +5 -0
  2. data/.gitignore +5 -0
  3. data/.gitmodules +3 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +20 -0
  6. data/README.rdoc +55 -0
  7. data/Rakefile +139 -0
  8. data/VERSION +1 -0
  9. data/lib/watir-webdriver.rb +71 -0
  10. data/lib/watir-webdriver/attribute_helper.rb +128 -0
  11. data/lib/watir-webdriver/browser.rb +164 -0
  12. data/lib/watir-webdriver/browserbot.js +49 -0
  13. data/lib/watir-webdriver/cell_container.rb +19 -0
  14. data/lib/watir-webdriver/container.rb +40 -0
  15. data/lib/watir-webdriver/core_ext/string.rb +22 -0
  16. data/lib/watir-webdriver/element_collection.rb +96 -0
  17. data/lib/watir-webdriver/elements/button.rb +75 -0
  18. data/lib/watir-webdriver/elements/checkbox.rb +73 -0
  19. data/lib/watir-webdriver/elements/element.rb +265 -0
  20. data/lib/watir-webdriver/elements/file_field.rb +69 -0
  21. data/lib/watir-webdriver/elements/font.rb +11 -0
  22. data/lib/watir-webdriver/elements/form.rb +17 -0
  23. data/lib/watir-webdriver/elements/frame.rb +110 -0
  24. data/lib/watir-webdriver/elements/generated.rb +2541 -0
  25. data/lib/watir-webdriver/elements/hidden.rb +24 -0
  26. data/lib/watir-webdriver/elements/image.rb +51 -0
  27. data/lib/watir-webdriver/elements/input.rb +42 -0
  28. data/lib/watir-webdriver/elements/link.rb +7 -0
  29. data/lib/watir-webdriver/elements/option.rb +55 -0
  30. data/lib/watir-webdriver/elements/radio.rb +49 -0
  31. data/lib/watir-webdriver/elements/select.rb +216 -0
  32. data/lib/watir-webdriver/elements/table.rb +37 -0
  33. data/lib/watir-webdriver/elements/table_cell.rb +36 -0
  34. data/lib/watir-webdriver/elements/table_row.rb +45 -0
  35. data/lib/watir-webdriver/elements/table_section.rb +9 -0
  36. data/lib/watir-webdriver/elements/text_field.rb +97 -0
  37. data/lib/watir-webdriver/exception.rb +21 -0
  38. data/lib/watir-webdriver/extensions/alerts.rb +69 -0
  39. data/lib/watir-webdriver/extensions/cookies.rb +39 -0
  40. data/lib/watir-webdriver/extensions/firefox/webdriver.xpi +0 -0
  41. data/lib/watir-webdriver/extensions/nokogiri.rb +14 -0
  42. data/lib/watir-webdriver/extensions/performance.rb +54 -0
  43. data/lib/watir-webdriver/extensions/wait.rb +141 -0
  44. data/lib/watir-webdriver/html.rb +19 -0
  45. data/lib/watir-webdriver/html/generator.rb +112 -0
  46. data/lib/watir-webdriver/html/idl_sorter.rb +49 -0
  47. data/lib/watir-webdriver/html/spec_extractor.rb +111 -0
  48. data/lib/watir-webdriver/html/util.rb +22 -0
  49. data/lib/watir-webdriver/html/visitor.rb +174 -0
  50. data/lib/watir-webdriver/locators/button_locator.rb +74 -0
  51. data/lib/watir-webdriver/locators/child_cell_locator.rb +32 -0
  52. data/lib/watir-webdriver/locators/child_row_locator.rb +37 -0
  53. data/lib/watir-webdriver/locators/element_locator.rb +352 -0
  54. data/lib/watir-webdriver/locators/text_field_locator.rb +65 -0
  55. data/lib/watir-webdriver/row_container.rb +34 -0
  56. data/lib/watir-webdriver/window_switching.rb +105 -0
  57. data/lib/watir-webdriver/xpath_support.rb +28 -0
  58. data/lib/yard/handlers/watir.rb +57 -0
  59. data/spec/alert_spec.rb +49 -0
  60. data/spec/browser_spec.rb +42 -0
  61. data/spec/container_spec.rb +42 -0
  62. data/spec/element_locator_spec.rb +304 -0
  63. data/spec/element_spec.rb +13 -0
  64. data/spec/html/alerts.html +11 -0
  65. data/spec/html/keylogger.html +15 -0
  66. data/spec/html/wait.html +27 -0
  67. data/spec/implementation.rb +17 -0
  68. data/spec/input_spec.rb +39 -0
  69. data/spec/locator_spec_helper.rb +51 -0
  70. data/spec/spec_helper.rb +14 -0
  71. data/spec/wait_spec.rb +98 -0
  72. data/support/html5.html +90243 -0
  73. data/watir-webdriver.gemspec +59 -0
  74. metadata +238 -0
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,5 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
4
+ rdoc
5
+ pkg
@@ -0,0 +1,3 @@
1
+ [submodule "spec/watirspec"]
2
+ path = spec/watirspec
3
+ url = git://github.com/jarib/watirspec.git
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source :rubygems
2
+
3
+ gem "jeweler"
4
+ gemspec
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.
@@ -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.
@@ -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