ayanko-watir-webdriver 0.1.1.1

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