watir-webdriver 0.6.11 → 0.7.0
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.
- checksums.yaml +4 -4
- data/.travis.yml +14 -12
- data/CHANGES.md +17 -0
- data/LICENSE +1 -1
- data/README.md +8 -1
- data/Rakefile +7 -2
- data/lib/watir-webdriver/alert.rb +5 -1
- data/lib/watir-webdriver/attribute_helper.rb +4 -8
- data/lib/watir-webdriver/browser.rb +41 -21
- data/lib/watir-webdriver/element_collection.rb +1 -2
- data/lib/watir-webdriver/elements/button.rb +3 -5
- data/lib/watir-webdriver/elements/checkbox.rb +2 -11
- data/lib/watir-webdriver/elements/element.rb +93 -86
- data/lib/watir-webdriver/elements/file_field.rb +1 -2
- data/lib/watir-webdriver/elements/form.rb +2 -1
- data/lib/watir-webdriver/elements/generated.rb +24 -11
- data/lib/watir-webdriver/elements/iframe.rb +25 -17
- data/lib/watir-webdriver/elements/option.rb +6 -14
- data/lib/watir-webdriver/elements/radio.rb +2 -5
- data/lib/watir-webdriver/elements/select.rb +15 -7
- data/lib/watir-webdriver/exception.rb +0 -2
- data/lib/watir-webdriver/extensions/alerts.rb +0 -14
- data/lib/watir-webdriver/has_window.rb +2 -4
- data/lib/watir-webdriver/html/spec_extractor.rb +3 -2
- data/lib/watir-webdriver/html/visitor.rb +2 -2
- data/lib/watir-webdriver/locators/element_locator.rb +22 -21
- data/lib/watir-webdriver/locators/text_field_locator.rb +11 -3
- data/lib/watir-webdriver/user_editable.rb +5 -10
- data/lib/watir-webdriver/version.rb +1 -1
- data/lib/watir-webdriver/wait.rb +26 -26
- data/lib/watir-webdriver/window.rb +30 -25
- data/spec/always_locate_spec.rb +42 -0
- data/spec/browser_spec.rb +1 -1
- data/spec/element_locator_spec.rb +13 -1
- data/spec/element_spec.rb +43 -8
- data/spec/input_spec.rb +0 -31
- data/spec/spec_helper.rb +0 -1
- data/support/doctest_helper.rb +72 -0
- data/support/travis.sh +4 -0
- data/watir-webdriver.gemspec +2 -1
- metadata +50 -35
- data/spec/html/inner_outer.html +0 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 3c59e0947d61d3444072fba9199dbb1923ef78bb
         | 
| 4 | 
            +
              data.tar.gz: cea68a6afbae78f341d70c43e276697cd297b42a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 118d8dac0739c61e992e684c3f7ea86744142bf27f68f10bd766f3f930724c5d7c7475b9ba02d2fb11dda3ff33c582ddf02227a5933e23b8c07d39409fcb1473
         | 
| 7 | 
            +
              data.tar.gz: 76b6e52b21db799697ccf8777debbeaebd14bbb5e19e60825c6f7c6a5ccce387c964dd647e1506f5dc4c8a6315264b8f9816f77cd234987e219be7741399b723
         | 
    
        data/.travis.yml
    CHANGED
    
    | @@ -9,18 +9,20 @@ notifications: | |
| 9 9 | 
             
              irc: "irc.freenode.net#watir"
         | 
| 10 10 | 
             
            before_script:
         | 
| 11 11 | 
             
              - support/travis.sh
         | 
| 12 | 
            +
            script: bundle exec rake $RAKE_TASK
         | 
| 12 13 | 
             
            env:
         | 
| 13 | 
            -
              - WATIR_WEBDRIVER_BROWSER=firefox
         | 
| 14 | 
            -
              - WATIR_WEBDRIVER_BROWSER=firefox ALWAYS_LOCATE=false
         | 
| 15 | 
            -
              - WATIR_WEBDRIVER_BROWSER=firefox PREFER_CSS=1 SELECTOR_STATS=1
         | 
| 16 | 
            -
              - WATIR_WEBDRIVER_BROWSER=chrome
         | 
| 17 | 
            -
              - WATIR_WEBDRIVER_BROWSER=chrome ALWAYS_LOCATE=false
         | 
| 18 | 
            -
              - WATIR_WEBDRIVER_BROWSER=chrome PREFER_CSS=1 SELECTOR_STATS=1
         | 
| 19 | 
            -
              - WATIR_WEBDRIVER_BROWSER=phantomjs
         | 
| 20 | 
            -
              - WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
         | 
| 21 | 
            -
              - WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
         | 
| 14 | 
            +
              - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=firefox
         | 
| 15 | 
            +
              - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=firefox ALWAYS_LOCATE=false
         | 
| 16 | 
            +
              - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=firefox PREFER_CSS=1 SELECTOR_STATS=1
         | 
| 17 | 
            +
              - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome
         | 
| 18 | 
            +
              - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome ALWAYS_LOCATE=false
         | 
| 19 | 
            +
              - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=chrome PREFER_CSS=1 SELECTOR_STATS=1
         | 
| 20 | 
            +
              # - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs
         | 
| 21 | 
            +
              # - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
         | 
| 22 | 
            +
              # - RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
         | 
| 23 | 
            +
              - RAKE_TASK=yard:doctest
         | 
| 22 24 | 
             
            matrix:
         | 
| 23 25 | 
             
              allow_failures:
         | 
| 24 | 
            -
                - env: WATIR_WEBDRIVER_BROWSER=phantomjs
         | 
| 25 | 
            -
                - env: WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
         | 
| 26 | 
            -
                - env: WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
         | 
| 26 | 
            +
                - env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs
         | 
| 27 | 
            +
                - env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs ALWAYS_LOCATE=false
         | 
| 28 | 
            +
                - env: RAKE_TASK=spec WATIR_WEBDRIVER_BROWSER=phantomjs PREFER_CSS=1 SELECTOR_STATS=1
         | 
    
        data/CHANGES.md
    CHANGED
    
    | @@ -1,3 +1,20 @@ | |
| 1 | 
            +
            ### 0.7.0
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            * Allow finding all elements with prefer_css
         | 
| 4 | 
            +
            * Add support for yard-doctest (#287)
         | 
| 5 | 
            +
            * Update from HTML spec (#296)
         | 
| 6 | 
            +
            * Support tag_name call on Frames and IFrames (#293 & #294)
         | 
| 7 | 
            +
            * Increased performance by caching elements by default where possible (#307)
         | 
| 8 | 
            +
            * Improved handling of elements that go stale during lookup (#291, thanks @titusfortner)
         | 
| 9 | 
            +
            * Fix element location issues when switching between IFrames (#286, thanks @titusfortner)
         | 
| 10 | 
            +
            * Fix creation of an IFrameCollection based on selector (#299, thanks @titusfortner)
         | 
| 11 | 
            +
            * Fix window handling with closed windows (#290 & 282, thanks @titusfortner)
         | 
| 12 | 
            +
            * Prevent running checkers on a closed window (#283, thanks @titusfortner)
         | 
| 13 | 
            +
            * Allow taking actions without triggering run checkers (#283, thanks @titusfortner)
         | 
| 14 | 
            +
            * Fix bug when ElementCollection#[] returns existing elements for non-existing selector (#309)
         | 
| 15 | 
            +
            * Fix bug when Wait would never execute block with 0 timeout (#312)
         | 
| 16 | 
            +
            * Fix race condition with IFrameCollection#to_a (#317)
         | 
| 17 | 
            +
             | 
| 1 18 | 
             
            ### 0.6.11 (2014-09-23)
         | 
| 2 19 |  | 
| 3 20 | 
             
            * Fix namespacing issue (#265, thanks @titusfortner)
         | 
    
        data/LICENSE
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -38,6 +38,13 @@ watir-webdriver uses [watirspec](http://github.com/watir/watirspec) for testing. | |
| 38 38 |  | 
| 39 39 | 
             
            Specs specific to watir-webdriver are found in spec/*_spec.rb, with watirspec in spec/watirspec.
         | 
| 40 40 |  | 
| 41 | 
            +
            Doctests
         | 
| 42 | 
            +
            --------
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            watir-webdriver uses [yard-doctest](https://github.com/p0deje/yard-doctest) for testing documentation examples.
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                rake yard:doctest
         | 
| 47 | 
            +
             | 
| 41 48 | 
             
            API docs
         | 
| 42 49 | 
             
            --------
         | 
| 43 50 |  | 
| @@ -71,4 +78,4 @@ Note on Patches/Pull Requests | |
| 71 78 | 
             
            Copyright
         | 
| 72 79 | 
             
            ---------
         | 
| 73 80 |  | 
| 74 | 
            -
            Copyright (c) 2009- | 
| 81 | 
            +
            Copyright (c) 2009-2015 Jari Bakken. See LICENSE for details.
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -20,10 +20,10 @@ namespace :spec do | |
| 20 20 | 
             
              end
         | 
| 21 21 | 
             
            end
         | 
| 22 22 |  | 
| 23 | 
            -
            task :default => :spec
         | 
| 23 | 
            +
            task :default => [:spec, 'yard:doctest']
         | 
| 24 24 |  | 
| 25 25 | 
             
            namespace :html5 do
         | 
| 26 | 
            -
              SPEC_URI  = " | 
| 26 | 
            +
              SPEC_URI  = "https://www.whatwg.org/specs/web-apps/current-work/"
         | 
| 27 27 | 
             
              SPEC_PATH = "support/html5.html"
         | 
| 28 28 |  | 
| 29 29 | 
             
              task :html_lib => :lib do
         | 
| @@ -91,6 +91,11 @@ YARD::Rake::YardocTask.new do |task| | |
| 91 91 | 
             
              task.options = %w[--debug] # this is pretty slow, so nice with some output
         | 
| 92 92 | 
             
            end
         | 
| 93 93 |  | 
| 94 | 
            +
            require 'yard-doctest'
         | 
| 95 | 
            +
            YARD::Doctest::RakeTask.new do |task|
         | 
| 96 | 
            +
              task.doctest_opts = ['-v']
         | 
| 97 | 
            +
            end
         | 
| 98 | 
            +
             | 
| 94 99 | 
             
            namespace :changes do
         | 
| 95 100 | 
             
              task :differ do
         | 
| 96 101 | 
             
                require './support/version_differ'
         | 
| @@ -14,7 +14,7 @@ module Watir | |
| 14 14 | 
             
                #
         | 
| 15 15 | 
             
                # @example
         | 
| 16 16 | 
             
                #   browser.alert.text
         | 
| 17 | 
            -
                #   #=> " | 
| 17 | 
            +
                #   #=> "ok"
         | 
| 18 18 | 
             
                #
         | 
| 19 19 | 
             
                # @return [String]
         | 
| 20 20 | 
             
                #
         | 
| @@ -70,6 +70,10 @@ module Watir | |
| 70 70 | 
             
                #
         | 
| 71 71 | 
             
                # Returns true if alert, confirm or prompt is present and false otherwise.
         | 
| 72 72 | 
             
                #
         | 
| 73 | 
            +
                # @example
         | 
| 74 | 
            +
                #   browser.alert.exists?
         | 
| 75 | 
            +
                #   #=> true
         | 
| 76 | 
            +
                #
         | 
| 73 77 |  | 
| 74 78 | 
             
                def exists?
         | 
| 75 79 | 
             
                  assert_exists
         | 
| @@ -68,30 +68,26 @@ module Watir | |
| 68 68 |  | 
| 69 69 | 
             
                def define_string_attribute(mname, aname)
         | 
| 70 70 | 
             
                  define_method mname do
         | 
| 71 | 
            -
                     | 
| 72 | 
            -
                    @element.attribute(aname).to_s
         | 
| 71 | 
            +
                    attribute_value(aname).to_s
         | 
| 73 72 | 
             
                  end
         | 
| 74 73 | 
             
                end
         | 
| 75 74 |  | 
| 76 75 | 
             
                def define_boolean_attribute(mname, aname)
         | 
| 77 76 | 
             
                  define_method mname do
         | 
| 78 | 
            -
                     | 
| 79 | 
            -
                    @element.attribute(aname) == "true"
         | 
| 77 | 
            +
                    attribute_value(aname) == "true"
         | 
| 80 78 | 
             
                  end
         | 
| 81 79 | 
             
                end
         | 
| 82 80 |  | 
| 83 81 | 
             
                def define_int_attribute(mname, aname)
         | 
| 84 82 | 
             
                  define_method mname do
         | 
| 85 | 
            -
                     | 
| 86 | 
            -
                    value = @element.attribute(aname)
         | 
| 83 | 
            +
                    value = attribute_value(aname)
         | 
| 87 84 | 
             
                    value && Integer(value)
         | 
| 88 85 | 
             
                  end
         | 
| 89 86 | 
             
                end
         | 
| 90 87 |  | 
| 91 88 | 
             
                def define_float_attribute(mname, aname)
         | 
| 92 89 | 
             
                  define_method mname do
         | 
| 93 | 
            -
                     | 
| 94 | 
            -
                    value = @element.attribute(aname)
         | 
| 90 | 
            +
                    value = attribute_value(aname)
         | 
| 95 91 | 
             
                    value && Float(value)
         | 
| 96 92 | 
             
                  end
         | 
| 97 93 | 
             
                end
         | 
| @@ -18,7 +18,7 @@ module Watir | |
| 18 18 | 
             
                  # Creates a Watir::Browser instance and goes to URL.
         | 
| 19 19 | 
             
                  #
         | 
| 20 20 | 
             
                  # @example
         | 
| 21 | 
            -
                  #   browser = Watir::Browser.start "www.google.com", : | 
| 21 | 
            +
                  #   browser = Watir::Browser.start "www.google.com", :firefox
         | 
| 22 22 | 
             
                  #   #=> #<Watir::Browser:0x..fa45a499cb41e1752 url="http://www.google.com" title="Google">
         | 
| 23 23 | 
             
                  #
         | 
| 24 24 | 
             
                  # @param [String] url
         | 
| @@ -65,7 +65,7 @@ module Watir | |
| 65 65 | 
             
                # Goes to the given URL.
         | 
| 66 66 | 
             
                #
         | 
| 67 67 | 
             
                # @example
         | 
| 68 | 
            -
                #   browser.goto "www. | 
| 68 | 
            +
                #   browser.goto "www.watir.com"
         | 
| 69 69 | 
             
                #
         | 
| 70 70 | 
             
                # @param [String] uri The url.
         | 
| 71 71 | 
             
                # @return [String] The url you end up at.
         | 
| @@ -100,9 +100,9 @@ module Watir | |
| 100 100 | 
             
                # Returns URL of current page.
         | 
| 101 101 | 
             
                #
         | 
| 102 102 | 
             
                # @example
         | 
| 103 | 
            -
                #   browser.goto " | 
| 103 | 
            +
                #   browser.goto "www.watir.com"
         | 
| 104 104 | 
             
                #   browser.url
         | 
| 105 | 
            -
                #   #=> "http:// | 
| 105 | 
            +
                #   #=> "http://watir.com/"
         | 
| 106 106 | 
             
                #
         | 
| 107 107 | 
             
                # @return [String]
         | 
| 108 108 | 
             
                #
         | 
| @@ -116,9 +116,9 @@ module Watir | |
| 116 116 | 
             
                # Returns title of current page.
         | 
| 117 117 | 
             
                #
         | 
| 118 118 | 
             
                # @example
         | 
| 119 | 
            -
                #   browser.goto " | 
| 119 | 
            +
                #   browser.goto "www.watir.com"
         | 
| 120 120 | 
             
                #   browser.title
         | 
| 121 | 
            -
                #   #=> " | 
| 121 | 
            +
                #   #=> "Watir.com | Web Application Testing in Ruby"
         | 
| 122 122 | 
             
                #
         | 
| 123 123 | 
             
                # @return [String]
         | 
| 124 124 | 
             
                #
         | 
| @@ -152,9 +152,9 @@ module Watir | |
| 152 152 | 
             
                # Returns browser name.
         | 
| 153 153 | 
             
                #
         | 
| 154 154 | 
             
                # @example
         | 
| 155 | 
            -
                #   browser = Watir::Browser.new : | 
| 155 | 
            +
                #   browser = Watir::Browser.new :firefox
         | 
| 156 156 | 
             
                #   browser.name
         | 
| 157 | 
            -
                #   #=> : | 
| 157 | 
            +
                #   #=> :firefox
         | 
| 158 158 | 
             
                #
         | 
| 159 159 | 
             
                # @return [Symbol]
         | 
| 160 160 | 
             
                #
         | 
| @@ -243,14 +243,9 @@ module Watir | |
| 243 243 | 
             
                # `return` explicitly.
         | 
| 244 244 | 
             
                #
         | 
| 245 245 | 
             
                # @example Check that Ajax requests are completed with jQuery
         | 
| 246 | 
            -
                #   browser.execute_script("return jQuery.active") ==  | 
| 246 | 
            +
                #   browser.execute_script("return jQuery.active") == 0
         | 
| 247 247 | 
             
                #   #=> true
         | 
| 248 248 | 
             
                #
         | 
| 249 | 
            -
                # @example Get inner HTML of element
         | 
| 250 | 
            -
                #   span = browser.span(class: "someclass")
         | 
| 251 | 
            -
                #   browser.execute_script "return arguments[0].innerHTML", span
         | 
| 252 | 
            -
                #   #=> "Span innerHTML"
         | 
| 253 | 
            -
                #
         | 
| 254 249 | 
             
                # @param [String] script JavaScript snippet to execute
         | 
| 255 250 | 
             
                # @param *args Arguments will be available in the given script in the 'arguments' pseudo-array
         | 
| 256 251 | 
             
                #
         | 
| @@ -266,7 +261,7 @@ module Watir | |
| 266 261 | 
             
                # Sends sequence of keystrokes to currently active element.
         | 
| 267 262 | 
             
                #
         | 
| 268 263 | 
             
                # @example
         | 
| 269 | 
            -
                #   browser.goto " | 
| 264 | 
            +
                #   browser.goto "www.google.com"
         | 
| 270 265 | 
             
                #   browser.send_keys "Watir", :return
         | 
| 271 266 | 
             
                #
         | 
| 272 267 | 
             
                # @param [String, Symbol] *args
         | 
| @@ -299,8 +294,8 @@ module Watir | |
| 299 294 | 
             
                #   browser.add_checker do |page|
         | 
| 300 295 | 
             
                #     page.text.include?("Server Error") and puts "Application exception or 500 error!"
         | 
| 301 296 | 
             
                #   end
         | 
| 302 | 
            -
                #   browser.goto "www. | 
| 303 | 
            -
                #   " | 
| 297 | 
            +
                #   browser.goto "www.watir.com/404"
         | 
| 298 | 
            +
                #   "Application exception or 500 error!"
         | 
| 304 299 | 
             
                #
         | 
| 305 300 | 
             
                # @param [#call] checker Object responding to call
         | 
| 306 301 | 
             
                # @yield Checker block
         | 
| @@ -325,8 +320,8 @@ module Watir | |
| 325 320 | 
             
                #     page.text.include?("Server Error") and puts "Application exception or 500 error!"
         | 
| 326 321 | 
             
                #   end
         | 
| 327 322 | 
             
                #   browser.add_checker checker
         | 
| 328 | 
            -
                #   browser.goto "www. | 
| 329 | 
            -
                #   " | 
| 323 | 
            +
                #   browser.goto "www.watir.com/404"
         | 
| 324 | 
            +
                #   "Application exception or 500 error!"
         | 
| 330 325 | 
             
                #   browser.disable_checker checker
         | 
| 331 326 | 
             
                #   browser.refresh
         | 
| 332 327 | 
             
                #
         | 
| @@ -340,7 +335,26 @@ module Watir | |
| 340 335 | 
             
                #
         | 
| 341 336 |  | 
| 342 337 | 
             
                def run_checkers
         | 
| 343 | 
            -
                  @error_checkers.each { |e| e.call(self) }
         | 
| 338 | 
            +
                  @error_checkers.each { |e| e.call(self) } if !@error_checkers.empty? && window.present?
         | 
| 339 | 
            +
                end
         | 
| 340 | 
            +
             | 
| 341 | 
            +
                #
         | 
| 342 | 
            +
                # Executes a block without running error checkers.
         | 
| 343 | 
            +
                #
         | 
| 344 | 
            +
                # @example
         | 
| 345 | 
            +
                #   browser.without_checkers do
         | 
| 346 | 
            +
                #     browser.element(:name => "new_user_button").click
         | 
| 347 | 
            +
                #   end
         | 
| 348 | 
            +
                #
         | 
| 349 | 
            +
                # @yieldparam [Watir::Browser]
         | 
| 350 | 
            +
                #
         | 
| 351 | 
            +
             | 
| 352 | 
            +
                def without_checkers
         | 
| 353 | 
            +
                  current_checkers = @error_checkers
         | 
| 354 | 
            +
                  @error_checkers = []
         | 
| 355 | 
            +
                  yield(self)
         | 
| 356 | 
            +
                ensure
         | 
| 357 | 
            +
                  @error_checkers = current_checkers
         | 
| 344 358 | 
             
                end
         | 
| 345 359 |  | 
| 346 360 | 
             
                #
         | 
| @@ -350,7 +364,10 @@ module Watir | |
| 350 364 | 
             
                #
         | 
| 351 365 |  | 
| 352 366 | 
             
                def exist?
         | 
| 353 | 
            -
                   | 
| 367 | 
            +
                  assert_exists
         | 
| 368 | 
            +
                  true
         | 
| 369 | 
            +
                rescue Exception::NoMatchingWindowFoundException, Exception::Error
         | 
| 370 | 
            +
                  false
         | 
| 354 371 | 
             
                end
         | 
| 355 372 | 
             
                alias_method :exists?, :exist?
         | 
| 356 373 |  | 
| @@ -363,11 +380,14 @@ module Watir | |
| 363 380 | 
             
                def assert_exists
         | 
| 364 381 | 
             
                  if @closed
         | 
| 365 382 | 
             
                    raise Exception::Error, "browser was closed"
         | 
| 383 | 
            +
                  elsif !window.present?
         | 
| 384 | 
            +
                    raise Exception::NoMatchingWindowFoundException, "browser window was closed"
         | 
| 366 385 | 
             
                  else
         | 
| 367 386 | 
             
                    driver.switch_to.default_content
         | 
| 368 387 | 
             
                    true
         | 
| 369 388 | 
             
                  end
         | 
| 370 389 | 
             
                end
         | 
| 390 | 
            +
                alias_method :assert_not_stale, :assert_exists
         | 
| 371 391 |  | 
| 372 392 | 
             
                def reset!
         | 
| 373 393 | 
             
                  # no-op
         | 
| @@ -42,7 +42,6 @@ module Watir | |
| 42 42 |  | 
| 43 43 | 
             
                #
         | 
| 44 44 | 
             
                # Get the element at the given index.
         | 
| 45 | 
            -
                # Note that this is 0-indexed and not compatible with older Watir implementations.
         | 
| 46 45 | 
             
                #
         | 
| 47 46 | 
             
                # Also note that because of Watir's lazy loading, this will return an Element
         | 
| 48 47 | 
             
                # instance even if the index is out of bounds.
         | 
| @@ -52,7 +51,7 @@ module Watir | |
| 52 51 | 
             
                #
         | 
| 53 52 |  | 
| 54 53 | 
             
                def [](idx)
         | 
| 55 | 
            -
                  to_a[idx] || element_class.new(@parent, :index => idx)
         | 
| 54 | 
            +
                  to_a[idx] || element_class.new(@parent, @selector.merge(:index => idx))
         | 
| 56 55 | 
             
                end
         | 
| 57 56 |  | 
| 58 57 | 
             
                #
         | 
| @@ -23,15 +23,13 @@ module Watir | |
| 23 23 | 
             
                #
         | 
| 24 24 |  | 
| 25 25 | 
             
                def text
         | 
| 26 | 
            -
                   | 
| 27 | 
            -
             | 
| 28 | 
            -
                  tn = @element.tag_name.downcase
         | 
| 26 | 
            +
                  tn = tag_name
         | 
| 29 27 |  | 
| 30 28 | 
             
                  case tn
         | 
| 31 29 | 
             
                  when 'input'
         | 
| 32 | 
            -
                     | 
| 30 | 
            +
                    value
         | 
| 33 31 | 
             
                  when 'button'
         | 
| 34 | 
            -
                     | 
| 32 | 
            +
                    super
         | 
| 35 33 | 
             
                  else
         | 
| 36 34 | 
             
                    raise Exception::Error, "unknown tag name for button: #{tn}"
         | 
| 37 35 | 
             
                  end
         | 
| @@ -17,14 +17,7 @@ module Watir | |
| 17 17 | 
             
                #
         | 
| 18 18 |  | 
| 19 19 | 
             
                def set(bool = true)
         | 
| 20 | 
            -
                   | 
| 21 | 
            -
                  assert_enabled
         | 
| 22 | 
            -
             | 
| 23 | 
            -
                  if @element.selected?
         | 
| 24 | 
            -
                    @element.click unless bool
         | 
| 25 | 
            -
                  else
         | 
| 26 | 
            -
                    @element.click if bool
         | 
| 27 | 
            -
                  end
         | 
| 20 | 
            +
                  set? == bool ? assert_enabled : click
         | 
| 28 21 | 
             
                end
         | 
| 29 22 |  | 
| 30 23 | 
             
                #
         | 
| @@ -34,14 +27,12 @@ module Watir | |
| 34 27 |  | 
| 35 28 | 
             
                def set?
         | 
| 36 29 | 
             
                  assert_exists
         | 
| 37 | 
            -
                  @element.selected?
         | 
| 30 | 
            +
                  element_call { @element.selected? }
         | 
| 38 31 | 
             
                end
         | 
| 39 32 |  | 
| 40 33 | 
             
                #
         | 
| 41 34 | 
             
                # Unsets checkbox.
         | 
| 42 35 | 
             
                #
         | 
| 43 | 
            -
                # Same as +set(false)+
         | 
| 44 | 
            -
                #
         | 
| 45 36 |  | 
| 46 37 | 
             
                def clear
         | 
| 47 38 | 
             
                  set false
         | 
| @@ -60,15 +60,12 @@ module Watir | |
| 60 60 | 
             
                # Returns true if two elements are equal.
         | 
| 61 61 | 
             
                #
         | 
| 62 62 | 
             
                # @example
         | 
| 63 | 
            -
                #   browser. | 
| 63 | 
            +
                #   browser.text_field(:name => "new_user_first_name") == browser.text_field(:name => "new_user_first_name")
         | 
| 64 64 | 
             
                #   #=> true
         | 
| 65 65 | 
             
                #
         | 
| 66 66 |  | 
| 67 67 | 
             
                def ==(other)
         | 
| 68 | 
            -
                   | 
| 69 | 
            -
             | 
| 70 | 
            -
                  assert_exists
         | 
| 71 | 
            -
                  @element == other.wd
         | 
| 68 | 
            +
                  other.kind_of?(self.class) && wd == other.wd
         | 
| 72 69 | 
             
                end
         | 
| 73 70 | 
             
                alias_method :eql?, :==
         | 
| 74 71 |  | 
| @@ -84,7 +81,7 @@ module Watir | |
| 84 81 |  | 
| 85 82 | 
             
                def text
         | 
| 86 83 | 
             
                  assert_exists
         | 
| 87 | 
            -
                  @element.text
         | 
| 84 | 
            +
                  element_call { @element.text }
         | 
| 88 85 | 
             
                end
         | 
| 89 86 |  | 
| 90 87 | 
             
                #
         | 
| @@ -95,7 +92,7 @@ module Watir | |
| 95 92 |  | 
| 96 93 | 
             
                def tag_name
         | 
| 97 94 | 
             
                  assert_exists
         | 
| 98 | 
            -
                  @element.tag_name.downcase
         | 
| 95 | 
            +
                  element_call { @element.tag_name.downcase }
         | 
| 99 96 | 
             
                end
         | 
| 100 97 |  | 
| 101 98 | 
             
                #
         | 
| @@ -104,13 +101,13 @@ module Watir | |
| 104 101 | 
             
                # and may not work at all.
         | 
| 105 102 | 
             
                #
         | 
| 106 103 | 
             
                # @example Click an element
         | 
| 107 | 
            -
                #   element.click
         | 
| 104 | 
            +
                #   browser.element(:name => "new_user_button").click
         | 
| 108 105 | 
             
                #
         | 
| 109 106 | 
             
                # @example Click an element with shift key pressed
         | 
| 110 | 
            -
                #   element.click(:shift)
         | 
| 107 | 
            +
                #   browser.element(:name => "new_user_button").click(:shift)
         | 
| 111 108 | 
             
                #
         | 
| 112 109 | 
             
                # @example Click an element with several modifier keys pressed
         | 
| 113 | 
            -
                #   element.click(:shift, :control)
         | 
| 110 | 
            +
                #   browser.element(:name => "new_user_button").click(:shift, :control)
         | 
| 114 111 | 
             
                #
         | 
| 115 112 | 
             
                # @param [:shift, :alt, :control, :command, :meta] Modifier key(s) to press while clicking.
         | 
| 116 113 | 
             
                #
         | 
| @@ -119,17 +116,19 @@ module Watir | |
| 119 116 | 
             
                  assert_exists
         | 
| 120 117 | 
             
                  assert_enabled
         | 
| 121 118 |  | 
| 122 | 
            -
                   | 
| 123 | 
            -
                     | 
| 119 | 
            +
                  element_call do
         | 
| 120 | 
            +
                    if modifiers.any?
         | 
| 121 | 
            +
                      assert_has_input_devices_for "click(#{modifiers.join ', '})"
         | 
| 124 122 |  | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 128 | 
            -
             | 
| 123 | 
            +
                      action = driver.action
         | 
| 124 | 
            +
                      modifiers.each { |mod| action.key_down mod }
         | 
| 125 | 
            +
                      action.click @element
         | 
| 126 | 
            +
                      modifiers.each { |mod| action.key_up mod }
         | 
| 129 127 |  | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
             | 
| 128 | 
            +
                      action.perform
         | 
| 129 | 
            +
                    else
         | 
| 130 | 
            +
                      @element.click
         | 
| 131 | 
            +
                    end
         | 
| 133 132 | 
             
                  end
         | 
| 134 133 |  | 
| 135 134 | 
             
                  run_checkers
         | 
| @@ -140,14 +139,14 @@ module Watir | |
| 140 139 | 
             
                # Note that browser support may vary.
         | 
| 141 140 | 
             
                #
         | 
| 142 141 | 
             
                # @example
         | 
| 143 | 
            -
                #   browser. | 
| 142 | 
            +
                #   browser.element(:name => "new_user_button").double_click
         | 
| 144 143 | 
             
                #
         | 
| 145 144 |  | 
| 146 145 | 
             
                def double_click
         | 
| 147 146 | 
             
                  assert_exists
         | 
| 148 147 | 
             
                  assert_has_input_devices_for :double_click
         | 
| 149 148 |  | 
| 150 | 
            -
                  driver.action.double_click(@element).perform
         | 
| 149 | 
            +
                  element_call { driver.action.double_click(@element).perform }
         | 
| 151 150 | 
             
                  run_checkers
         | 
| 152 151 | 
             
                end
         | 
| 153 152 |  | 
| @@ -156,14 +155,14 @@ module Watir | |
| 156 155 | 
             
                # Note that browser support may vary.
         | 
| 157 156 | 
             
                #
         | 
| 158 157 | 
             
                # @example
         | 
| 159 | 
            -
                #   browser. | 
| 158 | 
            +
                #   browser.element(:name => "new_user_button").right_click
         | 
| 160 159 | 
             
                #
         | 
| 161 160 |  | 
| 162 161 | 
             
                def right_click
         | 
| 163 162 | 
             
                  assert_exists
         | 
| 164 163 | 
             
                  assert_has_input_devices_for :right_click
         | 
| 165 164 |  | 
| 166 | 
            -
                  driver.action.context_click(@element).perform
         | 
| 165 | 
            +
                  element_call { driver.action.context_click(@element).perform }
         | 
| 167 166 | 
             
                  run_checkers
         | 
| 168 167 | 
             
                end
         | 
| 169 168 |  | 
| @@ -172,14 +171,14 @@ module Watir | |
| 172 171 | 
             
                # Note that browser support may vary.
         | 
| 173 172 | 
             
                #
         | 
| 174 173 | 
             
                # @example
         | 
| 175 | 
            -
                #   browser. | 
| 174 | 
            +
                #   browser.element(:name => "new_user_button").hover
         | 
| 176 175 | 
             
                #
         | 
| 177 176 |  | 
| 178 177 | 
             
                def hover
         | 
| 179 178 | 
             
                  assert_exists
         | 
| 180 179 | 
             
                  assert_has_input_devices_for :hover
         | 
| 181 180 |  | 
| 182 | 
            -
                  driver.action.move_to(@element).perform
         | 
| 181 | 
            +
                  element_call { driver.action.move_to(@element).perform }
         | 
| 183 182 | 
             
                end
         | 
| 184 183 |  | 
| 185 184 | 
             
                #
         | 
| @@ -187,9 +186,9 @@ module Watir | |
| 187 186 | 
             
                # Note that browser support may vary.
         | 
| 188 187 | 
             
                #
         | 
| 189 188 | 
             
                # @example
         | 
| 190 | 
            -
                # | 
| 191 | 
            -
                # | 
| 192 | 
            -
                # | 
| 189 | 
            +
                #   a = browser.div(:id => "draggable")
         | 
| 190 | 
            +
                #   b = browser.div(:id => "droppable")
         | 
| 191 | 
            +
                #   a.drag_and_drop_on b
         | 
| 193 192 | 
             
                #
         | 
| 194 193 |  | 
| 195 194 | 
             
                def drag_and_drop_on(other)
         | 
| @@ -197,9 +196,11 @@ module Watir | |
| 197 196 | 
             
                  assert_exists
         | 
| 198 197 | 
             
                  assert_has_input_devices_for :drag_and_drop_on
         | 
| 199 198 |  | 
| 200 | 
            -
                   | 
| 201 | 
            -
             | 
| 202 | 
            -
             | 
| 199 | 
            +
                  element_call do
         | 
| 200 | 
            +
                    driver.action.
         | 
| 201 | 
            +
                           drag_and_drop(@element, other.wd).
         | 
| 202 | 
            +
                           perform
         | 
| 203 | 
            +
                  end
         | 
| 203 204 | 
             
                end
         | 
| 204 205 |  | 
| 205 206 | 
             
                #
         | 
| @@ -207,7 +208,7 @@ module Watir | |
| 207 208 | 
             
                # Note that browser support may vary.
         | 
| 208 209 | 
             
                #
         | 
| 209 210 | 
             
                # @example
         | 
| 210 | 
            -
                # | 
| 211 | 
            +
                #   browser.div(:id => "draggable").drag_and_drop_by 100, -200
         | 
| 211 212 | 
             
                #
         | 
| 212 213 | 
             
                # @param [Fixnum] right_by
         | 
| 213 214 | 
             
                # @param [Fixnum] down_by
         | 
| @@ -217,16 +218,18 @@ module Watir | |
| 217 218 | 
             
                  assert_exists
         | 
| 218 219 | 
             
                  assert_has_input_devices_for :drag_and_drop_by
         | 
| 219 220 |  | 
| 220 | 
            -
                   | 
| 221 | 
            -
             | 
| 222 | 
            -
             | 
| 221 | 
            +
                  element_call do
         | 
| 222 | 
            +
                    driver.action.
         | 
| 223 | 
            +
                           drag_and_drop_by(@element, right_by, down_by).
         | 
| 224 | 
            +
                           perform
         | 
| 225 | 
            +
                  end
         | 
| 223 226 | 
             
                end
         | 
| 224 227 |  | 
| 225 228 | 
             
                #
         | 
| 226 229 | 
             
                # Flashes (change background color far a moment) element.
         | 
| 227 230 | 
             
                #
         | 
| 228 231 | 
             
                # @example
         | 
| 229 | 
            -
                # | 
| 232 | 
            +
                #   browser.text_field(:name => "new_user_first_name").flash
         | 
| 230 233 | 
             
                #
         | 
| 231 234 |  | 
| 232 235 | 
             
                def flash
         | 
| @@ -250,44 +253,40 @@ module Watir | |
| 250 253 | 
             
                #
         | 
| 251 254 |  | 
| 252 255 | 
             
                def value
         | 
| 253 | 
            -
                   | 
| 254 | 
            -
             | 
| 255 | 
            -
                   | 
| 256 | 
            -
                    @element.attribute('value') || ''
         | 
| 257 | 
            -
                  rescue Selenium::WebDriver::Error::InvalidElementStateError
         | 
| 258 | 
            -
                    ""
         | 
| 259 | 
            -
                  end
         | 
| 256 | 
            +
                  attribute_value('value') || ''
         | 
| 257 | 
            +
                rescue Selenium::WebDriver::Error::InvalidElementStateError
         | 
| 258 | 
            +
                  ''
         | 
| 260 259 | 
             
                end
         | 
| 261 260 |  | 
| 262 261 | 
             
                #
         | 
| 263 262 | 
             
                # Returns given attribute value of element.
         | 
| 264 263 | 
             
                #
         | 
| 265 264 | 
             
                # @example
         | 
| 266 | 
            -
                #   browser.a(:id => " | 
| 267 | 
            -
                #   #=> " | 
| 265 | 
            +
                #   browser.a(:id => "link_2").attribute_value "title"
         | 
| 266 | 
            +
                #   #=> "link_title_2"
         | 
| 268 267 | 
             
                #
         | 
| 269 268 | 
             
                # @param [String] attribute_name
         | 
| 270 | 
            -
                # @return [String]
         | 
| 269 | 
            +
                # @return [String, nil]
         | 
| 271 270 | 
             
                #
         | 
| 272 271 |  | 
| 273 272 | 
             
                def attribute_value(attribute_name)
         | 
| 274 273 | 
             
                  assert_exists
         | 
| 275 | 
            -
                  @element.attribute attribute_name
         | 
| 274 | 
            +
                  element_call { @element.attribute attribute_name }
         | 
| 276 275 | 
             
                end
         | 
| 277 276 |  | 
| 278 277 | 
             
                #
         | 
| 279 278 | 
             
                # Returns outer (inner + element itself) HTML code of element.
         | 
| 280 279 | 
             
                #
         | 
| 281 280 | 
             
                # @example
         | 
| 282 | 
            -
                #   browser.div(:id =>  | 
| 283 | 
            -
                #   #=> "<div id=\"foo\"><a> | 
| 281 | 
            +
                #   browser.div(:id => 'foo').outer_html
         | 
| 282 | 
            +
                #   #=> "<div id=\"foo\"><a href=\"#\">hello</a></div>"
         | 
| 284 283 | 
             
                #
         | 
| 285 284 | 
             
                # @return [String]
         | 
| 286 285 | 
             
                #
         | 
| 287 286 |  | 
| 288 287 | 
             
                def outer_html
         | 
| 289 288 | 
             
                  assert_exists
         | 
| 290 | 
            -
                  execute_atom(:getOuterHtml, @element).strip
         | 
| 289 | 
            +
                  element_call { execute_atom(:getOuterHtml, @element) }.strip
         | 
| 291 290 | 
             
                end
         | 
| 292 291 |  | 
| 293 292 | 
             
                alias_method :html, :outer_html
         | 
| @@ -296,29 +295,30 @@ module Watir | |
| 296 295 | 
             
                # Returns inner HTML code of element.
         | 
| 297 296 | 
             
                #
         | 
| 298 297 | 
             
                # @example
         | 
| 299 | 
            -
                #   browser.div(:id =>  | 
| 300 | 
            -
                #   #=> "<a> | 
| 298 | 
            +
                #   browser.div(:id => 'foo').inner_html
         | 
| 299 | 
            +
                #   #=> "<a href=\"#\">hello</a>"
         | 
| 301 300 | 
             
                #
         | 
| 302 301 | 
             
                # @return [String]
         | 
| 303 302 | 
             
                #
         | 
| 304 303 |  | 
| 305 304 | 
             
                def inner_html
         | 
| 306 305 | 
             
                  assert_exists
         | 
| 307 | 
            -
                  execute_atom(:getInnerHtml, @element).strip
         | 
| 306 | 
            +
                  element_call { execute_atom(:getInnerHtml, @element) }.strip
         | 
| 308 307 | 
             
                end
         | 
| 309 308 |  | 
| 310 309 | 
             
                #
         | 
| 311 310 | 
             
                # Sends sequence of keystrokes to element.
         | 
| 312 311 | 
             
                #
         | 
| 313 312 | 
             
                # @example
         | 
| 314 | 
            -
                #   browser. | 
| 313 | 
            +
                #   browser.text_field(:name => "new_user_first_name").send_keys "Watir", :return
         | 
| 315 314 | 
             
                #
         | 
| 316 315 | 
             
                # @param [String, Symbol] *args
         | 
| 317 316 | 
             
                #
         | 
| 318 317 |  | 
| 319 318 | 
             
                def send_keys(*args)
         | 
| 320 319 | 
             
                  assert_exists
         | 
| 321 | 
            -
                   | 
| 320 | 
            +
                  assert_writable
         | 
| 321 | 
            +
                  element_call { @element.send_keys(*args) }
         | 
| 322 322 | 
             
                end
         | 
| 323 323 |  | 
| 324 324 | 
             
                #
         | 
| @@ -330,7 +330,7 @@ module Watir | |
| 330 330 |  | 
| 331 331 | 
             
                def focus
         | 
| 332 332 | 
             
                  assert_exists
         | 
| 333 | 
            -
                  driver.execute_script "return arguments[0].focus()", @element
         | 
| 333 | 
            +
                  element_call { driver.execute_script "return arguments[0].focus()", @element }
         | 
| 334 334 | 
             
                end
         | 
| 335 335 |  | 
| 336 336 | 
             
                #
         | 
| @@ -341,7 +341,7 @@ module Watir | |
| 341 341 |  | 
| 342 342 | 
             
                def focused?
         | 
| 343 343 | 
             
                  assert_exists
         | 
| 344 | 
            -
                  @element == driver.switch_to.active_element
         | 
| 344 | 
            +
                  element_call { @element == driver.switch_to.active_element }
         | 
| 345 345 | 
             
                end
         | 
| 346 346 |  | 
| 347 347 | 
             
                #
         | 
| @@ -349,9 +349,9 @@ module Watir | |
| 349 349 | 
             
                # Note that you may omit "on" from event name.
         | 
| 350 350 | 
             
                #
         | 
| 351 351 | 
             
                # @example
         | 
| 352 | 
            -
                #   browser. | 
| 353 | 
            -
                #   browser. | 
| 354 | 
            -
                #   browser. | 
| 352 | 
            +
                #   browser.button(:name => "new_user_button").fire_event :click
         | 
| 353 | 
            +
                #   browser.button(:name => "new_user_button").fire_event "mousemove"
         | 
| 354 | 
            +
                #   browser.button(:name => "new_user_button").fire_event "onmouseover"
         | 
| 355 355 | 
             
                #
         | 
| 356 356 | 
             
                # @param [String, Symbol] event_name
         | 
| 357 357 | 
             
                #
         | 
| @@ -360,7 +360,7 @@ module Watir | |
| 360 360 | 
             
                  assert_exists
         | 
| 361 361 | 
             
                  event_name = event_name.to_s.sub(/^on/, '').downcase
         | 
| 362 362 |  | 
| 363 | 
            -
                  execute_atom :fireEvent, @element, event_name
         | 
| 363 | 
            +
                  element_call { execute_atom :fireEvent, @element, event_name }
         | 
| 364 364 | 
             
                end
         | 
| 365 365 |  | 
| 366 366 | 
             
                #
         | 
| @@ -370,7 +370,7 @@ module Watir | |
| 370 370 | 
             
                def parent
         | 
| 371 371 | 
             
                  assert_exists
         | 
| 372 372 |  | 
| 373 | 
            -
                  e = execute_atom :getParentElement, @element
         | 
| 373 | 
            +
                  e = element_call { execute_atom :getParentElement, @element }
         | 
| 374 374 |  | 
| 375 375 | 
             
                  if e.kind_of?(Selenium::WebDriver::Element)
         | 
| 376 376 | 
             
                    Watir.element_class_for(e.tag_name.downcase).new(@parent, :element => e)
         | 
| @@ -402,7 +402,7 @@ module Watir | |
| 402 402 |  | 
| 403 403 | 
             
                def visible?
         | 
| 404 404 | 
             
                  assert_exists
         | 
| 405 | 
            -
                  @element.displayed?
         | 
| 405 | 
            +
                  element_call { @element.displayed? }
         | 
| 406 406 | 
             
                end
         | 
| 407 407 |  | 
| 408 408 | 
             
                #
         | 
| @@ -414,7 +414,7 @@ module Watir | |
| 414 414 |  | 
| 415 415 | 
             
                def present?
         | 
| 416 416 | 
             
                  exists? && visible?
         | 
| 417 | 
            -
                rescue Selenium::WebDriver::Error:: | 
| 417 | 
            +
                rescue Selenium::WebDriver::Error::StaleElementReferenceError, UnknownObjectException
         | 
| 418 418 | 
             
                  # if the element disappears between the exists? and visible? calls,
         | 
| 419 419 | 
             
                  # consider it not present.
         | 
| 420 420 | 
             
                  false
         | 
| @@ -424,10 +424,8 @@ module Watir | |
| 424 424 | 
             
                # Returns given style property of this element.
         | 
| 425 425 | 
             
                #
         | 
| 426 426 | 
             
                # @example
         | 
| 427 | 
            -
                #   browser. | 
| 428 | 
            -
                #   #=> " | 
| 429 | 
            -
                #   browser.a(:id => "foo").style "display"
         | 
| 430 | 
            -
                #   #=> "block"
         | 
| 427 | 
            +
                #   browser.button(:value => "Delete").style           #=> "border: 4px solid red;"
         | 
| 428 | 
            +
                #   browser.button(:value => "Delete").style("border") #=> "4px solid red"
         | 
| 431 429 | 
             
                #
         | 
| 432 430 | 
             
                # @param [String] property
         | 
| 433 431 | 
             
                # @return [String]
         | 
| @@ -436,7 +434,7 @@ module Watir | |
| 436 434 | 
             
                def style(property = nil)
         | 
| 437 435 | 
             
                  if property
         | 
| 438 436 | 
             
                    assert_exists
         | 
| 439 | 
            -
                    @element.style property
         | 
| 437 | 
            +
                    element_call { @element.style property }
         | 
| 440 438 | 
             
                  else
         | 
| 441 439 | 
             
                    attribute_value("style").to_s.strip
         | 
| 442 440 | 
             
                  end
         | 
| @@ -497,39 +495,35 @@ module Watir | |
| 497 495 | 
             
              protected
         | 
| 498 496 |  | 
| 499 497 | 
             
                def assert_exists
         | 
| 500 | 
            -
                   | 
| 501 | 
            -
                    assert_not_stale
         | 
| 502 | 
            -
             | 
| 498 | 
            +
                  begin
         | 
| 499 | 
            +
                    assert_not_stale if @element ||= @selector[:element]
         | 
| 500 | 
            +
                  rescue UnknownObjectException => ex
         | 
| 501 | 
            +
                    raise ex if @selector[:element] || !Watir.always_locate?
         | 
| 503 502 | 
             
                  end
         | 
| 504 503 |  | 
| 505 | 
            -
                  @element  | 
| 506 | 
            -
             | 
| 507 | 
            -
                  if @element
         | 
| 508 | 
            -
                    assert_not_stale
         | 
| 509 | 
            -
                  else
         | 
| 510 | 
            -
                    @element = locate
         | 
| 504 | 
            +
                  @element ||= locate
         | 
| 511 505 |  | 
| 512 | 
            -
             | 
| 513 | 
            -
             | 
| 514 | 
            -
                    end
         | 
| 506 | 
            +
                  unless @element
         | 
| 507 | 
            +
                    raise UnknownObjectException, "unable to locate element, using #{selector_string}"
         | 
| 515 508 | 
             
                  end
         | 
| 516 509 | 
             
                end
         | 
| 517 510 |  | 
| 518 511 | 
             
                def assert_not_stale
         | 
| 512 | 
            +
                  @parent.assert_not_stale
         | 
| 513 | 
            +
                  @parent.switch_to! if @parent.is_a? IFrame
         | 
| 519 514 | 
             
                  @element.enabled? # do a staleness check - any wire call will do.
         | 
| 520 515 | 
             
                rescue Selenium::WebDriver::Error::ObsoleteElementError => ex
         | 
| 521 516 | 
             
                  # don't cache a stale element - it will never come back
         | 
| 522 | 
            -
                   | 
| 517 | 
            +
                  reset!
         | 
| 523 518 | 
             
                  raise UnknownObjectException, "#{ex.message} - #{selector_string}"
         | 
| 524 519 | 
             
                end
         | 
| 525 520 |  | 
| 526 521 | 
             
                def reset!
         | 
| 527 | 
            -
                  @parent.reset!
         | 
| 528 522 | 
             
                  @element = nil
         | 
| 529 523 | 
             
                end
         | 
| 530 524 |  | 
| 531 525 | 
             
                def locate
         | 
| 532 | 
            -
                  @parent.assert_exists
         | 
| 526 | 
            +
                  @parent.is_a?(IFrame) ? @parent.switch_to! : @parent.assert_exists
         | 
| 533 527 | 
             
                  locator_class.new(@parent.wd, @selector, self.class.attribute_list).locate
         | 
| 534 528 | 
             
                end
         | 
| 535 529 |  | 
| @@ -545,11 +539,15 @@ module Watir | |
| 545 539 |  | 
| 546 540 | 
             
                def attribute?(attribute)
         | 
| 547 541 | 
             
                  assert_exists
         | 
| 548 | 
            -
                   | 
| 542 | 
            +
                  element_call do
         | 
| 543 | 
            +
                    !!execute_atom(:getAttribute, @element, attribute.to_s.downcase)
         | 
| 544 | 
            +
                  end
         | 
| 549 545 | 
             
                end
         | 
| 550 546 |  | 
| 551 547 | 
             
                def assert_enabled
         | 
| 552 | 
            -
                   | 
| 548 | 
            +
                  unless element_call { @element.enabled? }
         | 
| 549 | 
            +
                    raise ObjectDisabledException, "object is disabled #{selector_string}"
         | 
| 550 | 
            +
                  end
         | 
| 553 551 | 
             
                end
         | 
| 554 552 |  | 
| 555 553 | 
             
                def assert_writable
         | 
| @@ -572,6 +570,15 @@ module Watir | |
| 572 570 | 
             
                  end
         | 
| 573 571 | 
             
                end
         | 
| 574 572 |  | 
| 573 | 
            +
                def element_call
         | 
| 574 | 
            +
                  yield
         | 
| 575 | 
            +
                rescue Selenium::WebDriver::Error::StaleElementReferenceError
         | 
| 576 | 
            +
                  raise unless Watir.always_locate?
         | 
| 577 | 
            +
                  reset!
         | 
| 578 | 
            +
                  assert_exists
         | 
| 579 | 
            +
                  retry
         | 
| 580 | 
            +
                end
         | 
| 581 | 
            +
             | 
| 575 582 | 
             
                def method_missing(meth, *args, &blk)
         | 
| 576 583 | 
             
                  method = meth.to_s
         | 
| 577 584 | 
             
                  if method =~ ElementLocator::WILDCARD_ATTRIBUTE
         |